@
套路如下:
1、定義硬件信息結構體
namePs_Config *Config;
2、定義驅動信息結構體
namePs name_Ps;
3、根據設備號和自動生成的硬件.c文件,獲取外設硬件信息
Config = namePs_LookupConfig(DEVICE_ID); //uart0、SD0都是0,uart1、SD1都是1
4、調用外設初始化函數對name_Ps賦值,后期就只需用name_Ps進行各種操作了!
Status = namePs_CfgInitialize(&name_Ps, Config, Config->BaseAddress);
if (Status != XST_SUCCESS)
{
return XST_FAILURE;
}
5、這一步不同外設就不同了:調用配置函數對外設進行配置,例如uart就設置波特率等,MIO就設置輸入輸出等。。。
UART 串口
ZYNQ使用的UART1,在PL中使能。使用時想在PS改下串口波特率,發現代碼中沒有串口初始化函數。
BSP中有串口初始化函數,是以中斷方式初始化的,但是沒有調用。
int UartPDSA_Initiation(XScuGic *IntcInstPtr, XUartPDSA *xptrUartRs232, u16 DeviceId, u16 UartIntrId)
后使用如下代碼,加在main()函數中即可改變波特率:
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);//寫入想用的波特率
是PL完成了串口初始化?SDK 的BSP完成的初始化?
偶然在官方例程發現:UART被bootrom初始化完成:
GPIO之 MIO控制 LED
MIO0、7、8接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;
}