有很多文章说明了由于HAL_Delay()
函数的本质是系统定时器计数,通过全局变量uwTick
的不断增加实现的比较延迟。调用HAL_Delay()
函数会阻塞其他工作,因此在外设ISR进程调用该延迟时,要特别小心。
因此,现在考虑,既然系统定时器会固定产生中断,那是否可以通过在系统定时器的中断回调函数中设置一个标志位实现定时 ?
在网上还没有基于CubeMX生成的项目实现定时功能 ,当然后续工作更多定时会通过其他通用定时器 实现,这篇文章仅供学习参考。
CubeMX设置
RCC、SYS、LED_GPIO和时钟树不再叙述,这里只看系统定时器。这里的抢占优先级设置为3,原来默认为15,不是很有问题。

Keil代码
首先要找到系统定时器
的中断服务函数
,会发现其并没有直接调用HAL库函数 。而是SysTick_Handler
函数,里面只调用了一个HAL_IncTick()
函数。
HAL库 中的系统中断服务函数为HAL_SYSTICK_IRQHandler()
,需要手动添加到SysTick_Handler()
中,并且重写中断回调函数HAL_SYSTICK_Callback()
。
其他关键代码
main.h
main.c
最后编译通过即可,主要功能是每秒翻转一次连接LED的GPIO的电平,实现1s亮1s灭,但不是通过延迟函数得到,而是通过状态标志位实现。