さまざまな周辺機器のドライバー(UART、I2C、MIO、SDなどはすべて周辺機器と見なされます)
ルーチンは次のとおりです。
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;
}