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

有很多文章说明了由于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灭,但不是通过延迟函数得到,而是通过状态标志位实现。

相关推荐
Godspeed Zhao7 小时前
从零开始学AI25——无监督学习之层次聚类
学习·机器学习·聚类
David猪大卫14 小时前
【C++修炼】map 和 set 的使用
c语言·开发语言·数据结构·c++·经验分享·笔记·学习
HPtiger14 小时前
C++ 入门笔记:从 C 到 C++ 的核心过渡(命名空间、输入输出、缺省参数、重载、引用、内联)
c语言·c++·学习
星恒随风14 小时前
MySQL 从零入门(三):表的约束详解
linux·服务器·数据库·笔记·mysql
Zw-awa15 小时前
C语言函数指针与宏实战:从回调、表驱动菜单到X-Macro,讲透嵌入式代码解耦
stm32
fengci.15 小时前
CTF2MISC中等部分
开发语言·前端·学习
YueTann17 小时前
mgtv5th-baseline学习
学习
蒸蒸yyyyzwd18 小时前
从后端面经学到的 3 个知识
笔记·学习
17岁的勇气18 小时前
Unity Shader unity文档学习笔记(二十二):shader变体
笔记·学习·unity
坤坤子吖19 小时前
Linux网络编程:自定义应用层协议与 JSON 序列化
linux·服务器·网络·c++·笔记·json