Rutina de inicialización del controlador ZYNQ: puerto serie UART

Los controladores de varios periféricos (UART, I2C, MIO, SD, etc. se consideran periféricos)

La rutina es la siguiente:

1. Definir la estructura de información del hardware

namePs_Config *Config;

2. Definir la estructura de información de la unidad.

namePs name_Ps;

3. Obtenga información de hardware periférico de acuerdo con el número de dispositivo y el archivo .c de hardware generado automáticamente

Config = namePs_LookupConfig(DEVICE_ID); //uart0、SD0都是0,uart1、SD1都是1

4. Llame a la función de inicialización de periféricos para asignar los name_Ps, y luego solo necesita usar los name_Ps para realizar varias operaciones.

Status = namePs_CfgInitialize(&name_Ps, Config, Config->BaseAddress);
if (Status != XST_SUCCESS)
{
    
    
	return XST_FAILURE;
}

5. Este paso es diferente para diferentes periféricos: llame a la función de configuración para configurar los periféricos, por ejemplo, uart establece la velocidad en baudios, etc., y MIO establece la entrada y la salida. . .

Puerto serie UART

UART1 utilizado por ZYNQ está habilitado en PL. Quiero cambiar la velocidad en baudios del puerto serie en la PS cuando lo uso, y descubrí que no hay una función de inicialización del puerto serie en el código.

Hay una función de inicialización de puerto serie en el BSP, que se inicializa en modo de interrupción, pero no se llama.

int UartPDSA_Initiation(XScuGic *IntcInstPtr, XUartPDSA *xptrUartRs232, u16 DeviceId, u16 UartIntrId)

Luego use el siguiente código y agréguelo a la función main () para cambiar la velocidad en baudios:

XUartPs_Config *Config;
XUartPs Uart_Ps;
Config = XUartPs_LookupConfig(1);//UART0写0,UART1写1
if (NULL == Config) 
{
    
    
	return XST_FAILURE;
}

Status = XUartPs_CfgInitialize(&Uart_Ps, Config, Config->BaseAddress);
if (Status != XST_SUCCESS)
{
    
    
	return XST_FAILURE;
}

XUartPs_SetBaudRate(&Uart_Ps, 128000);//写入想用的波特率

¿El PL ha completado la inicialización del puerto serie? ¿Cuál es la inicialización realizada por SDK BSP?

Encontrado accidentalmente en la rutina oficial: UART fue inicializado por bootrom:
Inserte la descripción de la imagen aquí


LED de control MIO de GPIO

MIO0, 7, 8 se conectan a luces LED

#include "xparameters.h" //器件参数信息
#include "xstatus.h"     //包含XST_FAILURE和XST_SUCCESS的宏定义
#include "xil_printf.h"  //包含print()函数
#include "xgpiops.h"     //包含PS GPIO的函数声明
#include "sleep.h"       //包含sleep()函数

//宏定义GPIO_DEVICE_ID
#define GPIO_DEVICE_ID      XPAR_XGPIOPS_0_DEVICE_ID
//连接到MIO的LED
 #define MIOLED0    7     //连接到MIO7
 #define MIOLED1    8     //连接到MIO8
 #define MIOLED2    0     //连接到MIO0
 
 XGpioPs Gpio;            // GPIO设备的驱动程序实例
 
 int main()
 {
    
    
     int Status;
     XGpioPs_Config *ConfigPtr;
 
     print("MIO Test! \n\r");
     ConfigPtr = XGpioPs_LookupConfig(GPIO_DEVICE_ID);
     Status = XGpioPs_CfgInitialize(&Gpio, ConfigPtr,
                     ConfigPtr->BaseAddr);
     if (Status != XST_SUCCESS){
    
    
         return XST_FAILURE;
     }
     //设置指定引脚的方向:0输入,1输出
     XGpioPs_SetDirectionPin(&Gpio, MIOLED0, 1);
     XGpioPs_SetDirectionPin(&Gpio, MIOLED1, 1);
     XGpioPs_SetDirectionPin(&Gpio, MIOLED2, 1);
     //使能指定引脚输出:0禁止输出使能,1使能输出
     XGpioPs_SetOutputEnablePin(&Gpio, MIOLED0, 1);
     XGpioPs_SetOutputEnablePin(&Gpio, MIOLED1, 1);
     XGpioPs_SetOutputEnablePin(&Gpio, MIOLED2, 1);
 
     while (1) {
    
    
         XGpioPs_WritePin(&Gpio, MIOLED0, 0x0); //向指定引脚写入数据:0或1
         XGpioPs_WritePin(&Gpio, MIOLED1, 0x0);
         XGpioPs_WritePin(&Gpio, MIOLED2, 0x0);
         sleep(1);                              //延时1秒
         XGpioPs_WritePin(&Gpio, MIOLED0, 0x1);
         XGpioPs_WritePin(&Gpio, MIOLED1, 0x1);
         XGpioPs_WritePin(&Gpio, MIOLED2, 0x1);
        sleep(1);
    }
    return XST_SUCCESS;
}

Supongo que te gusta

Origin blog.csdn.net/LIU944602965/article/details/110236345
Recomendado
Clasificación