HAL 库中的 SYS 时基源(Timebase Source)选择Systick/TIM区别,以及 SysTick_Handler()

在基于STM32 HAL的项目中,一般需要维护两个主要的“时基”:

① HAL 时基、SYS 时基源
② 操作系统时基(仅在使用操作系统时考虑)

如何维护这些“时基”主要有两个因素:

① 裸机操作
② 与操作系统一起运行

1.裸机操作

这种情况下,唯一需要维护的时间就是SYS Timebase Source,也就是HAL库中的uwTick,是HAL库中维护的一个全局变量,比如在stm32f1xx_hal.c/stm32f4xx_hal.c等不同系列文件 两者都有以下定义:

在这里插入图片描述

在这里插入图片描述
由此,我们可以通过SysTick(tick timer)或者SYS Timebase Source来维护SYS Timebase Source。在裸机运行的情况下,我们一般选择默认的SysTick(tick timer)模式,直接放在SysTick_Handler()中断服务函数中进行维护。

用 CubeMX 生成代码后,你会看到SysTick_Handler()中断服务函数(没有不相关、不重要的代码和注释)如下:

在这里插入图片描述
HAL_SYSTICK_IRQHandler ()实际上是空的,留给用户实现它,而忽略它。所以SysTick_Handler()中断服务函数中最主要的是HAL_IncTick(),它的定义(没有无关的,不重要的代码和注释)如下:
在这里插入图片描述
这是裸机运行情况下SYS Timebase Source的维护。

2. 运行操作系统

前面提到的SYS Timebase Source是STM32 HAL库的新增部分,用于实现HAL_Delay()以及各种超时时钟参考。

使用OS(操作系统)后,OS的运行也需要时钟基准(简称“时基”)来管理任务和时间。而这个OS,时基一般都是由SysTick(tick timer)来维护的,那么就需要考虑“HAL时基”和“OS时基”是否要共享SysTick(tick timer)了。

2.1 分享SysTick(滴答计时器)

如果你用过 CubeMX,那你一定知道,当我们在 CubeMX 中选择启用 FreeRTOS 时,CubeMX 在生成代码时会报如下提示:
在这里插入图片描述

扫描二维码关注公众号,回复: 15247460 查看本文章

的一般含义是:强烈建议用户在使用时不要使用 FreeRTOS FreeRTOS SysTick(tick timer)作为“HAL时基”使用,因为需要用到FreeRTOS,最好换一个!!!

如果直接选择“是”忽略这个警告,代码也可以正常生成,最后可以看到生成的SysTick_Handler()中断服务函数(省略不相关、不重要的代码和注释)如下:
在这里插入图片描述
上面已经实现了HAL和OS共享SysTick(tick timer)来维护各自的时基。

由于本人从未在实际项目中这样分享过,所以不好猜测好不好,会有什么潜在风险等等。但是由于CubeMX(代表ST)都建议我们不要不要这样用,而且STM32还有很多其他的定时器可以使用,我们不需要这样挑资源。

2.2 不同时基的分别处理

CubeMX报出上述警告后,我们可以选择“No”,然后将SYS Timebase Source选项改成任意定时器,例如选择TIM7,如下图:
在这里插入图片描述
然后生成代码,可以看到:

操作系统时基使用的SysTick_Handler()中断服务函数(没有不相关、不重要的代码和注释)变为:
在这里插入图片描述
并且HAL的时基已经放入我们选择的TIM7的回调函数中(省略不相关、不重要的代码和注释)进行处理:
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_39835514/article/details/127209164