笔者最近在学习HAL库发现一个BUG,属实把我给整懵圈了,之前用自带的延时函数真的是不亦乐乎,如同自带BUFF加成,这下好了,在中断里直接寄了~
就像如下这段程序,小灯点着就灭不了:
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
i++;
if(i==10)
{
i=0;
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_5, 0);
HAL_GPIO_WritePin(GPIOE, GPIO_PIN_5, 0);
HAL_Delay(100);
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_5, 1);
HAL_GPIO_WritePin(GPIOE, GPIO_PIN_5, 1);
}
}
经过我一通胡乱操作,原来问题是这样的:
__weak void HAL_Delay(uint32_t Delay)
{
uint32_t tickstart = HAL_GetTick();
uint32_t wait = Delay;
/* Add a freq to guarantee minimum wait */
if (wait < HAL_MAX_DELAY)
{
wait += (uint32_t)(uwTickFreq);
}
while ((HAL_GetTick() - tickstart) < wait)
{
}
}
我们找到延时函数的所在地就会发现,原来开了滴答定时器的中断,而滴答定时器的中断优先级如果我们不做修改的话是最低的,也就是在其它中断函数中是无法进入滴答定时器的中断的,也就会导致程序一直在whlie中死循环。
我们在STM32CubeMX中配置的NVIC是这样的:
你若不做修改的话,Time base: System tick timer 的优先级就是最低的。
找到病因所在,就提供一种非常简便的解决方法,我们只需使Time base: System tick timer
的中断优先级比我们想调用延时函数的中断优先级高即可:
好了,程序有跑起来了!完美解决~