【发布时间】:2019-06-26 16:30:37
【问题描述】:
我正在研究 STM32F4 并且非常新。我知道 C 的基础知识,但经过超过 1 天的研究,我仍然没有找到解决方案。
我只是想自己做一个延迟函数,处理器运行在 168MHz ( HCLK )。所以我的直觉说它每秒产生 168x10^6 个时钟周期。所以方法应该是这样的,
1-将当前时钟计数存储到变量中
2-Time diff = (任意时刻的时钟值-存储的起始时钟值) / 168000000
这个流程应该给我以秒为单位的时间差,然后我可以用它来转换我想要的任何东西。
但是,不幸的是,尽管它看起来很简单,但我无法为 MCU 实现任何方法。
我试过 time.h 但它不能正常工作。例如,clock() 一遍又一遍地给出相同的结果,而时间(自 1970 年以来返回秒数)给出十六进制 0xFFFFFFFF(-1,我猜是错误)。
谢谢。
编辑:在编写时我假设某些函数(如 clock())会返回自程序流开始以来的总时钟计数,但现在我认为在 40 亿/1.68 亿秒后它会溢出 uint32_t 大小。我真的很困惑。
【问题讨论】:
-
systick 中断。
clock()是一个标准库函数。很可能您将gcc与`newlib` 与nosys.specs一起使用,它只是将clock实现为retunrning -1。同样clock()返回clock_t,它可能不是uint32_t,而是你想要的。 -
@Kamil Cuk 是不是和TIMERS有关?
-
datashett 更具体地提到了“SysTick”,而不是计时器,它是一个单独的中断。通常人们在实现中使用hal functions。您的目标是自己触摸寄存器还是使用一些 HAL 层?
-
如果您碰巧将
newlib与nosys一起使用,那么clock() 只需调用_times_r(),它只返回-1 并设置errno=ENOSYS。在嵌入式平台上,您必须自己实现系统(或使用某些实现)。使用newlib,您可以使用clock_t的实现添加machine/_types.h文件,并使用您自己的clock_t clock(void) { return HAL_GetTick(); }实现进行编译 -
外设时钟(那些驱动定时器和其他外设硬件)通常比 CPU 时钟慢得多。您多次获得相同的时间并不令我感到惊讶。请耐心等待,它可能每秒只更改一次。编写一个循环轮询,直到更改并进行某种输出。您可能会看到 1Hz 模式。