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 }