TA的每日心情 | 开心 2024-10-25 14:50 |
---|
签到天数: 1071 天 连续签到: 1 天 [LV.10]以坛为家III
|
这篇来学习下MicroBlaze的GPIO外部中断,使用开发板上的触摸按键来驱动外部中断。
要实现的功能:
1、边沿触发,按下按键和松开按键各执行一次中断。
2、进入中断执行一次串口打印。
3、进入中断执行一次LED0亮灭。
一、硬件设计
1.1、添加GPIO的IP核
1.2、添加中断控制INTC核
1.3、将intc ip核连接到microblaze系统
1.4、管脚约束
二、程序设计
2.1、程序中函数定义
2.2、主要代码
key.c
- #include <stdio.h>
- #include "platform.h"
- #include "xparameters.h"
- #include "xintc.h"
- #include "xgpio.h"
- #include "xil_exception.h"
- #include "led.h"
- #define KEY_DEV_ID XPAR_AXI_GPIO_KEY_DEVICE_ID //按键 AXI GPIO ID
- #define INTC_DEVICE_ID XPAR_AXI_INTC_KEY_DEVICE_ID //中断控制器ID
- #define EXCEPTION_ID XIL_EXCEPTION_ID_INT //中断异常ID
- #define AXI_GPIO_INTR_ID XPAR_INTC_0_GPIO_1_VEC_ID //AXI GPIO中断ID
- static XIntc Intc; //中断控制器实例
- static XGpio KEY_Gpio; //GPIO中断实例 按键
- int key_intr_flag = 0; //中断标志
- int int_flag=0;
- void GpioHandler(void *CallbackRef)
- {
- XGpio *GpioPtr = (XGpio *)CallbackRef;
- key_intr_flag = 1; //接收到中断,标志信号拉高
- XGpio_InterruptDisable(GpioPtr, 1); //关闭中断
- XGpio_InterruptClear(GpioPtr, 1); //清除中断
- XGpio_InterruptEnable(GpioPtr, 1); //使能中断
- }
- void init_key(void)
- {
- xil_printf("AXI GPIO INTERRUPT TEST!\r\n");
- XGpio_Initialize(&KEY_Gpio, KEY_DEV_ID); //AXI_GPIO器件初始化
- XGpio_SetDataDirection(&KEY_Gpio, 1, 1);
- XIntc_Initialize(&Intc, INTC_DEVICE_ID); //初始化中断控制器
- //关联中断ID和中断服务函数
- XIntc_Connect(&Intc,AXI_GPIO_INTR_ID,(Xil_ExceptionHandler)GpioHandler,&KEY_Gpio );
- XGpio_InterruptEnable(&KEY_Gpio, 1); //使能中断
- XGpio_InterruptGlobalEnable(&KEY_Gpio); //使能全局中断
- XIntc_Enable(&Intc,AXI_GPIO_INTR_ID); //在中断控制器上启用中断向量
- XIntc_Start(&Intc, XIN_REAL_MODE); //启动中断控制器
- //设置并打开中断异常处理
- Xil_ExceptionInit();
- Xil_ExceptionRegisterHandler(EXCEPTION_ID,
- (Xil_ExceptionHandler)XIntc_InterruptHandler,&Intc);
- Xil_ExceptionEnable();
- }
- void key_hdl(void)
- {
- u32 Delay;
- if(key_intr_flag) //检测中断标志信号有效
- {
- int_flag= ~int_flag;
- if(int_flag==0)
- {
- led0_on();
- }
- else
- {
- led0_off();
- }
- xil_printf("INTC \r\n");
- key_intr_flag = 0; //中断标志清零
- }
- }
复制代码 三、程序执行
按下和松开触摸按键开关,中断分别执行一次,上升沿和下降沿执行。同时LED0点亮和关闭各执行一次。
|
|