查看: 936|回复: 0

[评测分享] 超越者Spartan-6 FPGA开发板】 + MicroBlaze触摸按键中断

[复制链接]
  • TA的每日心情
    开心
    2024-10-25 14:50
  • 签到天数: 1071 天

    连续签到: 1 天

    [LV.10]以坛为家III

    发表于 2021-6-12 23:32:33 | 显示全部楼层 |阅读模式
    分享到:

        这篇来学习下MicroBlaze的GPIO外部中断,使用开发板上的触摸按键来驱动外部中断。
        要实现的功能:
        1、边沿触发,按下按键和松开按键各执行一次中断。
        2、进入中断执行一次串口打印。
        3、进入中断执行一次LED0亮灭。


       一、硬件设计


        1.1、添加GPIO的IP核
        001.png
        002.png
       
        1.2、添加中断控制INTC核
        003.png
        004.png
       
        1.3、将intc ip核连接到microblaze系统
        005.png
        006.png
        007.png
        008.png


        1.4、管脚约束


        200.png


        二、程序设计


        2.1、程序中函数定义
        201.png


        2.2、主要代码
        key.c
    1. #include <stdio.h>
    2. #include "platform.h"
    3. #include "xparameters.h"
    4. #include "xintc.h"
    5. #include "xgpio.h"
    6. #include "xil_exception.h"
    7. #include "led.h"

    8. #define KEY_DEV_ID       XPAR_AXI_GPIO_KEY_DEVICE_ID  //按键 AXI GPIO ID
    9. #define INTC_DEVICE_ID   XPAR_AXI_INTC_KEY_DEVICE_ID  //中断控制器ID
    10. #define EXCEPTION_ID     XIL_EXCEPTION_ID_INT         //中断异常ID
    11. #define AXI_GPIO_INTR_ID XPAR_INTC_0_GPIO_1_VEC_ID    //AXI GPIO中断ID

    12. static XIntc    Intc;                                 //中断控制器实例
    13. static XGpio    KEY_Gpio;                             //GPIO中断实例 按键

    14. int key_intr_flag = 0;  //中断标志
    15. int int_flag=0;

    16. void GpioHandler(void *CallbackRef)
    17. {
    18.     XGpio *GpioPtr = (XGpio *)CallbackRef;
    19.         key_intr_flag = 1;                   //接收到中断,标志信号拉高
    20.         XGpio_InterruptDisable(GpioPtr, 1);  //关闭中断
    21.         XGpio_InterruptClear(GpioPtr, 1);    //清除中断
    22.         XGpio_InterruptEnable(GpioPtr, 1);   //使能中断
    23. }

    24. void init_key(void)
    25. {
    26.         xil_printf("AXI GPIO INTERRUPT TEST!\r\n");

    27.         XGpio_Initialize(&KEY_Gpio, KEY_DEV_ID);                        //AXI_GPIO器件初始化
    28.         XGpio_SetDataDirection(&KEY_Gpio, 1, 1);

    29.         XIntc_Initialize(&Intc, INTC_DEVICE_ID);                        //初始化中断控制器
    30.         //关联中断ID和中断服务函数
    31.         XIntc_Connect(&Intc,AXI_GPIO_INTR_ID,(Xil_ExceptionHandler)GpioHandler,&KEY_Gpio );


    32.         XGpio_InterruptEnable(&KEY_Gpio, 1);                    //使能中断

    33.         XGpio_InterruptGlobalEnable(&KEY_Gpio);                  //使能全局中断

    34.         XIntc_Enable(&Intc,AXI_GPIO_INTR_ID);                        //在中断控制器上启用中断向量

    35.         XIntc_Start(&Intc, XIN_REAL_MODE);                                //启动中断控制器
    36.         //设置并打开中断异常处理
    37.         Xil_ExceptionInit();
    38.         Xil_ExceptionRegisterHandler(EXCEPTION_ID,
    39.                         (Xil_ExceptionHandler)XIntc_InterruptHandler,&Intc);
    40.         Xil_ExceptionEnable();
    41. }

    42. void key_hdl(void)
    43. {
    44.         u32 Delay;
    45.         if(key_intr_flag)                                        //检测中断标志信号有效
    46.         {
    47.                 int_flag= ~int_flag;
    48.                 if(int_flag==0)
    49.                 {
    50.                         led0_on();
    51.                 }
    52.                 else
    53.                 {
    54.                         led0_off();
    55.                 }
    56.                 xil_printf("INTC \r\n");
    57.             key_intr_flag = 0;              //中断标志清零
    58.         }
    59. }
    复制代码
           三、程序执行

       按下和松开触摸按键开关,中断分别执行一次,上升沿和下降沿执行。同时LED0点亮和关闭各执行一次。
        202.png


    回复

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /4 下一条

    手机版|小黑屋|与非网

    GMT+8, 2024-11-23 12:18 , Processed in 0.117121 second(s), 17 queries , MemCache On.

    ICP经营许可证 苏B2-20140176  苏ICP备14012660号-2   苏州灵动帧格网络科技有限公司 版权所有.

    苏公网安备 32059002001037号

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.