system_get_ns
旨在使用 STM32 的硬件定时器(在这个例子中是 TIM4)来获取系统时间,单位为纳秒。这个函数的逻辑是将 HAL 库的 HAL_GetTick()
函数返回的毫秒值转换成纳秒,并加上当前定时器的计数值相对于其自动重装载值(ARR,即定时器溢出值)的比例,也转换为纳秒。这样可以提供一个相对高精度的时间计数。
这里是函数的逐行解析:
extern TIM_HandleTypedef htim4;
- 这行代码声明了一个外部变量htim4
,它应该在其他地方(如在 HAL 库初始化代码中)定义,并代表 TIM4 定时器的句柄。TIM_HandleTypedef *hHalTim= &htim4;
- 这里创建了一个指向htim4
的指针hHalTim
。uint64_t ns = HAL_GetTick();
- 使用 HAL 库函数HAL_GetTick()
获取自系统启动以来的毫秒数,并将其存储在ns
中。cnt = __HAL_TIM_GET_COUNTER(hHalTim);
- 获取当前定时器的计数器值。reload = __HAL_TIM_GET_AUTORELOAD(hHalTim);
- 获取定时器的自动重装载值,即计数器的最大值。ns *= 1000000;
- 将毫秒转换为纳秒。ns += cnt * 1000000 / reload;
- 将定时器的当前计数值转换为纳秒并加到ns
上。这里通过计算cnt / reload
的比例,并将这个比例转换为纳秒来实现。return ns;
- 返回计算出的纳秒值。
这个函数假设 HAL_GetTick()
返回的是自系统启动以来经过的毫秒数,而定时器则用于提供更高分辨率的时间测量。在实际应用中,你需要确保定时器已经按照你的需求配置好,特别是它的时钟源和分频设置,以便它能提供所需的时间精度。
再请问一下HAL_GetTick() 计数值溢出,怎么处理,是1ms加一次吗?,TIM4定时器的周期是多少?