timer - STM32 HAL_Delay TIMER 微控制器
问题描述
HAL_Delay() 函数和空的 for 循环有什么区别?定时器应创建中断并关闭 LED。如果我在中断函数中使用 HAL_Delay() ,结果是 LED 永远关闭:
void TIM6_DAC_IRQHandler() {
HAL_TIM_IRQHandler(&htim6);
HAL_GPIO_WritePin(LED1_GPIO_Port, LED1_Pin, GPIO_PIN_RESET);
HAL_Delay(125);
}
但如果我改用:
void TIM6_DAC_IRQHandler() {
HAL_TIM_IRQHandler(&htim6);
HAL_GPIO_WritePin(LED1_GPIO_Port, LED1_Pin, GPIO_PIN_RESET);
for (int i=0; i<1000000; i++);
}
然后 LED1,它在主文件中始终打开,会在短时间内关闭然后打开,正如我所期望的那样。那么为什么带有 HAL_Delay 的代码不起作用呢?
解决方案
- 经验法则:永远不要在中断处理程序中使用延迟。
HAL_Delay
使用 SysTick 中断,如果 SysTick 的优先级低于调用它的处理程序的中断的优先级,将进入死循环,因为 SysTick 处理程序永远不会被调用。
空循环:我个人建议使用其他形式的循环:
for(volatile count = 0; count < 1000; count++);
或者
for(count = 0; count < 1000; count++) asm("");
推荐阅读
- php - 如何使用 Laravel Excel 避免特殊字符?
- javascript - 将范围限制为 elementHandles 数组(用于选择/单击/等)
- javascript - Node.js - 如何创建 html 表?
- json - 如何在 Flutter 应用中使用 SOLID 原则实现链接到 Provider 的 API 调用?
- javascript - 期望在箭头函数结束时返回一个值:array-callback-return
- sql - 搜索事件和前一个事件
- azure-cognitive-search - 如何在没有索引存储的情况下使用 Azure 内容搜索?
- javascript - 如何在nodejs中同步递归和异步函数
- reactjs - 容器和展示模式仍然是钩子的最佳实践吗?
- r - geom_raster 和 geom_point 的两种颜色渐变