在基于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 在生成代码时会报如下提示:
的一般含义是:强烈建议用户在使用时不要使用 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的回调函数中(省略不相关、不重要的代码和注释)进行处理:
|