SDK中一些函數的筆記


https://www.cnblogs.com/pure-z/p/12606551.html 

一、GPIO

庫函數:#include "xgpiops.h"

1、XGpioPs_LookupConfig(u16 DeviceId)   

@param DeviceId是要查找的設備的唯一設備ID。

@return 指向與給定設備ID對應的配置表條目的指針;如果找不到匹配項,則為NULL。

@note u16:無符號16位

 

2、XGpioPs_CfgInitialize(XGpioPs *InstancePtr, XGpioPs_Config *ConfigPtr, u32 EffectiveAddr)

@param InstancePtr是指向XGpioPs實例的指針。

@param ConfigPtr指向XGpioPs設備配置結構

@param EffectiveAddr是虛擬內存地址空間中的設備基地址。如果不使用地址轉換,則應傳遞物理地址。如果在調用此函數后更改了地址映射,則可能會發生意外錯誤

@return XST_SUCCESS always.

 

3、XGpioPs_SetDirectionPin(XGpioPs *InstancePtr, u32 Pin, u32 Direction)

@param InstancePtr是指向XGpioPs實例的指針。

@param 引腳是要寫入數據的引腳號.Zynq中的有效值為0-117

@param 方向是指定引腳的方向,輸入方向的有效值為0,輸出方向的有效值為1。

 @return None.

 

 4、XGpioPs_SetOutputEnablePin(XGpioPs *InstancePtr, u32 Pin, u32 OpEnable)

@param InstancePtr是指向XGpioPs實例的指針。

@param 引腳是要寫入數據的引腳號.Zynq中的有效值為0-117

@param OpEnable指定是否應啟用指定引腳的輸出使能。有效值是0(禁用輸出使能),1(啟用輸出使能)。

@return None.

 

5、XGpioPs_WritePin(XGpioPs *InstancePtr, u32 Pin, u32 Data)

@param InstancePtr是指向XGpioPs實例的指針。

@param 引腳是要寫入數據的引腳號.Zynq中的有效值為0-117

@param 數據是要寫入指定引腳(0或1)的數據。

 @return None.

 

6、XGpioPs_ReadPin(XGpioPs *InstancePtr, u32 Pin)

@param InstancePtr是指向XGpioPs實例的指針。

@param 引腳是要寫入數據的引腳號.Zynq中的有效值為0-117,有關庫中引腳號的映射,請參見xgpiops.h。

@return 引腳的當前值(0或1)。

@note 該功能用於讀取指定GPIO引腳的狀態。

 

用PL按鍵控制PS端LED代碼示例

 1 #include "stdio.h"
 2 #include "xparameters.h"
 3 #include "xgpiops.h"
 4 
 5 #define GPIOPS_ID XPAR_XGPIOPS_0_DEVICE_ID   //PS端  GPIO器件 ID
 6 
 7 #define MIO_LED0 7   //PS_LED0 連接到 MIO7
 8 #define EMIO_KEY 54  //PL_KEY0 連接到EMIO0
 9 
10 int main()
11 {
12     u32 key_value;
13     printf("EMIO TEST!\n");
14 
15     XGpioPs gpiops_inst;            //PS端 GPIO 驅動實例
16     XGpioPs_Config *gpiops_cfg_ptr; //PS端 GPIO 配置信息
17 
18     //根據器件ID查找配置信息
19     gpiops_cfg_ptr = XGpioPs_LookupConfig(GPIOPS_ID);
20     //初始化器件驅動
21     XGpioPs_CfgInitialize(&gpiops_inst, gpiops_cfg_ptr, gpiops_cfg_ptr->BaseAddr);
22 
23     //設置LED為輸出
24     XGpioPs_SetDirectionPin(&gpiops_inst, MIO_LED0, 1);
25     //使能LED輸出
26     XGpioPs_SetOutputEnablePin(&gpiops_inst, MIO_LED0, 1);
27     //設置KEY為輸入
28     XGpioPs_SetDirectionPin(&gpiops_inst, EMIO_KEY, 0);
29 
30     //讀取按鍵狀態,用於控制LED亮滅
31     while(1)
32     {
33         //讀取按鍵的狀態
34         key_value = XGpioPs_ReadPin(&gpiops_inst, EMIO_KEY);
35         //將按鍵的狀態寫入LED
36         XGpioPs_WritePin(&gpiops_inst, MIO_LED0,~key_value);
37     }
38 
39     return 0;
40 }
View Code

 

