外部中断,使用按键KEY检测
- 1、STM32CubeMX引脚设置和代码生成
- 2、编写相关中断的C文件
- 1.相关中断函数:
- 2.相关中断函数的编写:
- 3.相关中断的优先级顺序:
- 3、编译工程文件,使用ST-Link烧录,测试按键的外部中断
1、STM32CubeMX引脚设置和代码生成
1.正点原子mini开发板KEY的电路图,正点原子mimi板的电路:WK_UP–PA0 KEY_0–PC5 KEY_1–PA15。根据电路图可以知道,需要将WK_UP
的输入设置为上升沿触发,将KEY_0
、KEY_0
设置为下降沿触发。
注:
高电平有效使用上升沿触发,电平由低到高;
低电平有效使用下降沿触发,电平由高到低;
2.在STM32CubeMX软件中,配置相对应的引脚及引脚相关模式GPIO_EXTI*
,并在软件右侧对引脚进行详细配置,并在用户标签项User Label
中填进WK_UP
等标签备注。
(这个标签项有利于帮助我们查看各个引脚的使用情况及相关代码的宏定义,相关的宏定义会在生成的代码main.h
中进行定义。)
3.在STM32CubeMX软件右侧,选择System Core
项,点击NVIC
项,勾选对应的中断总线。
4.在STM32CubeMX软件右上角,点击GEBERATE CODE项,生成代码。
2、编写相关中断的C文件
1.相关中断函数:
相关的中断函数在stm32f1xx_it.c文件中可以查看得到。
在HAL_GPIO_EXTI_IRQHandler()
这个函数中,我们可以看到相关中断函数的处理。
void HAL_GPIO_EXTI_IRQHandler(uint16_t GPIO_Pin)
函数的简介:
进入相关的中断处理,先判断该个IO口是否中断,然后清除标志位,再进入IO口的回调函数中HAL_GPIO_EXTI_Callback(GPIO_Pin)
void HAL_GPIO_EXTI_IRQHandler(uint16_t GPIO_Pin)
{
/* EXTI line interrupt detected */
if (__HAL_GPIO_EXTI_GET_IT(GPIO_Pin) != 0x00u)
{
__HAL_GPIO_EXTI_CLEAR_IT(GPIO_Pin);
HAL_GPIO_EXTI_Callback(GPIO_Pin);
}
}
2.相关中断函数的编写:
将相关的HAL_GPIO_EXTI_Callback(GPIO_Pin)
复制到main.c
中的用户代码区进行编写,当然也可以建立相关的exti.h
exti.c
文件。
中断函数中回调函数的编辑情况如下:
/* USER CODE BEGIN 4 */
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
if(GPIO_Pin == WK_UP_Pin)
led_bling_sum(3,500); //闪烁3次,间隔500ms
else if(GPIO_Pin == KEY_0_Pin)
led_bling_sum(6,500); //闪烁6次,间隔500ms
else if(GPIO_Pin == KEY_1_Pin)
led_bling_sum(6,50); //闪烁6次,间隔50ms
}
/* USER CODE END 4 */
3.相关中断的优先级顺序:
由于void led_bling_sum(uint32_t sum,uint32_t time)
函数中使用了void HAL_Delay(uint32_t Delay)
延时函数。在中断中使用延时函数,因此必须要考虑中断的优先级顺序。
中断的优先级顺序为:0最高级,1次高级,数字越大优先级越低。