HCSR04+定时中断测距(调试发现卡死在HAL_Delay())
2023-12-23 19:29:03
不同代码的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()使用。
文章来源:https://blog.csdn.net/weixin_52477295/article/details/135172720
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!