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 }
二、中斷
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 }
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 }
四、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 }
五、定時器中斷

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 }