[菜农助学交流] M0助学板学习第四帖:外部中断回调实验(库函数)

[复制链接]
 楼主| mcsgy 发表于 2011-9-25 23:53 | 显示全部楼层 |阅读模式
本帖最后由 mcsgy 于 2011-9-25 23:55 编辑

(一)硬件电路:
                   很简单就是两个按键连接到MCU的中断,KEY1连接GPB15也就是INT1,KEY2连接GPB14也就是INT0。如下图:
                              
(二)中断初始化:
                   这里要调用函数
  1. void DrvGPIO_EnableEINT0(E_DRVGPIO_INT_TYPE TriggerType, E_DRVGPIO_INT_MODE Mode, GPIO_EINT0_CALLBACK pfEINT0Callback)
  2. {
  3.     volatile uint32_t u32Reg;
  4.     if ((TriggerType == E_IO_BOTH_EDGE) && (Mode == E_MODE_LEVEL))
  5.         return ;
  6.     u32Reg = (uint32_t)&GPIOA->IEN + (E_GPB*PORT_OFFSET);
  7.     if (TriggerType == E_IO_RISING)
  8.     {
  9.         outpw(u32Reg, inpw(u32Reg) | (1UL<<(14+16)));  
  10.     }
  11.     else if (TriggerType == E_IO_FALLING)
  12.     {
  13.         outpw(u32Reg, inpw(u32Reg) | (1UL<<(14)));  
  14.      }
  15.     else if (TriggerType == E_IO_BOTH_EDGE)
  16.     {  
  17.         outpw(u32Reg, inpw(u32Reg) | (1UL<<(14))|(1UL<<(14+16)));  
  18.      }      
  19.      /* Configure to be level trigger or edge trigger */
  20.     u32Reg = (uint32_t)&GPIOA->IMD + (E_GPB*PORT_OFFSET);
  21.     if (Mode == E_MODE_EDGE)
  22.           outpw(u32Reg, inpw(u32Reg) & ~(1<<14));
  23.     else if(Mode == E_MODE_LEVEL)
  24.           outpw(u32Reg, inpw(u32Reg) | (1<<14));
  25.     _pfEINT0Callback = pfEINT0Callback;
  26.     NVIC_EnableIRQ(EINT0_IRQn);
  27. }
  28.                     
其中,第一个参数是选择边沿触发方式(上升沿,下降沿),第二个参数是选择触发方式(边沿触发,电平触发),第三个参数是中断回调函数的地址,从DrvGPIO.c开头的函数声明
                   static void (*_pfEINT0Callback)(void);
                   static void (*_pfEINT1Callback)(void);
                   可以看到,定义了指向函数的指针变量,可以用来存储回调函数的地址。  

                 中断响应函数:


  1. void EINT0_IRQHandler(void)
  2. {
  3.          /* EINT0 = GPB14. Clear the interrupt */
  4.          GPIOB->ISRC = 1UL << 14;
  5.          if ( _pfEINT0Callback )
  6.          _pfEINT0Callback();
  7. }
(三)main()函数:

  1. /////////////////////////////////////////////////
  2. //工程:中断实验
  3. //日期:2011年9月25日
  4. ////////////////////////////////////////////////
  5. #include <stdio.h>
  6. #include "NUC1xx.h"
  7. #include "DrvGPIO.h"
  8. #include "DrvSYS.h"
  9. void pfEINT0Callback(void);
  10. void pfEINT1Callback(void);
  11. int main(void)
  12. {
  13. UNLOCKREG();
  14. DrvSYS_Open(48000000);       //将时钟设定为48MHz

  15. //GPIO端口配置 可以是GPA, GPB , GPC , GPD , GPE
  16. //GPIO端口bit 可以是 0~15.
  17. //GPIO端口模式 可设定为IO_INPUT , IO_OUTPUT ,IO_OPENDRAIN  或者IO_QUASI

  18. DrvGPIO_Open(E_GPB, 10, E_IO_OUTPUT);         //  设置GPB10端口为输出模式
  19. DrvGPIO_ClrBit(E_GPB, 10);            //  清GPB10端口  蜂鸣器不叫唤
  20. //---------------------------------------------------------   
  21. DrvGPIO_Open(E_GPA, 2, E_IO_OUTPUT);         //  设置GPA2端口为输出模式
  22. DrvGPIO_Open(E_GPA, 3, E_IO_OUTPUT);         //  设置GPA3端口为输出模式
  23. DrvGPIO_Open(E_GPA, 4, E_IO_OUTPUT);         //  设置GPA4端口为输出模式
  24. DrvGPIO_Open(E_GPA, 5, E_IO_OUTPUT);         //  设置GPA5端口为输出模式
  25. // DrvGPIO_Open(E_GPB,14,E_IO_INPUT);         
  26. // DrvGPIO_Open(E_GPB,14,E_IO_INPUT);
  27. DrvGPIO_EnableEINT0(E_IO_FALLING,E_MODE_EDGE,&pfEINT0Callback);    //初始化INT0中断方式
  28. DrvGPIO_EnableEINT1(E_IO_FALLING,E_MODE_EDGE,&pfEINT1Callback);    //初始化INT1中断方式
  29. // 经过测试,以上Open注释掉程序也能用
  30. while(1);
  31. }
  32. void pfEINT0Callback(void)
  33. {
  34. DrvSYS_Delayms(10);
  35. if(0==DrvGPIO_GetBit(E_GPB,14))
  36. {
  37.   DrvGPIO_ClrBit(E_GPA,2);    //点亮LED1
  38.   DrvGPIO_SetBit(E_GPB,10);    //打开蜂鸣器
  39.   DrvSYS_Delayms(200);     //延时200ms
  40.   DrvGPIO_SetBit(E_GPA,2);    //关灯
  41.   DrvGPIO_ClrBit(E_GPB,10);    //关蜂鸣器
  42. }

  43. }
  44. static void pfEINT1Callback(void)
  45. {
  46. DrvSYS_Delayms(10);
  47. if(0==DrvGPIO_GetBit(E_GPB,15))
  48. {
  49.   DrvGPIO_ClrBit(E_GPA,3);
  50.   DrvGPIO_SetBit(E_GPB,10);
  51.   DrvSYS_Delayms(200);
  52.   DrvGPIO_SetBit(E_GPA,3);
  53.   DrvGPIO_ClrBit(E_GPB,10);
  54. }
  55. }
(四)工程包:

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
afxstar 发表于 2012-3-9 10:32 | 显示全部楼层
感谢楼主,正在研究中断,帖子内容正是我想找的:victory: :victory: :victory: :victory:
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:从零开始

6

主题

232

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部