如何给STM32F4写一个时差函数
How to write a time difference function to STM32F4
我正在研究 STM32F4,而且还很新。我知道 C 的基础知识,但经过 1 天多的研究,我仍然没有找到解决方案。
我只是想自己做一个延迟函数,处理器运行在 168MHz ( HCLK )。所以我的直觉告诉我它每秒产生 168x10^6 个时钟周期。所以方法应该是这样的,
1-将当前时钟计数存储到变量
2-Time diff = (任意时刻的时钟值-存储的起始时钟值)/168000000
这个流程应该给我以秒为单位的时差,然后我可以用它来转换我想要的任何东西。
但是,不幸的是,尽管看起来很容易,但我无法对 MCU 实施任何方法。
我尝试了 time.h 但它无法正常工作。例如,clock() 一遍又一遍地给出相同的结果,而时间(自 1970 年以来 returns 秒)给出十六进制 0xFFFFFFFF(-1,我猜是错误)。
谢谢。
编辑:在写作时我假设像 clock() 这样的函数将 return 自程序流开始以来的总时钟计数,但现在我认为在 40 亿/16800 万秒后它将溢出 uint32_t 尺寸。我真的很困惑。
答案取决于所需的精度和间隔。
对于具有 sub-microsecond 精度的较短间隔,有一个 。你的猜测是正确的,它会在 232/168*106 ~ 25.5 秒后溢出。
对于更长的间隔,可以预分频 以支持 168 MHz 时钟的任何可能细分的定时器。最常用的设置是将 SysTick 定时器设置为以 1 kHz 的频率生成中断,从而使软件计数器递增。读取此计数器将给出自启动以来经过的毫秒数。由于它通常是一个 32 位计数器,它会在 49.7 天后溢出。 HAL 库以这种方式设置 SysTick,然后可以使用 HAL_GetTick()
函数查询计数器。
对于更长或更专业的计时要求,您可以使用保持日历时间的 RTC
外设,或 TIM
外设(基本、通用和高级定时器),它们有自己的预分频器, 它们可以安排在 master-slave 设置中以提供几乎任意的精度和间隔。
我正在研究 STM32F4,而且还很新。我知道 C 的基础知识,但经过 1 天多的研究,我仍然没有找到解决方案。
我只是想自己做一个延迟函数,处理器运行在 168MHz ( HCLK )。所以我的直觉告诉我它每秒产生 168x10^6 个时钟周期。所以方法应该是这样的,
1-将当前时钟计数存储到变量
2-Time diff = (任意时刻的时钟值-存储的起始时钟值)/168000000
这个流程应该给我以秒为单位的时差,然后我可以用它来转换我想要的任何东西。
但是,不幸的是,尽管看起来很容易,但我无法对 MCU 实施任何方法。
我尝试了 time.h 但它无法正常工作。例如,clock() 一遍又一遍地给出相同的结果,而时间(自 1970 年以来 returns 秒)给出十六进制 0xFFFFFFFF(-1,我猜是错误)。
谢谢。
编辑:在写作时我假设像 clock() 这样的函数将 return 自程序流开始以来的总时钟计数,但现在我认为在 40 亿/16800 万秒后它将溢出 uint32_t 尺寸。我真的很困惑。
答案取决于所需的精度和间隔。
对于具有 sub-microsecond 精度的较短间隔,有一个
对于更长的间隔,可以预分频 以支持 168 MHz 时钟的任何可能细分的定时器。最常用的设置是将 SysTick 定时器设置为以 1 kHz 的频率生成中断,从而使软件计数器递增。读取此计数器将给出自启动以来经过的毫秒数。由于它通常是一个 32 位计数器,它会在 49.7 天后溢出。 HAL 库以这种方式设置 SysTick,然后可以使用 HAL_GetTick()
函数查询计数器。
对于更长或更专业的计时要求,您可以使用保持日历时间的 RTC
外设,或 TIM
外设(基本、通用和高级定时器),它们有自己的预分频器, 它们可以安排在 master-slave 设置中以提供几乎任意的精度和间隔。