西河刘卡车医 发表于 3 天前

[STM32学习条记(九)]CubeMX项目利用系统定时器SysTick的中断服务函数进行定时

有很多文章阐明了由于HAL_Delay()函数的本质是系统定时器计数,通过全局变量uwTick的不断增加实现的比力耽误。调用HAL_Delay()函数会壅闭其他工作,因此在外设ISR进程调用该耽误时,要特别小心。
因此,如今考虑,既然系统定时器会固定产生中断,那是否可以通过在系统定时器的中断回调函数中设置一个标志位实现定时?
在网上还没有基于CubeMX生成的项目实现定时功能,当然后续工作更多定时会通过其他通用定时器实现,这篇文章仅供学习参考。
CubeMX设置

RCC、SYS、LED_GPIO和时钟树不再叙述,这里只看系统定时器。这里的抢占优先级设置为3,原来默认为15,不是很有标题。
https://i-blog.csdnimg.cn/direct/f3285f03a301429c84ef618013f32256.png
https://i-blog.csdnimg.cn/direct/b61b573be56a4752b9c50978bd1a5a1c.png
Keil代码

首先要找到系统定时器的中断服务函数,会发现其并没有直接调用HAL库函数。而是SysTick_Handler函数,里面只调用了一个HAL_IncTick()函数。
HAL库 中的系统中断服务函数为HAL_SYSTICK_IRQHandler(),必要手动添加到SysTick_Handler()中,而且重写中断回调函数HAL_SYSTICK_Callback()。
https://i-blog.csdnimg.cn/direct/3581ab4e2c7b46d49cf172bd4a28735a.jpeg
其他关键代码

main.h
https://i-blog.csdnimg.cn/direct/177c88df78c94b7697ae31f4fec94d03.png
main.c
https://i-blog.csdnimg.cn/direct/9e94f146b6ad438e838bb32b0cafbe1a.png
https://i-blog.csdnimg.cn/direct/e138151ab2b048d5ae123c2e61e52f1c.png
最后编译通过即可,紧张功能是每秒翻转一次毗连LED的GPIO的电平,实现1s亮1s灭,但不是通过耽误函数得到,而是通过状态标志位实现。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页: [1]
查看完整版本: [STM32学习条记(九)]CubeMX项目利用系统定时器SysTick的中断服务函数进行定时