外部中断实验
此实验将外部中断配置为按键输入,通过按键输入触发外部中断,在外部中断里面实施相应的处理,具体功能:
- 按下KEY0,翻转LED0状态
- 按下KEY1,翻转LED1状态
- 按下KEY2,同时翻转LED0和LED1状态
- 按下KEY_UP,翻转BEEP状态
在中断回调函数里面使用delay进行消抖,导致中断是阻塞的,不符合中断快速执行的原则,linux中的按键处理是实验外部中断+定时器共同实现的,更具普遍性。
弄清楚:
- 中断在单片机中是如何实现的
- 外部中断处理流程(程序)
- 如何配置外部中断
main函数
main函数代码:
#include "./SYSTEM/sys/sys.h"
#include "./SYSTEM/usart/usart.h"
#include "./SYSTEM/delay/delay.h"
#include "./BSP/LED/led.h"
#include "./BSP/BEEP/beep.h"
#include "./BSP/EXTI/exti.h"
int main(void)
{
HAL_Init(); /* 初始化HAL库 */
sys_stm32_clock_init(336, 8, 2, 7); /* 设置时钟,168Mhz */
delay_init(168); /* 延时初始化 */
usart_init(115200); /* 串口初始化为115200 */
led_init(); /* 初始化LED */
beep_init(); /* 初始化蜂鸣器 */
extix_init(); /* 初始化外部中断输入 */
LED0(0); /* 先点亮红灯 */
while(1)
{
delay_ms(1000);
}
}
在main中主要做的是初始化,然后在while(1)里面死循环等待中断的到来,HAL_Init是使用HAL库必须调用的初始化函数;sys_stm32_clock_init、delay_init、usart_init这三个函数是正点原子编写的SYSTEM初始化函数,配置了系统时钟,延时函数,串口配置,实现单片机开发常用基本功能;然后调用led_init、beep_init、extix_init,初始化LED引脚、BEEP引脚、EXTI外部中断,KEY引脚初始化是在extix_init中进行调用的,故未在main中体现,完成所有的硬件初始化后,先将LED0点亮。
本次实验的核心是extix_init以及中断处理函数
exti.h
#ifndef __EXTI_H
#define __EXTI_H
#include "./SYSTEM/sys/sys.h"
/******************************************************************************************/
/* 引脚 和 中断编号 & 中断服务函数 定义 */
#define KEY0_INT_GPIO_PORT GPIOE
#define KEY0_INT_GPIO_PIN GPIO_PIN_4
#define KEY0_INT_GPIO_CLK_ENABLE() do{
__HAL_RCC_GPIOE_CLK_ENABLE(); }while(0) /* PE口时钟使能 */
#define KEY0_INT_IRQn EXTI4_IRQn
#define


8197

被折叠的 条评论
为什么被折叠?