二、中斷

1、SetupInterruptSystem(XScuGic *GicInstancePtr, XGpioPs *Gpio,u16 GpioItrId)

自定義函數

@param GicInstancePtr是一個指向XScuGic驅動實例的指針

@param gpio是一個指向連接到中斷的GPIO組件實例的指針

@param GpioIntrId是Gpio中斷ID

@return 如果成功返回XST_SUCCESS, 否則返回XST_FAILURE

 1 static int SetupInterruptSystem(XScuGic *GicInstancePtr, XGpioPs *Gpio,
 2                 u16 GpioIntrId)
 3 {
 4     int Status;
 5 
 6     XScuGic_Config *IntcConfig; /* Instance of the interrupt controller */
 7 
 8     Xil_ExceptionInit();
 9 
10     /*
11      * Initialize the interrupt controller driver so that it is ready to
12      * use.
13      */
14     IntcConfig = XScuGic_LookupConfig(INTC_DEVICE_ID);
15     if (NULL == IntcConfig) {
16         return XST_FAILURE;
17     }
18 
19     Status = XScuGic_CfgInitialize(GicInstancePtr, IntcConfig,
20                     IntcConfig->CpuBaseAddress);
21     if (Status != XST_SUCCESS) {
22         return XST_FAILURE;
23     }
24 
25 
26     /*
27      * Connect the interrupt controller interrupt handler to the hardware
28      * interrupt handling logic in the processor.
29      */
30     Xil_ExceptionRegisterHandler(XIL_EXCEPTION_ID_INT,
31                 (Xil_ExceptionHandler)XScuGic_InterruptHandler,
32                 GicInstancePtr);
33 
34     /*
35      * Connect the device driver handler that will be called when an
36      * interrupt for the device occurs, the handler defined above performs
37      * the specific interrupt processing for the device.
38      */
39     Status = XScuGic_Connect(GicInstancePtr, GpioIntrId,
40                 (Xil_ExceptionHandler)XGpioPs_IntrHandler,
41                 (void *)Gpio);
42     if (Status != XST_SUCCESS) {
43         return Status;
44     }
45 
46     /* Enable falling edge interrupts for all the pins in bank 0. */
47     XGpioPs_SetIntrType(Gpio, GPIO_BANK, 0x00, 0xFFFFFFFF, 0x00);
48 
49     /* Set the handler for gpio interrupts. */
50     XGpioPs_SetCallbackHandler(Gpio, (void *)Gpio, IntrHandler);
51 
52 
53     /* Enable the GPIO interrupts of Bank 0. */
54     XGpioPs_IntrEnable(Gpio, GPIO_BANK, (1 << Input_Pin));
55 
56 
57     /* Enable the interrupt for the GPIO device. */
58     XScuGic_Enable(GicInstancePtr, GpioIntrId);
59 
60 
61     /* Enable interrupts in the Processor. */
62     Xil_ExceptionEnableMask(XIL_EXCEPTION_IRQ);
63 
64     return XST_SUCCESS;
65 }
SetupInterruptSystem函數定義

 2、XScuGic_Config *XScuGic_LookupConfig(u16 DeviceId)

@param DeviceId是設備的唯一標識符。

@return 指向指定設備的XScuGic配置結構的指針,如果找不到該設備,則為NULL。

3、XScuGic_CfgInitialize(XScuGic *InstancePtr,XScuGic_Config *ConfigPtr,u32 EffectiveAddr)

@param InstancePtr是指向XScuGic實例的指針

@param ConfigPtr是指向與此驅動程序關聯的特定設備的配置表的指針。

@param EffectiveAddr是虛擬內存地址空間中的設備基地址。一旦調用此函數,調用者負責保持從EffectiveAddr到設備物理基址的地址映射不變。如果在調用此函數后地址映射發生更改,可能會發生意外錯誤。如果不使用地址轉換,則對此參數使用Config-> BaseAddress,而是傳遞物理地址。

@return XST_SUCCESS,如果初始化成功

4、Xil_ExceptionInit(void)

@brief 該函數是一個通用API,用於在所有受支持的ARM處理器之間初始化異常處理程序。對於ARM Cortex-A53,Cortex-R5和Cortex-A9,異常處理程序是靜態初始化的,並且此功能無法執行任何操作。但是,它仍然可以解決向后兼容性問題(在早期版本的BSP中,此API用於初始化異常處理程序)。

