基于STM32H743的微秒级时间同步方案:PPS+TIM硬件同步实现 基于STM32H743的微秒级时间同步方案PPSTIM硬件同步实现摘要本文详细介绍了基于STM32H743微控制器的高精度时间同步方案利用GNSS模块输出的PPS每秒脉冲信号与定时器硬件同步功能TRGO实现微秒级时间戳精度。方案采用双定时器架构结合滑动平均滤波算法进行频率校准适用于高精度数据采集、工业控制等对时间精度要求较高的应用场景。一、方案架构1.1 整体设计┌─────────────────────────────────────────────────────────────────────┐ │ 时间同步系统架构 │ ├─────────────────────────────────────────────────────────────────────┤ │ │ │ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │ │ │ GNSS模块 │ │ STM32H743 │ │ 应用程序 │ │ │ │ │ │ │ │ │ │ │ PPS输出 │─────▶│ TIM2捕获 │ │ │ │ │ │ NMEA输出 │─────▶│ UART接收 | │ | │ └─────────────┘ └──────┬──────┘ │ 获取时间戳 │ │ │ │ └─────────────┘ │ │ ▼ │ │ ┌─────────────┐ │ │ │ TIM5时间戳 │ │ │ │ (微秒级) │ │ │ └─────────────┘ │ │ │ └─────────────────────────────────────────────────────────────────────┘1.2 核心组件组件功能精度TIM2PPS信号捕获、TRGO主定时器100nsTIM5微秒级时间戳生成、TRGO从定时器100nsTRGO硬件同步信号连接TIM2→TIM5100nsGNSS提供PPS秒脉冲和NMEA时间信息10-100ns二、硬件配置2.1 定时器时钟计算基于STM32H743的时钟树配置#defineSYNC_TIM_ARR(10000000-1)// TIM5周期值#defineSYNC_TIM_PRE(20-1)// 预分频器时钟计算APB1时钟 100MHzTIM时钟 APB1 × 2 200MHzAPB预分频1时实际计数频率 200MHz / 20 10MHz100ns/tickTIM5溢出周期 10000000 ticks / 10MHz 1秒2.2 GPIO配置PA15引脚配置为TIM2_CH1/**TIM2 GPIO Configuration PA15 ------ TIM2_CH1 */GPIO_InitStruct.PinGPIO_PIN_15;GPIO_InitStruct.ModeGPIO_MODE_AF_PP;GPIO_InitStruct.PullGPIO_NOPULL;GPIO_InitStruct.SpeedGPIO_SPEED_FREQ_LOW;GPIO_InitStruct.AlternateGPIO_AF1_TIM2;HAL_GPIO_Init(GPIOA,GPIO_InitStruct);三、核心算法实现3.1 定时器初始化TIM2 - 主定时器PPS捕获TRGO输出voidtimesync_pps_tim_init(void){TIM_MasterConfigTypeDef sMasterConfig{0};TIM_IC_InitTypeDef sConfigIC{0};__HAL_RCC_TIM2_CLK_ENABLE();htim2.InstanceTIM2;htim2.Init.PrescalerSYNC_TIM_PRE;htim2.Init.CounterModeTIM_COUNTERMODE_UP;htim2.Init.Period0xffffffff;// 32位自由计数htim2.Init.ClockDivisionTIM_CLOCKDIVISION_DIV1;HAL_TIM_Base_Init(htim2);// 配置TRGOCC1捕获事件作为触发输出sMasterConfig.MasterOutputTriggerTIM_TRGO_OC1;sMasterConfig.MasterSlaveModeTIM_MASTERSLAVEMODE_ENABLE;HAL_TIMEx_MasterConfigSynchronization(htim2,sMasterConfig);// 配置输入捕获sConfigIC.ICPolarityTIM_INPUTCHANNELPOLARITY_RISING;sConfigIC.ICSelectionTIM_ICSELECTION_DIRECTTI;sConfigIC.ICPrescalerTIM_ICPSC_DIV1;sConfigIC.ICFilter0;HAL_TIM_IC_ConfigChannel(htim2,sConfigIC,TIM_CHANNEL_1);HAL_TIM_IC_Start_IT(htim2,TIM_CHANNEL_1);HAL_NVIC_SetPriority(TIM2_IRQn,PRO_TIME_SYNC,0);HAL_NVIC_EnableIRQ(TIM2_IRQn);}TIM5 - 从定时器时间戳生成硬件复位voidtimesync_stamp_tim_init(void){TIM_SlaveConfigTypeDef sSlaveConfig{0};__HAL_RCC_TIM5_CLK_ENABLE();htim5.InstanceTIM5;htim5.Init.PrescalerSYNC_TIM_PRE;htim5.Init.CounterModeTIM_COUNTERMODE_UP;htim5.Init.PeriodSYNC_TIM_ARR;// 1秒周期htim5.Init.ClockDivisionTIM_CLOCKDIVISION_DIV1;HAL_TIM_Base_Init(htim5);// 配置从模式接收TIM2的TRGO信号进行硬件复位sSlaveConfig.SlaveModeTIM_SLAVEMODE_RESET;sSlaveConfig.InputTriggerTIM_TS_ITR1;// ITR1 TIM2HAL_TIM_SlaveConfigSynchro(htim5,sSlaveConfig);HAL_TIM_Base_Start_IT(htim5);HAL_NVIC_SetPriority(TIM5_IRQn,PRO_TIME_SYNC,0);HAL_NVIC_EnableIRQ(TIM5_IRQn);}3.2 TRGO硬件同步机制TRGOTimer Re-Output Trigger是STM32定时器的硬件同步机制TRGO源触发条件适用场景TIM_TRGO_OC1捕获/比较1匹配PPS捕获场景TIM_TRGO_UPDATE更新事件(溢出)周期同步场景TIM_TRGO_ENABLE计数器使能(CEN)启动同步场景从模式配置从模式行为适用场景TIM_SLAVEMODE_RESET触发时复位计数器PPS秒对齐TIM_SLAVEMODE_TRIGGER触发时启动计数延迟测量优势完全由硬件完成无需CPU介入消除了中断延迟。3.3 频率校准算法voidTIM2_IRQHandler(void){int32_tdiff;uint32_tcapture;if(__HAL_TIM_GET_FLAG(htim2,TIM_FLAG_CC1)SET){__HAL_TIM_CLEAR_FLAG(htim2,TIM_FLAG_CC1);captureHAL_TIM_ReadCapturedValue(htim2,TIM_CHANNEL_1);// GNSS时间同步秒级if(time_sync_flag){__HAL_TIM_SET_AUTORELOAD(htim5,pps_error_avgSYNC_TIM_ARR);time_secondsnmea_seconds;time_sync_flag0;gnss_sync_pending0;last_sync_secnmea_seconds;}// 频率校准微秒级if(last_pps_capture!0){if(time_seconds-last_pps_stampPPS_TIMEOUT_SEC){// 超时重置校准参数last_pps_capture0;last_pps_stamp0;pps_error_avg0;pps_error_index0;pps_error_count0;}else{// 计算与理想值的偏差diff(int32_t)(capture-last_pps_capture);pps_error_buffer[pps_error_index]diff-(int32_t)SYNC_TIM_ARR;// 滑动平均滤波if(pps_error_indexPPS_AVG_WINDOW)pps_error_index0;if(pps_error_countPPS_AVG_WINDOW)pps_error_count;int64_tsum0;for(inti0;ipps_error_count;i)sumpps_error_buffer[i];pps_error_avg(int32_t)(sum/pps_error_count);}}last_pps_capturecapture;last_pps_stamptime_seconds;}}校准原理连续两次PPS捕获值的差值diff反映了实际1秒的计数值理想值为SYNC_TIM_ARR 1 10000000偏差值diff - SYNC_TIM_ARR用于校准TIM5的AUTORELOAD值滑动平均滤波窗口大小8有效抑制PPS信号的随机抖动3.4 时间戳获取voidtime_sync_get_stamp(uint32_t*sec,uint32_t*usec){uint32_tcnt1,cnt2;uint32_ts;cnt1__HAL_TIM_GET_COUNTER(htim5);stime_seconds;cnt2__HAL_TIM_GET_COUNTER(htim5);// 溢出检测cnt2 cnt1表示读取过程中发生了溢出if(sec)*sec(cnt2cnt1)?(s1):s;if(usec)*useccnt2/10;// 10MHz计数 → 100ns/tick → /10 us}关键设计通过两次读取计数器并检测溢出确保时间戳的原子性。四、时间同步流程4.1 GNSS同步流程1. GNSS模块输出NMEA RMC消息 2. 解析NMEA消息 3. 设置time_sync_flag 1等待PPS 4. PPS上升沿触发TIM2捕获中断 5. TIM5由TRGO硬件自动复位 6. 更新time_seconds为NMEA解析的秒数 7. 应用频率校准值修改TIM5 AUTORELOAD五、精度分析5.1 误差源分析误差源影响量级PPS信号抖动GNSS模块输出的PPS抖动10-100nsTIM2输入捕获延迟TIM2硬件捕获响应时间100nsTRGO传播延迟TIM2→TIM5的硬件传播时间100nsTIM5复位延迟硬件复位的响应时间100ns晶振漂移系统时钟与标准时间的偏差ppm级别5.2 精度提升对比方案复位延迟精度软件复位中断中__HAL_TIM_SetCounter数百ns~数us数百ns~数usTRGO硬件复位100ns数十ns~100ns5.3 校准效果假设系统时钟比标准快10ppm常见晶振偏差每秒多计数 10000000 × 10e-6 100 ticks 10us通过校准TIM5的AUTORELOAD值减少100补偿频率偏差六、总结本文介绍的基于STM32H743的时间同步方案具有以下特点高精度利用TRGO硬件同步TIM5复位延迟低于100ns高稳定性滑动平均滤波有效抑制PPS抖动低延迟时间戳获取函数简单执行时间极短该方案已在实际项目中验证适用于高精度数据采集、工业控制等对时间精度要求较高的场景。