STM32 使用 CubeMX 实现按键外部中断
目录
问题
我想实现按钮触发紧急停止类似功能,需要使用按键中断功能。
背景知识
参考
阅读下面的参考资料,一步一步跟着做。
需要改什么
只需要在 stm32f4xx_it.c
中重写回调函数。
/* USER CODE BEGIN 1 */
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
// delay 10 ms, double check button pressed
// uint32_t aa=3127*10;
// while(aa--);
if(GPIO_Pin==Btn_Pin)
{
// 你自己的代码
flag = 1;
}
}
/* USER CODE END 1 */
下面的代码是为了中断中使用 HAL_Delay 函数,需要进行的修改,同时中断函数中只改变了一个 flag。
/* Private user code ---------------------------------------------------------*/
/* USER CODE BEGIN 0 */
uint8_t flag = 0;
/* USER CODE END 0 */
/* USER CODE BEGIN WHILE */
while (1)
{
HAL_GPIO_WritePin(GPIOE,GPIO_PIN_0,GPIO_PIN_SET);
HAL_Delay(50);
HAL_GPIO_WritePin(GPIOE,GPIO_PIN_0,GPIO_PIN_RESET);
HAL_Delay(50);
if (flag == 1)
{
// Beep
HAL_GPIO_WritePin(GPIOE,GPIO_PIN_3,GPIO_PIN_SET);
HAL_Delay(1000);
HAL_GPIO_WritePin(GPIOE,GPIO_PIN_3,GPIO_PIN_RESET);
// LED
if(HAL_GPIO_ReadPin(GPIOE,Btn_Pin)==1)
{
for(uint16_t i= 0; i<50;i++)
{
HAL_GPIO_WritePin(GPIOE,GPIO_PIN_1,GPIO_PIN_SET);
HAL_Delay(20);
HAL_GPIO_WritePin(GPIOE,GPIO_PIN_1,GPIO_PIN_RESET);
HAL_Delay(20);
}
}
flag=0;
}
/* USER CODE END WHILE */
/* USER CODE BEGIN EV */
extern uint8_t flag;
/* USER CODE END EV */
注意
尽量不要在中断函数使用 循环函数做延时
中断函数中循环延时代码可能被编译器优化。一定要使用,需要修改优化等级到 “O0”。
中断函数中延时方法
在中断函数中设置一个 flag,在 main 中判断这个标志,然后采取动作。main 中可以使用延时函数 HAL_Delay。
调试
作者:Kasen\’s experience