5、void Xil_ExceptionRegisterHandler(u32 Exception_id,Xil_ExceptionHandler Handler,void *Data)

 @brief 注冊用於特定異常的處理程序。當處理器遇到指定的異常時,將調用此處理程序

@param exception_id包含異常源的ID,並且應在0到XIL_EXCEPTION_ID_LAST的范圍內。

@param 處理程序到該異常的處理程序。

@param Data是對數據的引用,該數據在調用時將傳遞給Handler。

@return None

6、s32 XScuGic_Connect(XScuGic *InstancePtr, u32 Int_Id,Xil_InterruptHandler Handler, void *CallBackRef)

@brief 在識別中斷時,在中斷源的Int_Id和關聯的處理程序之間建立連接。調用時,此調用中提供的自變量Callbackref用作處理程序的自變量。

@param InstancePtr是指向XScuGic實例的指針。

@param Int_Id包含中斷源的ID,並且應在0到XSCUGIC_MAX_NUM_INTR_INPUTS的范圍內-1

@param處理程序,用於該中斷的處理程序。

@param CallBackRef是回調引用,通常是連接驅動程序的實例指針。

@return XST_SUCCESS,如果處理程序已正確連接。

7、void XGpioPs_SetIntrType(XGpioPs *InstancePtr, u8 Bank, u32 IntrType,u32 IntrPolarity, u32 IntrOnAny)

@brief此功能用於設置中斷類型,中斷極性和指定的GPIO Bank引腳的“任意中斷”。
@param InstancePtr是指向XGpioPs實例的指針。
@param Bank是要操作的GPIO的庫號.Zynq中的有效值為0-3,Zynq Ultrascale + MP中的有效值為0-5。
@param IntrType是中斷類型的32位掩碼.0表示級別敏感,1表示邊緣敏感。
@param IntrPolarity是中斷極性的32位掩碼.0表示低電平有效或下降沿,1表示高電平有效或上升沿。
@param IntrOnAny是邊緣觸發中斷的中斷觸發的32位掩碼。0表示使用配置的中斷極性在單邊沿觸發,1表示在兩個邊沿觸發。
@return None
@note此功能用於設置指定bank中所有引腳的中斷相關屬性。引腳的先前狀態無法保持。要更改單個GPIO引腳的中斷屬性,請使用函數XGpioPs_SetPinIntrType()。

8、void XGpioPs_SetIntrTypePin(XGpioPs *InstancePtr, u32 Pin, u8 IrqType)

@param InstancePtr是指向XGpioPs實例的指針。
@param引腳是要設置IRQ類型的引腳號.Zynq中的有效值為0-117
@param IrqType是GPIO引腳的IRQ類型。使用xgpiops.h中定義的XGPIOPS_IRQ_TYPE_ *來指定IRQ類型。

 9、void XGpioPs_SetCallbackHandler(XGpioPs *InstancePtr, void *CallBackRef,XGpioPs_Handler FuncPointer)

