STM32 使用 CubeMX 实现按键外部中断

目录

  • 问题
  • 背景知识
  • 参考
  • 需要改什么
  • 注意
  • 尽量不要在中断函数使用 循环函数做延时
  • 中断函数中延时方法
  • 调试
  • 问题

    我想实现按钮触发紧急停止类似功能,需要使用按键中断功能。

    背景知识

  • GPIO 点亮 LED。
  • stm32cubemx hal学习记录:GPIO输入输出。
  • STM32—HAL库 笔记
  • 参考

    阅读下面的参考资料,一步一步跟着做。

  • SM32CubeMX应用笔记4 外部中断。
  • STM32CubeMX实战教程(三)——外部中断(中断及HAL_Delay函数避坑),同样的 CSDN 博文在这里。
  • cubemx按键配置中断 cubemx配置中断优先级。
  • STM32 中断函数与回调函数。
  • STM32开发,使用HAL库函数实现按键(中断和普通扫描)控制LED灯。
  • 需要改什么

    只需要在 stm32f4xx_it.c 中重写回调函数。

  • 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。

  • main 函数定义 flag
  • /* Private user code ---------------------------------------------------------*/
    /* USER CODE BEGIN 0 */
    uint8_t flag = 0;
    /* USER CODE END 0 */
    
  • main 函数中 while 循环处理中断的工作内容,主要是为了使用 HAL_Delay
  • /* 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 */
    
  • stm32f4xx_it.c 申明外部的 flag
  • /* USER CODE BEGIN EV */
    extern uint8_t flag;
    /* USER CODE END EV */
    

    注意

    尽量不要在中断函数使用 循环函数做延时

    中断函数中循环延时代码可能被编译器优化。一定要使用,需要修改优化等级到 “O0”。

    中断函数中延时方法

    在中断函数中设置一个 flag,在 main 中判断这个标志,然后采取动作。main 中可以使用延时函数 HAL_Delay。

    调试

    作者:Kasen\’s experience

    物联沃分享整理
    物联沃-IOTWORD物联网 » STM32 使用 CubeMX 实现按键外部中断

    发表回复