如何将时差函数写入STM32F4

时间:2019-06-26 16:30:37

标签: c time delay stm32

我正在开发STM32F4,而且还很新。我了解C的基础知识,但经过1天多的研究,我仍然没有找到解决方案。

我只是想自己做一个延迟功能,处理器以168MHz(HCLK)运行。所以我的直觉说,它每秒钟产生168x10 ^ 6个时钟周期。所以方法应该是这样的,

1-将当前时钟计数存储到变量

2-Time diff =(任何时间的时钟值-存储的起始时钟值)/ 168000000

此流程应该给我以秒为单位的时差,然后我可以用它来转换我想要的任何东西。

但是,不幸的是,尽管看起来很简单,但我无法对MCU实现任何方法。

我尝试了time.h,但无法正常工作。例如,clock()反复给出相同的结果,而time(从1970开始返回秒)返回十六进制的0xFFFFFFFF(-1,我想是错误)。

谢谢。

编辑:在撰写本文时,我假设某些函数如clock()自程序流开始以来将返回总时钟计数,但现在我认为经过40亿/1.68亿秒后,它将溢出uint32_t大小。我真的很困惑。

1 个答案:

答案 0 :(得分:0)

答案取决于所需的精度和间隔。

对于具有亚微秒精度的较短间隔,有一个cycle counter。您的怀疑是正确的,它将在2 32 / 168 * 10 6 〜25.5秒后溢出。

对于更长的时间间隔,可以对其进行预分频以支持168 MHz时钟的任何可能细分。最常用的设置是SysTick定时器,该定时器设置为以1 kHz的频率生成一个中断,从而使软件计数器递增。读取此计数器将给出自启动以来经过的毫秒数。由于它通常是32位计数器,因此它将在49.7天后溢出。 HAL库以这种方式设置SysTick,然后可以使用HAL_GetTick()函数查询计数器。

对于更长或更专业的计时要求,您可以使用保留日历时间的RTC外设,​​或TIM外设(基本,通用和高级定时器),它们有自己的预分频器,并且可以将它们安排在主从设置中,以提供几乎任意的精度和间隔。