系统时钟获取,能解释一下吗?

system_get_ns 旨在使用 STM32 的硬件定时器(在这个例子中是 TIM4)来获取系统时间,单位为纳秒。这个函数的逻辑是将 HAL 库的 HAL_GetTick() 函数返回的毫秒值转换成纳秒,并加上当前定时器的计数值相对于其自动重装载值(ARR,即定时器溢出值)的比例,也转换为纳秒。这样可以提供一个相对高精度的时间计数。

这里是函数的逐行解析:

  1. extern TIM_HandleTypedef htim4; - 这行代码声明了一个外部变量 htim4,它应该在其他地方(如在 HAL 库初始化代码中)定义,并代表 TIM4 定时器的句柄。
  2. TIM_HandleTypedef *hHalTim= &htim4; - 这里创建了一个指向 htim4 的指针 hHalTim
  3. uint64_t ns = HAL_GetTick(); - 使用 HAL 库函数 HAL_GetTick() 获取自系统启动以来的毫秒数,并将其存储在 ns 中。
  4. cnt = __HAL_TIM_GET_COUNTER(hHalTim); - 获取当前定时器的计数器值。
  5. reload = __HAL_TIM_GET_AUTORELOAD(hHalTim); - 获取定时器的自动重装载值,即计数器的最大值。
  6. ns *= 1000000; - 将毫秒转换为纳秒。
  7. ns += cnt * 1000000 / reload; - 将定时器的当前计数值转换为纳秒并加到 ns 上。这里通过计算 cnt / reload 的比例,并将这个比例转换为纳秒来实现。
  8. return ns; - 返回计算出的纳秒值。

这个函数假设 HAL_GetTick() 返回的是自系统启动以来经过的毫秒数,而定时器则用于提供更高分辨率的时间测量。在实际应用中,你需要确保定时器已经按照你的需求配置好,特别是它的时钟源和分频设置,以便它能提供所需的时间精度。

再请问一下HAL_GetTick() 计数值溢出,怎么处理,是1ms加一次吗?,TIM4定时器的周期是多少?