STM32实现毫秒级时间同步

提起“时间同步”这个概念,大家可能很陌生。一时间搞不清楚是什么意思。

我理解“时间同步”可以解决多个传感器采集数据不同时的问题,让多个传感器同时采集数据。

打个比方。两个人走路,都是100毫秒走一步(频率相同是前提,一般传感器都支持调整频率,容易调到同频,但不容易同相位,因为没法同时启动)。就是两个人起点不同,就走不到一起去。

为了使他们对齐,需要“时间同步”这个概念。

怎么样才能使他们走齐呢?需要一个人发送一个信号,比如说:“停下来”。当另一个人听到这个信号时,他倒退一段距离,和这个人对齐。然后就可以一起走了。

转到STM32上,一个STM32(A)需要给另一个STM32(B)上发送信号,另一个接收到后,开始执行采集命令。而A需要延时一段时间执行采集命令,才能和B同时采集,即时间同步。

那么怎么知道A要延时多久执行采集命令呢?可以用示波器硬件测量,A发B收之间的时间间隔。也可以A发B收,然后B发A收,得到的时间间隔除以2,得到A发B收的时间间隔。(这是软件测量法)。

STM32需要使能RTC时钟,用Hal_Get_Rtc_Time函数,STM32的时间戳。但是弊端是无法精确到毫秒,只能达到秒级。因为RTC时钟亚秒计数器无法设置给另一个STM32(即HAL_Set_Rtc_Time只能设置时、分、秒,无法设置亚秒寄存器,这点可以试一下)。

所以STM32要实现小于一毫秒的时间同步,需要再开一个微秒定时器,里面的数值作为微秒时间值,和RTC时钟配合起来计时。在RTC_Init的时候,维护一个uint16_t的变量Micros,然后在另一个函数里extern声明一下,再调用。STM32启动微秒定时器中断,每隔一微秒加一。(实际测试起来,微秒中断太可怕了,达不到这个性能,可以这么写,但是执行不了,因为速度太快,中断函数里的程序执行不过来,所以我采用的是100微秒的中断,在里面加100,维护微秒值Micros)。

这样就出现了A和B的两个RTC时钟,都是100微秒中断计时一次。同频但不同相。

为了实现同相,需要发信号。比如Stm32外接一个Wifi模块,蓝牙模块,或Rola模块。总之是一个可以发送接收的模块。

流程:A发送RTC时间戳,延时一段时间(发送到接收的时间),触发采集。

B接收到时间戳,立即触发采集。这样两者就是同时触发的啦。

A和B时间同步。

### STM32 RTC 实现毫秒级精度 为了在STM32实现RTC的毫秒级精度,可以利用RTC模块中的亚秒特性。通常情况下,RTC主要用于处理秒级别的计时,但通过巧妙运用其内部机制,能够达到更精细的时间分辨率。 #### 使用亚秒寄存器提高时间精度 RTC具备一个称为Sub Second Register (SSR) 或者 Sub_Seconds 寄存器的功能,它能存储当前秒钟内的剩余微秒数或纳秒数,从而允许系统追踪小于一秒的时间间隔[^3]。当需要更高精度的时间测量时,可以通过读取此寄存器并将其转换成相应的毫秒值来进行计算。 #### 配置RTC以支持高精度模式 要在项目中启用这一功能,首先需确保已经正确初始化了RTC硬件资源,并设置了合适的预分频系数使得每秒中断一次。接着,在每次更新事件发生之前捕获SSR寄存器的内容,这样就能获取到精确至毫秒甚至更低单位的时间戳。 以下是具体的操作方法: 1. **设置RTC工作参数** - 启动LSE作为外部低速振荡源给RTC供电; - 设置RTC Prescaler以便于产生期望频率下的周期性脉冲; 2. **编写软件逻辑** ```c #include "stm32f4xx_hal.h" // 假设已定义好必要的变量和函数声明... void HAL_RTC_AlarmAEventCallback(RTC_HandleTypeDef *hrtc){ uint32_t subseconds; /* 获取当前时刻距离下一整秒还有多少tick */ subseconds = __HAL_RTC_GET_SUBSECOND(hrtc); // 将subsecond转化为ms, 这里假设Prescaler设定为使RTC每8192个ticks等于1s, // 则每个tick代表约0.122 ms. float millisecond_fraction = ((float)(8192-subseconds)/8192)*1000; // 处理得到的具体毫秒数值... } ``` 这段代码展示了如何在一个报警回调函数中访问RTC子秒寄存器的数据,并据此推算出具体的毫秒偏移量。需要注意的是,实际应用过程中应当根据所使用的MCU型号调整`__HAL_RTC_GET_SUBSECOND()`宏定义以及对应的换算比例。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值