不同代码的bug情况不一样,至于我的就是在其他中断回调函数中间接调用了
HAL_Delay()导致卡死,具体卡死的原理是:HAL_Delay()本质就是滴答定时器的应用,其中通过cubumx配置生成的代码采用的是中断计数定时方式,并且默认配置中断优先级为最低,因此在其他中断回调函数就会卡死。
解决方法:在cubumx上将滴答定时器的中断优先级配置级别比所在中断回调函数所对应的中断源级别高(stm32中断优先级,数值越低,优先级越高)。
以下是我的使用案例导致的bug:
超声波测距启动代码 HC05_Start();调用了HAL_Delay()
void HC05_Start(void)
{
HAL_GPIO_WritePin( GPIOB, GPIO_PIN_1, GPIO_PIN_RESET);
HAL_GPIO_WritePin( GPIOB, GPIO_PIN_1, GPIO_PIN_SET);
HAL_Delay(1);
HAL_GPIO_WritePin( GPIOB, GPIO_PIN_1, GPIO_PIN_RESET);
}
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
static uint16_t times=0;
if (htim->Instance == TIM3) // 判断是定时器1发生中断
{
times++;
if(times==500)
{
HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_13);
printf("\r\n启动超声波测距\r\n");
times=0;
HC05_Start();/*启动超声波测距*/
}
}
还有一种解决方法就是,自写非中断式的延时函数,供 HC05_Start()使用。