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定时器的周期是多少?
