STM32外部中断与滴答定时器

STM32外部中断与滴答定时器的小问题(程序死在中断)

最近刚拿到一块新开发板,初次接触STM32cubemx和HAL库,所以在新板子上做了一些小测试;
在进行按键中断调试时遇到一个小问题–在外部中断里对按键进行延时消抖(当然这不规范,中断快进快出的原则一般不允许在中断函数进行延时等耗时操作,当然这只是个测试),发现程序不能进行正常工作,串口调试发现程序死在了中断里。串口调试点击
在main.c的while循环里

 while (1)
  {
    printf("hello\r\n");
    HAL_Delay(1000);
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
  }

程序正常运行,串口工具里可以看到打印信息
在gpio.c文件里外部中断回调函数里代码如下

#include<stdio.h>
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
    if(GPIO_Pin == Key1_Pin)
    {   
         HAL_Delay(10);
        if(HAL_GPIO_ReadPin(Key1_GPIO_Port,Key1_Pin)==0)
        {
                printf("this is exti\r\n");
        }
    }
}

发现不会打印信息也不会再回到主循环里,程序卡死在中断里
分析:主循环里delay函数正常,在中断里执行就不正常了,先查看delay函数代码

__weak void HAL_Delay(uint32_t Delay)
{
  uint32_t tickstart = HAL_GetTick();
  uint32_t wait = Delay;

  /* Add a period to guaranty minimum wait */
  if (wait < HAL_MAX_DELAY)
  {
    wait++;
  }

  while((HAL_GetTick() - tickstart) < wait)
  {
  }
}

使用系统systick定时器实现的延时;那么就存在两个中断,考虑中断的优先级

cubemx默认的systick和外部中断优先级一样,最高优先级
cubemx默认的systick和外部中断优先级一样
降低外部中断优先级
降低外部中断优先级
烧录进开发板,程序工作正常!

当然这只是一个简单地测试,一般不允许在中断里进行延时等耗时工作,后续改进按键中断可以使用定时扫描,设置标志位等操作

猜你喜欢

转载自blog.csdn.net/qq_42425882/article/details/89052934