stm32 毫秒级时间戳
时间: 2025-01-14 21:45:28 浏览: 40
实现毫秒级时间戳
为了在STM32上实现毫秒级时间戳,可以通过配置RTC模块来完成这一目标。具体来说,利用RTC预分频器及其余数寄存器(RTC_DIVH、RTC_DIVL),这些寄存器能够提供更精细的时间测量单位[^3]。
启用RTC并初始化
首先需要启用RTC时钟源,并对其进行基本初始化:
void MX_RTC_Init(void)
{
/* 定义局部变量 */
RTC_TimeTypeDef sTime = {0};
RTC_DateTypeDef DateToUpdate = {0};
/** 初始化RTC和实时时钟
* @param hrtc: RTC句柄指针
*/
hrtc.Instance = RTC;
hrtc.Init.HourFormat = RTC_HOURFORMAT_24; // 设置时间为24小时制
hrtc.Init.AsynchPrediv = 127; // 异步预分频系数(假设LSE=32.768KHz,则此值应设为32768/256-1=127)
hrtc.Init.OutPut = RTC_OUTPUT_DISABLE; // 禁用RTC输出功能
hrtc.Init.OutPutPolarity = RTC_OUTPUT_POLARITY_HIGH;
hrtc.Init.OutPutType = RTC_OUTPUT_TYPE_OPENDRAIN;
if (HAL_RTC_Init(&hrtc) != HAL_OK){
Error_Handler();
}
/* 更新时间和日期 */
sTime.Hours = 0x0;
sTime.Minutes = 0x0;
sTime.Seconds = 0x0;
if(HAL_RTC_SetTime(&hrtc,&sTime,RTC_FORMAT_BCD)!= HAL_OK){
Error_Handler();
}
}
上述代码片段展示了如何通过修改AsynchPrediv
参数调整异步预分频因子以适应不同频率的外部低速晶振(LSE)[^1]。
获取当前时间至毫秒精度
接着定义一个函数用于读取当前时间直至毫秒级别:
uint32_t GetMsTimestamp(void)
{
uint32_t ms_timestamp = 0;
RTC_TimeTypeDef sTime;
int subsecond_value;
HAL_RTC_GetTime(&hrtc, &sTime, RTC_FORMAT_BIN);
ms_timestamp += ((uint32_t)sTime.Hours)*3600*1000UL + \
((uint32_t)sTime.Minutes)*60*1000UL + \
((uint32_t)sTime.Seconds)*1000UL;
// 计算亚秒部分
subsecond_value = __HAL_RTC_GET_SUBSECOND_VALUE(); // 假设有这样一个宏定义可获取subseconds value
ms_timestamp += (uint32_t)(subsecond_value / (__HAL_RCC_LSECLK()/1000));
return ms_timestamp;
}
这里的关键在于计算出RTC预分频器剩余次数对应的毫秒数值,并将其累加到总的毫秒计数值中去。
相关推荐


















