在线时间71 小时
UID2074139
注册时间2015-4-9
NXP金币0
TA的每日心情 | 开心 2016-12-23 10:15 |
---|
签到天数: 1 天 连续签到: 1 天 [LV.1]初来乍到
金牌会员
 
- 积分
- 1061
- 最后登录
- 2018-5-13
|
本帖最后由 努力的人 于 2015-10-31 19:08 编辑
首先贴上之前的帖子,这次是在这个基础上写的。https://www.nxpic.org.cn/module/forum/thread-602344-1-1.html
第二发 外部中断EXTI
一、实验思路
外部中断就是根据外部输入信号(可以是上升沿、下降沿或者上升-下降沿),当微处理器引脚采集到这样的信号就触发中断,执行中断中的程序。本实验通过K64的SW2按键的下降沿作为外部中断信号,只要检测到这个信号,就翻转PTB22脚电平,诗RGB灯变红或者熄灭。
二、硬件电路分析
用到的外设:
1. SW2按键
2. RGB三色灯
三、软件程序
1.工程建立
这次和上次相比有了改进,新建了一个Hardware文件夹,建立了MK_GPIO.c和MK_EXTI.c两个文件用来存放咱们编写的程序
2.程序分析
1) MK_GPIO.c
- #include "gpio.h"
- /* GPIO 工作模式 */
- /*
- * @arg kGPIO_Mode_IFT :悬空输入
- * @arg kGPIO_Mode_IPD :下拉输入
- * @arg kGPIO_Mode_IPU :上拉输入
- * @arg kGPIO_Mode_OOD :开漏输出 如果不清楚这2种输出的区别请 百度..
- * @arg kGPIO_Mode_OPP :推挽输出
- */
- void GPIO_Initial()
- {
- GPIO_QuickInit(HW_GPIOB, 22, kGPIO_Mode_OPP);
- GPIO_QuickInit(HW_GPIOB, 21, kGPIO_Mode_OPP);
- GPIO_QuickInit(HW_GPIOE, 26, kGPIO_Mode_OPP);
-
- GPIO_QuickInit(HW_GPIOC, 6, kGPIO_Mode_IPU);//按键PTC6
-
- GPIO_WriteBit(HW_GPIOB, 22, 1);//RED
- GPIO_WriteBit(HW_GPIOB, 21, 1);//BLUE
- GPIO_WriteBit(HW_GPIOE, 26, 1);//GREEN
- }
复制代码 这里把PTC6设成了上拉输入
GPIO_QuickInit(HW_GPIOC, 6, kGPIO_Mode_IPU);//按键PTC6
其他的和之前的一样。
2)MK_EXTI.c
- #include "gpio.h"
- /* 回调函数中的 array 的32位每一位代表一个引脚,1为 该脚中断被触发 0代表该脚中断未触发 */
- static void GPIO_ISR(uint32_t array)
- {
- GPIO_ITDMAConfig(HW_GPIOC, 6, kGPIO_IT_FallingEdge, false);
- //printf("KEY:0x%X\r\n", array);
- if(array & (1 << 6)) /*对应的按键中断 翻转对应的LED电平 */
- {
- GPIO_ToggleBit(HW_GPIOB, 22);
- }
- GPIO_ITDMAConfig(HW_GPIOC, 6, kGPIO_IT_FallingEdge, true);
- }
- void EXTI_Initial()
- {
- /* 设置GPIO外部引脚中断回调函数 */
- GPIO_CallbackInstall(HW_GPIOC, GPIO_ISR);
- /* 打开PTE26引脚的中断 上升沿触发 */
- GPIO_ITDMAConfig(HW_GPIOC, 6, kGPIO_IT_FallingEdge, true);
- }
复制代码 说明:
void GPIO_CallbackInstall | ( | uint32_t | instance, | | | GPIO_CallBackType | AppCBFun | | )
|
- HW_GPIOA 芯片的PORTA端口中断入口
- HW_GPIOB 芯片的PORTB端口中断入口
- HW_GPIOC 芯片的PORTC端口中断入口
- HW_GPIOD 芯片的PORTD端口中断入口
- HW_GPIOE 芯片的PORTE端口中断入口
这个回调函数使得中断处理函数必须得写在他的前面。
3)main.c
- #include "gpio.h"
- #include "common.h"
- #include "MK_GPIO.h"
- #include "MK_EXTI.h"
- /* CH Kinetis固件库 V2.50 版本 */
- /* 修改主频 请修改 CMSIS标准文件 system_MKxxxx.c 中的 CLOCK_SETUP 宏 */
- int main(void)
- {
- /* 初始化Delay */
- DelayInit();
-
- GPIO_Initial();
- EXTI_Initial();
- while(1)
- {
- // /* 翻转引脚电平 原来是低变成高 原来是高变成低 */
- // GPIO_ToggleBit(HW_GPIOE, 6);
- /* 另外一种方法 使用位带操作 */
- //PEout(6) = !PEout(6);
- //DelayMs(500);
-
- }
- }
复制代码 四、实验结果
按SW2,每一个下降沿,PB22电平翻转
|
评分
-
查看全部评分
|