时钟基准
STM32CubeMX默认会将Systick作为时钟基准,也可以手动指定其他定时器。
建议在 SYS 中把时钟基准(Timebase Source)改为普通定时器(例如 TIM6),并在 NVIC 中把该定时器中断的抢占优先级设为最高(0)。时钟基准仍是 SysTick,或定时器中断的抢占优先级不是 0 时,libxr parse 会给出警告。
示例
代码生成工具会根据STM32CubeMX的时钟配置,在 PlatformInit() 之前生成时基对象:
// Systick 作为时钟基准
static STM32Timebase timebase;
// 定时器作为时钟基准,例如 TIM2
static STM32TimerTimebase timebase(&htim2);
生成规则
- 时钟基准为 SysTick 时生成
STM32Timebase; - 时钟基准为 TIM 定时器时生成该定时器的
STM32TimerTimebase; - 随后的
PlatformInit()在裸机工程中不带参数,在 FreeRTOS 和 ThreadX 工程中带软件定时器的优先级和栈深度,见软件定时器。
STM32TimerTimebase 的构造函数只接受 TIM_HandleTypeDef*。时钟基准为 LPTIM 或 HRTIM 时,libxr gen 报错停止,不写入任何文件:
$ libxr gen -i .config.yaml -o User/app_main.cpp
[信息] 系统:FreeRTOS
[错误] 生成失败:HAL 时基是 LPTIM1,而 LibXR 的时基只支持 TIM 定时器(STM32TimerTimebase 接受 TIM_HandleTypeDef),未写入任何文件。请在 STM32CubeMX 的 SYS 中把 Timebase Source 改为 TIM 定时器(例如 TIM6)后重新生成
使用
// 获取微秒级时间戳
LibXR::Timebase::GetMicroseconds();
// 获取毫秒级时间戳
LibXR::Timebase::GetMilliseconds();