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