[Kinetis] 【10分钟】迅速开发K64【外部中断】

[复制链接]
 楼主| aaaxxxrrr 发表于 2015-10-31 19:19 | 显示全部楼层 |阅读模式
首先贴上之前的帖子,这次是在这个基础上写的。叫  迅速开发K64之RGB
第二发  外部中断EXTI
一、实验思路
外部中断就是根据外部输入信号(可以是上升沿、下降沿或者上升-下降沿),当微处理器引脚采集到这样的信号就触发中断,执行中断中的程序。本实验通过K64的SW2按键的下降沿作为外部中断信号,只要检测到这个信号,就翻转PTB22脚电平,诗RGB灯变红或者熄灭。
二、硬件电路分析
用到的外设:
1. SW2按键

2. RGB三色灯

三、软件程序
1.工程建立
这次和上次相比有了改进,新建了一个Hardware文件夹,建立了MK_GPIO.c和MK_EXTI.c两个文件用来存放咱们编写的程序

2.程序分析
1) MK_GPIO.c
  1. #include "gpio.h"

  2. /* GPIO 工作模式 */
  3. /*
  4. *         @arg kGPIO_Mode_IFT :悬空输入
  5. *         @arg kGPIO_Mode_IPD :下拉输入
  6. *         @arg kGPIO_Mode_IPU :上拉输入
  7. *         @arg kGPIO_Mode_OOD :开漏输出 如果不清楚这2种输出的区别请 百度..
  8. *         @arg kGPIO_Mode_OPP :推挽输出
  9. */
  10. void GPIO_Initial()
  11. {
  12.         GPIO_QuickInit(HW_GPIOB, 22, kGPIO_Mode_OPP);
  13.         GPIO_QuickInit(HW_GPIOB, 21, kGPIO_Mode_OPP);
  14.         GPIO_QuickInit(HW_GPIOE, 26, kGPIO_Mode_OPP);
  15.         
  16.         GPIO_QuickInit(HW_GPIOC, 6, kGPIO_Mode_IPU);//按键PTC6
  17.         
  18.         GPIO_WriteBit(HW_GPIOB, 22, 1);//RED
  19.         GPIO_WriteBit(HW_GPIOB, 21, 1);//BLUE
  20.         GPIO_WriteBit(HW_GPIOE, 26, 1);//GREEN
  21. }
这里把PTC6设成了上拉输入
GPIO_QuickInit(HW_GPIOC, 6, kGPIO_Mode_IPU);//按键PTC6
其他的和之前的一样。
2)MK_EXTI.c
  1. #include "gpio.h"


  2. /* 回调函数中的 array 的32位每一位代表一个引脚,1为 该脚中断被触发 0代表该脚中断未触发 */
  3. static void GPIO_ISR(uint32_t array)
  4. {
  5.     GPIO_ITDMAConfig(HW_GPIOC, 6, kGPIO_IT_FallingEdge, false);
  6.     //printf("KEY:0x%X\r\n", array);
  7.     if(array & (1 << 6)) /*对应的按键中断 翻转对应的LED电平 */
  8.     {
  9.         GPIO_ToggleBit(HW_GPIOB, 22);
  10.     }
  11.     GPIO_ITDMAConfig(HW_GPIOC, 6, kGPIO_IT_FallingEdge, true);
  12. }

  13. void EXTI_Initial()
  14. {
  15.         /* 设置GPIO外部引脚中断回调函数 */
  16.     GPIO_CallbackInstall(HW_GPIOC, GPIO_ISR);
  17.     /* 打开PTE26引脚的中断 上升沿触发 */
  18.     GPIO_ITDMAConfig(HW_GPIOC, 6, kGPIO_IT_FallingEdge, true);
  19. }
说明:
void GPIO_CallbackInstall(uint32_tinstance,
GPIO_CallBackTypeAppCBFun
)
instanceGPIO模块中断入口号
  • HW_GPIOA 芯片的PORTA端口中断入口
  • HW_GPIOB 芯片的PORTB端口中断入口
  • HW_GPIOC 芯片的PORTC端口中断入口
  • HW_GPIOD 芯片的PORTD端口中断入口
  • HW_GPIOE 芯片的PORTE端口中断入口
AppCBFun回调函数指针入口
这个回调函数使得中断处理函数必须得写在他的前面。

3)main.c
  1. #include "gpio.h"
  2. #include "common.h"
  3. #include "MK_GPIO.h"
  4. #include "MK_EXTI.h"
  5. /* CH Kinetis固件库 V2.50 版本 */
  6. /* 修改主频 请修改 CMSIS标准文件 system_MKxxxx.c 中的 CLOCK_SETUP 宏 */

  7. int main(void)
  8. {
  9.     /* 初始化Delay */
  10.     DelayInit();

  11.     GPIO_Initial();
  12.         EXTI_Initial();
  13.     while(1)
  14.     {
  15. //        /* 翻转引脚电平 原来是低变成高 原来是高变成低 */
  16. //        GPIO_ToggleBit(HW_GPIOE, 6);
  17.         /* 另外一种方法 使用位带操作 */
  18.         //PEout(6) = !PEout(6);
  19.         //DelayMs(500);
  20.                
  21.     }
  22. }


quray1985 发表于 2015-11-1 20:33 | 显示全部楼层
这个外部中断函数写的还是很简洁的
 楼主| aaaxxxrrr 发表于 2015-11-3 09:27 | 显示全部楼层
quray1985 发表于 2015-11-1 20:33
这个外部中断函数写的还是很简洁的

谢谢
FSL_TICS_ZJJ 发表于 2015-11-3 09:42 | 显示全部楼层
感谢楼主的经验分享!
 楼主| aaaxxxrrr 发表于 2015-11-5 20:55 | 显示全部楼层
FSL_TICS_ZJJ 发表于 2015-11-3 09:42
感谢楼主的经验分享!

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

本版积分规则

10

主题

99

帖子

1

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