stm32获取毫秒时间戳
STM32平台上实现毫秒级时间戳
在STM32平台上,可以通过多种方式来实现毫秒级的时间戳功能。一种常见的方式是利用系统的滴答定时器(SysTick),该定时器能够提供高精度的计时服务。
对于基于STM32F4系列微控制器而言,其内置了一个24位向下计数的自动重装载计数器作为系统滴答定时器(SysTick),当此计数值减至零时会产生中断并重新加载设定好的初值继续倒计数[^1]。通过配置这个定时器每过一毫秒触发一次中断,在每次进入中断处理程序时增加全局变量ms_ticks
的值即可得到当前经过了多少个毫秒[^2]。
下面给出一段简单的C语言代码用于初始化SysTick以及定义获取当前毫秒数的功能:
#include "stm32f4xx_hal.h"
volatile uint32_t ms_ticks = 0; /* 定义一个全局变量用来存储已经过去的毫秒数 */
void SysTick_Init(void){
HAL_SYSTICK_Config(SystemCoreClock / 1000); // 设置每隔1ms发生一次SYSTICK中断
}
uint32_t GetTickCount(void){
return ms_ticks;
}
此外,如果希望获得更加精准的时间管理,则可以考虑使用实时钟(RTC)配合LSE低速外部晶振工作模式下的亚秒寄存器(Sub Second Register)。这种方式虽然复杂度稍有提升,但对于那些对时间准确性要求较高的应用场景来说是非常必要的选择之一。
stm32 毫秒级时间戳
实现毫秒级时间戳
为了在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预分频器剩余次数对应的毫秒数值,并将其累加到总的毫秒计数值中去。
stm32定时器作为时间戳
STM32定时器实现时间戳功能
STM32定时器能够用于创建高精度的时间戳机制,这对于记录事件发生的具体时刻非常有用。为了利用STM32定时器实现时间戳功能,通常会选择一个具有较高频率的定时器作为系统滴答源,并将其配置为自由运行模式。
配置定时器为时间戳用途
当定时器被配置成向上计数模式时,在每次上电或复位之后从0开始增加直到溢出回到最大值再重新开始计算。这种特性非常适合用来做时间测量工具。具体来说:
- 设置定时器工作于向上计数模式;
- 启用自动重装载预分频系数以获得所需的分辨率;
- 开启更新中断以便每当计数值达到设定的最大限值时触发一次ISR(Interrupt Service Routine),从而允许软件读取当前计数值并保存下来作为某个特定事件的发生时刻[^1]。
下面是一个简单的例子展示如何初始化TIM2定时器来充当时间戳角色:
#include "stm32f1xx_hal.h"
// 假设已经完成了必要的硬件初始化...
void TIM2_Init(void){
__HAL_RCC_TIM2_CLK_ENABLE(); // 使能TIM2时钟
TIM_HandleTypeDef htim2;
htim2.Instance = TIM2;
htim2.Init.Prescaler = 8399; // 设定预分频器,假设APB1=84MHz,则此定时器每毫秒递增一次
htim2.Init.CounterMode = TIM_COUNTERMODE_UP; // 上升沿计数方式
htim2.Init.Period = 65535; // 自动重载周期(ARR),这里设置较大不会轻易溢出
htim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
HAL_TIM_Base_Init(&htim2); // 初始化基础定时器结构体成员变量
HAL_TIM_Base_Start_IT(&htim2); // 开始IT模式下的计数过程
}
uint32_t GetTimestamp_ms(void){ // 获取自启动以来经过了多少ms
return __HAL_TIM_GET_COUNTER(&htim2);
}
上述代码片段展示了如何初始化一个定时器实例以及定义了一个获取当前时间的方法GetTimestamp_ms()
。该方法返回的是自程序执行起至现在所经历过的毫秒数。需要注意的是实际应用中可能还需要考虑定时器溢出的情况处理逻辑[^3]。
相关推荐
















