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和外部中断优先级一样,最高优先级
降低外部中断优先级
烧录进开发板,程序工作正常!
当然这只是一个简单地测试,一般不允许在中断里进行延时等耗时工作,后续改进按键中断可以使用定时扫描,设置标志位等操作