此函數設置狀態回調函數。發生中斷時,XGpioPs_IntrHandler會調用回調函數。
@param InstancePtr是指向XGpioPs實例的指針。
@param CallBackRef是調用回調函數時傳遞回的上層回調引用。
@param FuncPtr是指向回調函數的指針。
@return 無。
@note在中斷上下文中調用該處理程序,因此它應快速完成其工作並將可能耗時的工作排隊到任務級線程中

  1 #include "xparameters.h"
  2 #include "xgpiops.h"
  3 #include "xscugic.h"
  4 #include "xil_exception.h"
  5 #include "xplatform_info.h"
  6 #include <xil_printf.h>
  7 #include "stdio.h"
  8 #include "sleep.h"
  9 /************************** Constant Definitions *****************************/
 10 
 11 //以下常量映射到xparameters.h文件
 12 #define GPIO_DEVICE_ID      XPAR_XGPIOPS_0_DEVICE_ID      //PS端GPIO器件ID
 13 #define INTC_DEVICE_ID      XPAR_SCUGIC_SINGLE_DEVICE_ID  //通用中斷控制器ID
 14 #define GPIO_INTERRUPT_ID   XPAR_XGPIOPS_0_INTR           //PS端GPIO中斷ID,#52
 15 
 16 //定義使用到的MIO引腳號
 17 #define KEY0  12         //KEY0 連接到 MIO12
 18 #define MIO_LED0  0     //LED 連接到 MIO0
 19 
 20 /************************** Function Prototypes ******************************/
 21 void SetupInterruptSystem(XScuGic *GicInstancePtr, XGpioPs *Gpio,u16 GpioIntrId);
 22 void IntrHandler();
 23 
 24 /**************************Global Variable Definitions ***********************/
 25 XGpioPs_Config *gpiops_cfg_ptr; //PS端 GPIO 配置信息
 26 XScuGic_Config *IntcConfig; //中斷控制器實例
 27 
 28 XGpioPs Gpio;   //PS端GPIO驅動實例
 29 XScuGic Intc;   //通用中斷控制器驅動實例
 30 u32 key_press = 0;
 31 
 32 /************************** Function Definitions *****************************/
 33 
 34 
 35 int main()
 36 {
 37     u32 led_value = 0;
 38 
 39     printf("GPIO_MIO_INTERRUPT TEST!\n");
 40 
 41     //根據器件ID查找配置信息
 42     gpiops_cfg_ptr = XGpioPs_LookupConfig(GPIO_DEVICE_ID);
 43     //初始化器件驅動
 44     XGpioPs_CfgInitialize(&Gpio, gpiops_cfg_ptr, gpiops_cfg_ptr->BaseAddr);
 45     //設置LED為輸出
 46     XGpioPs_SetDirectionPin(&Gpio, MIO_LED0, 1);
 47     //使能LED輸出
 48     XGpioPs_SetOutputEnablePin(&Gpio, MIO_LED0, 1);
 49     //設置KEY為輸入
 50     XGpioPs_SetDirectionPin(&Gpio, KEY0, 0);
 51     //設置中斷系統
 52     SetupInterruptSystem(&Intc, &Gpio, GPIO_INTERRUPT_ID);
 53 
 54     while(1)
 55     {
 56         if(key_press)
 57         {
 58             led_value = ~led_value;
 59             key_press = 0;
 60             //清除之前的中斷狀態
 61             XGpioPs_IntrClearPin(&Gpio,KEY0);
 62             //將led_value的值寫入LED
 63             XGpioPs_WritePin(&Gpio, MIO_LED0, led_value);
 64             //延時消抖1s
 65             sleep(1);
 66             //使能中斷
 67             XGpioPs_IntrEnablePin(&Gpio,KEY0);
 68         }
 69     }
 70 
 71     return 0;
 72 }
 73 
 74 void SetupInterruptSystem(XScuGic *GicInstancePtr, XGpioPs *Gpio,u16 GpioIntrId)
 75 {
 76     //查找GIC器件配置信息,並進行初始化
 77     IntcConfig = XScuGic_LookupConfig(INTC_DEVICE_ID);
 78     XScuGic_CfgInitialize(GicInstancePtr, IntcConfig,IntcConfig->CpuBaseAddress);
 79 
 80     //初始化ARM處理器異常句柄
 81     Xil_ExceptionInit();
 82     //給中斷異常注冊一個處理程序
 83     Xil_ExceptionRegisterHandler(XIL_EXCEPTION_ID_INT,
 84                 (Xil_ExceptionHandler)XScuGic_InterruptHandler,
 85                 GicInstancePtr);
 86     //使能處理器中斷
 87     Xil_ExceptionEnableMask(XIL_EXCEPTION_IRQ);
 88 
 89     //關聯需要調用的中斷處理函數
 90     XScuGic_Connect(GicInstancePtr, GpioIntrId,
 91                 (Xil_ExceptionHandler) IntrHandler,
 92                 (void *)Gpio);
 93     //為GPIO器件使能中斷
 94     XScuGic_Enable(GicInstancePtr, GpioIntrId);
 95 
 96     //設置MIO引腳中斷觸發類型:下降沿
 97     XGpioPs_SetIntrTypePin(Gpio, KEY0, XGPIOPS_IRQ_TYPE_EDGE_FALLING);
 98 
 99     //打開MIO引腳中斷使能信號
100     XGpioPs_IntrEnablePin(Gpio,KEY0);
101 
102 }
103 
104 void IntrHandler(){
105     printf("interrupt detected!\n\r");
106     key_press = 1;
107     XGpioPs_IntrDisablePin(&Gpio,KEY0);
108 }
按鍵中斷實例

 三、AXI_GPIO

