ZYNQドライバー初期化ルーチン--UARTシリアルポート

さまざまな周辺機器のドライバー(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;
}

おすすめ

転載: blog.csdn.net/LIU944602965/article/details/110236345