Xilinx®LogiCORE™IP AXI通用輸入/輸出(GPIO)內核為AXI接口提供了通用輸入/輸出接口。該32位軟IP核旨在與AXI4-Lite接口進行連接。

AXI 協議是一種高性能、高帶寬、低延遲的片內總線,具有如下特點:

1、總線的地址/控制和數據通道是分離的;
2、支持不對齊的數據傳輸;
3、支持突發傳輸,突發傳輸過程中只需要首地址;
4、具有分離的讀/寫數據通道;
5、支持顯著傳輸訪問和亂序訪問;
6、更加容易進行時序收斂。

在數字電路中只能傳輸二進制數0 和1,因此可能需要一組信號才能高效地傳輸信息,這一組信號就組
成了接口。AXI4 協議支持以下三種類型的接口:

1、 AXI4:高性能存儲映射接口。
2、 AXI4-Lite:簡化版的AXI4 接口,用於較少數據量的存儲映射通信。
3、 AXI4-Stream:用於高速數據流傳輸,非存儲映射接口。

  1 /*本章的實驗任務是通過調用 AXI GPIO IP 核,
  2 使用中斷機制,實現領航者底板上PL 端按鍵控制核心板上 PS 端LED 的功能。 */
  3 #include "xparameters.h"
  4 #include "xgpiops.h"            //GPIO函數
  5 #include "xgpio.h"                //AXI GPIO函數
  6 #include "xscugic.h"
  7 #include "xil_exception.h"
  8 #include "stdio.h"
  9 #include "sleep.h"
 10 /************************** Constant Definitions *****************************/
 11 
 12 //以下常量映射到xparameters.h文件
 13 #define GPIO_DEVICE_ID      XPAR_XGPIOPS_0_DEVICE_ID      //PS端GPIO器件ID
 14 #define INTC_DEVICE_ID      XPAR_SCUGIC_SINGLE_DEVICE_ID  //通用中斷控制器ID
 15 #define AXI_GPIO_ID            XPAR_GPIO_0_DEVICE_ID         //AXI_GPIO器件ID
 16 
 17 //PL端GPIO中斷ID,#61
 18 #define AXI_GPIO_INTERRUPT_ID    XPAR_FABRIC_AXI_GPIO_0_IP2INTC_IRPT_INTR
 19 
 20 //定義使用到的MIO引腳號
 21 #define MIO_LED0              0     //LED 連接到 MIO0
 22 #define GPIO_CHANNEL1        1     //AXI_GPIO通道1
 23 /************************** Function Prototypes ******************************/
 24 void SetupInterruptSystem(XScuGic *GicInstancePtr, XGpio *AXI_Gpio,u16 AXI_GpioIntrId);
 25 void IntrHandler();
 26 
 27 /**************************Global Variable Definitions ***********************/
 28 XGpioPs_Config *gpiops_cfg_ptr; //PS端 GPIO 配置信息
 29 XScuGic_Config *IntcConfig; //中斷控制器實例
 30 
 31 XGpioPs Gpio;   //PS端GPIO驅動實例
 32 XScuGic Intc;   //通用中斷控制器驅動實例
 33 XGpio   AXI_Gpio;
 34 u32 key_press = 0;
 35 
 36 /************************** Function Definitions *****************************/
 37 
 38 
 39 int main()
 40 {
 41     u32 led_value = 0;
 42 
 43     printf("AXI_GPIO_INTERRUPT TEST!\n");
 44     //配置PS端GPIO(查找配置,初始化)
 45     gpiops_cfg_ptr = XGpioPs_LookupConfig(GPIO_DEVICE_ID);
 46     XGpioPs_CfgInitialize(&Gpio, gpiops_cfg_ptr, gpiops_cfg_ptr->BaseAddr);
 47 
 48     //AXI_Gpio初始化(此函數已經包含了查找配置)
 49     XGpio_Initialize(&AXI_Gpio, AXI_GPIO_ID);
 50 
 51     //設置PS GPIO(LED)為輸出,並打開輸出使能
 52     XGpioPs_SetDirectionPin(&Gpio, MIO_LED0, 1);
 53     XGpioPs_SetOutputEnablePin(&Gpio, MIO_LED0, 1);
 54 
 55     //設置AXI GPIO
 56     XGpio_SetDataDirection(&AXI_Gpio, GPIO_CHANNEL1,0x00000001);//最低位設置為INPUT,其他位位OUTPUT
 57 
 58     //設置中斷系統
 59     SetupInterruptSystem(&Intc, &AXI_Gpio, AXI_GPIO_INTERRUPT_ID);
 60 
 61     while(1)
 62     {
 63         if(key_press)
 64         {
 65             //判斷當前按鍵的狀態,如果是按鍵按下,則改變狀態
 66             if(XGpio_DiscreteRead(&AXI_Gpio,GPIO_CHANNEL1)== 0)
 67             led_value = ~led_value;
 68             key_press = 0;
 69             //清除之前的中斷狀態
 70             XGpio_InterruptClear(&AXI_Gpio, 0x00000001);
 71             //將led_value的值寫入LED
 72             XGpioPs_WritePin(&Gpio, MIO_LED0, led_value);
 73             //延時消抖1s
 74             sleep(1);
 75             //重新打開通道1中斷使能
 76             XGpio_InterruptEnable(&AXI_Gpio, 0x00000001);
 77         }
 78     }
 79 
 80     return 0;
 81 }
 82 
 83 void SetupInterruptSystem(XScuGic *GicInstancePtr, XGpio *AXI_Gpio,u16 AXI_GpioIntrId)
 84 {
 85     //查找GIC器件配置信息,並進行初始化
 86     IntcConfig = XScuGic_LookupConfig(INTC_DEVICE_ID);
 87     XScuGic_CfgInitialize(GicInstancePtr, IntcConfig,IntcConfig->CpuBaseAddress);
 88 
 89     //初始化ARM處理器異常句柄
 90     Xil_ExceptionInit();
 91     //給中斷異常注冊一個處理程序
 92     Xil_ExceptionRegisterHandler(XIL_EXCEPTION_ID_INT,
 93                 (Xil_ExceptionHandler)XScuGic_InterruptHandler,
 94                 GicInstancePtr);
 95     //使能處理器中斷
 96     Xil_ExceptionEnableMask(XIL_EXCEPTION_IRQ);
 97 
 98     //關聯需要調用的中斷處理函數
 99     XScuGic_Connect(GicInstancePtr, AXI_GpioIntrId,
100                 (Xil_ExceptionHandler) IntrHandler,
101                 (void *)AXI_Gpio);
102     //為AXI_GPIO器件使能中斷
103     XScuGic_Enable(GicInstancePtr, AXI_GpioIntrId);
104 
105     //GicInstancePtr:中斷指針,0xA0:中斷源的優先級,0x1:中斷類型為高有效,電平敏感類型
106     XScuGic_SetPriorityTriggerType(GicInstancePtr, AXI_GpioIntrId,0xA0, 0x1);
107 
108     //打開AXI GPIO IP的中斷使能
109     XGpio_InterruptGlobalEnable(AXI_Gpio);//打開全局中斷使能
110     XGpio_InterruptEnable(AXI_Gpio, 0x00000001);//打開通道中信號對應的中斷使能
111 
112 }
113 
114 void IntrHandler(){
115     printf("interrupt detected!\n\r");
116     key_press = 1;
117     //關閉通道1中斷使能
118     XGpio_InterruptDisable(&AXI_Gpio, 0x00000001);
119 }
AXI_GPIO示例

 四、UART中斷

 1 #include "stdio.h"
 2 #include "xil_printf.h"
 3 #include "xuartps.h"
 4 #include "xscugic.h"
 5 
 6 #define UART_DEVICE_ID    XPAR_XUARTPS_0_DEVICE_ID        //串口設備ID
 7 #define INTC_DEVICE_ID    XPAR_SCUGIC_SINGLE_DEVICE_ID //中斷ID
 8 #define UART_INT_IRQ_ID   XPAR_XUARTPS_0_INTR          //串口中斷ID
 9 
10 XUartPs UartPs ; //串口驅動程序實例
11 XScuGic Intc;  //中斷實例
12 XUartPs_Config *Config;
13 XScuGic_Config *IntcConfig;
14 
15 
16 int uart_init(XUartPs *UartInstPtr,u16 DeviceId)
17 {    
18     int Status;
19     //根據器件ID查找配置信息
20     Config = XUartPs_LookupConfig(DeviceId);
21 
22     //根據配置信息對PS UART進行初始化
23     XUartPs_CfgInitialize(UartInstPtr, Config, Config->BaseAddress);
24 
25     //檢查硬件搭配是否正確
26     Status = XUartPs_SelfTest(UartInstPtr);
27     if (Status != XST_SUCCESS)
28     {
29         return XST_FAILURE;
30     }
31     //設置操作模式,正常模式
32     XUartPs_SetOperMode(UartInstPtr, XUARTPS_OPER_MODE_NORMAL);
33     //設置波特率
34     XUartPs_SetBaudRate(UartInstPtr,115200);
35     //設置RX FIFO觸發閾值,每接收一個數據就觸發中斷
36     XUartPs_SetFifoThreshold(UartInstPtr,1);
37 
38     return XST_SUCCESS;
39 }
40 
41 //UART中斷處理函數
42 void uart_intr_handler(void *call_back_ref)
43 {
44     XUartPs *uart_instance_ptr = (XUartPs *)call_back_ref;
45 
46     u32 rec_data = 0;
47     u32 isr_status;
48 
49     //讀取中斷ID寄存器
50     isr_status = XUartPs_ReadReg(uart_instance_ptr->Config.BaseAddress,
51             XUARTPS_IMR_OFFSET);
52     isr_status &= XUartPs_ReadReg(uart_instance_ptr->Config.BaseAddress,
53             XUARTPS_ISR_OFFSET);
54 
55     //中斷標志狀態位,是否為RX FIFO觸發
56     if(isr_status & (u32)XUARTPS_IXR_RXOVR )
57     {
58         rec_data = XUartPs_RecvByte(XPAR_PS7_UART_0_BASEADDR);
59         XUartPs_WriteReg(uart_instance_ptr->Config.BaseAddress,
60                         XUARTPS_ISR_OFFSET,XUARTPS_IXR_RXOVR);
61     }
62 
63     XUartPs_SendByte(XPAR_PS7_UART_0_BASEADDR, rec_data);
64 }
65 
66 void uart_intr_init(XScuGic *IntcInstancePtr,XUartPs *UartInstancePtr,u16 UartIntrId)
67 {
68     //中斷控制器初始化
69     IntcConfig = XScuGic_LookupConfig(INTC_DEVICE_ID);
70     XScuGic_CfgInitialize(IntcInstancePtr, IntcConfig,IntcConfig->CpuBaseAddress);
71     Xil_ExceptionInit();
72     Xil_ExceptionRegisterHandler(XIL_EXCEPTION_ID_INT,
73                 (Xil_ExceptionHandler) XScuGic_InterruptHandler,
74                 IntcInstancePtr);
75     Xil_ExceptionEnable();
76     XScuGic_Connect(IntcInstancePtr, UartIntrId,
77                 (Xil_ExceptionHandler) uart_intr_handler,
78                 (void *) UartInstancePtr);
79 
80     XUartPs_SetInterruptMask(UartInstancePtr, XUARTPS_IXR_RXOVR );
81     XScuGic_Enable(IntcInstancePtr, UartIntrId);
82     
83 }
84 
85 int main()
86 {
87     //UART控制器初始化
88     uart_init(&UartPs,UART_DEVICE_ID);
89 
90     //UART控制器中斷初始化
91     uart_intr_init(&Intc, &UartPs,UART_INT_IRQ_ID);
92 
93     xil_printf("uart test!\n\r");
94 
95     while(1){};
96 
97     return 0;
98 }
UART中斷環回

 五、定時器中斷

  1 #include "xparameters.h" //器件參數信息
  2 #include "xstatus.h"     //包含XST_FAILURE和XST_SUCCESS的宏定義
  3 #include "xil_printf.h"  //包含print()函數
  4 #include "xgpiops.h"     //包含PS GPIO的函數
  5 #include "xscutimer.h"
  6 #include "xscugic.h"
  7 
  8 #define GPIO_DEVICE_ID      XPAR_XGPIOPS_0_DEVICE_ID
  9 #define TIMER_DEVICE_ID        XPAR_XSCUTIMER_0_DEVICE_ID
 10 #define TIMER_LOAD_VALUE    0x3F94067  //200ms 333.333Mhz 200/(1000/333.333)-1
 11 #define INTC_DEVICE_ID        XPAR_SCUGIC_SINGLE_DEVICE_ID
 12 #define TIMER_IRPT_INTR        XPAR_SCUTIMER_INTR  //SCU私有定時器中斷ID
 13 //連接到MIO的LED
 14 #define MIOLED    0     //連接到MIO0
 15 
 16 XGpioPs Gpio;            // GPIO設備的驅動程序實例
 17 XScuTimer TimerInstance;
 18 XScuGic IntcInstance;
 19 
 20 void mio_init()
 21 {
 22     //將ConfigPtr定義為結構體(多種變量類型重新組合生成新的變量類型)類型的指針(地址)
 23     XGpioPs_Config *ConfigPtr;
 24     //根據器件的ID,查找器件的配置信息,返回指針類型的變量,對應器件的配置列表
 25     ConfigPtr = XGpioPs_LookupConfig(GPIO_DEVICE_ID);
 26     //初始化GPIO的驅動,參數為指針,指針,地址
 27     XGpioPs_CfgInitialize(&Gpio, ConfigPtr,ConfigPtr->BaseAddr);
 28     //設置指定引腳的方向:0輸入,1輸出
 29     XGpioPs_SetDirectionPin(&Gpio, MIOLED, 1);//參數為指針,引腳,方向
 30     //使能指定引腳輸出:0禁止輸出使能,1使能輸出
 31     XGpioPs_SetOutputEnablePin(&Gpio, MIOLED, 1);
 32 }
 33 
 34 void timer_init(XScuTimer * TimerInstancePtr,u16 TimerDeviceId)
 35 {
 36     XScuTimer_Config *ConfigPtr;
 37     //初始化私有定時器
 38     ConfigPtr = XScuTimer_LookupConfig(TimerDeviceId);
 39     XScuTimer_CfgInitialize(TimerInstancePtr, ConfigPtr,ConfigPtr->BaseAddr);
 40     //使能AutoReload模式,可以多次定時中斷
 41     XScuTimer_EnableAutoReload(TimerInstancePtr);
 42     //配置計數器初始值
 43     XScuTimer_LoadTimer(TimerInstancePtr, TIMER_LOAD_VALUE);
 44 }
 45 
 46 //中斷處理函數
 47 void TimerIntrHandler(void *CallBackRef)
 48 {
 49     static int led_state = 0;
 50     XScuTimer *TimerInstancePtr = (XScuTimer *) CallBackRef;
 51 
 52     if (XScuTimer_IsExpired(TimerInstancePtr))
 53     {
 54         //清除中斷
 55         XScuTimer_ClearInterruptStatus(TimerInstancePtr);
 56         XGpioPs_WritePin(&Gpio, MIOLED, led_state); //向指定引腳寫入數據:0或1
 57         led_state = ~led_state;
 58     }
 59 }
 60 
 61 
 62 void timer_intr_init(XScuTimer * TimerInstancePtr,XScuGic *IntcInstancePtr,u16 TimerIntrId)
 63 {
 64     XScuGic_Config *IntcConfig;
 65 
 66     IntcConfig = XScuGic_LookupConfig(INTC_DEVICE_ID);
 67     XScuGic_CfgInitialize(IntcInstancePtr, IntcConfig,IntcConfig->CpuBaseAddress);
 68     //中斷異常處理
 69     Xil_ExceptionInit();
 70     Xil_ExceptionRegisterHandler(XIL_EXCEPTION_ID_IRQ_INT,
 71                     (Xil_ExceptionHandler)XScuGic_InterruptHandler,
 72                     IntcInstancePtr);
 73     Xil_ExceptionEnable();
 74     //設置定時器的中斷處理函數
 75     XScuGic_Connect(IntcInstancePtr, TimerIntrId,
 76                     (Xil_ExceptionHandler)TimerIntrHandler,
 77                     (void *)TimerInstancePtr);
 78     //使能中斷控制器
 79     XScuGic_Enable(IntcInstancePtr, TimerIntrId);
 80     //使能定時器中斷
 81     XScuTimer_EnableInterrupt(TimerInstancePtr);
 82 }
 83 
 84 int main()
 85 {
 86     //MIO初始化函數
 87     mio_init();
 88 
 89     //定時器初始化
 90     timer_init(&TimerInstance,TIMER_DEVICE_ID);
 91 
 92     //定時器中斷初始化
 93     timer_intr_init(&TimerInstance,&IntcInstance,TIMER_IRPT_INTR);
 94 
 95     XScuTimer_Start(&TimerInstance);
 96 
 97     print("Timer intr Led Test! \n\r");
 98     while(1);
 99     return XST_SUCCESS;
100 }
timer_intr_led

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM