这里讲一下soem的时间
1.选用Tim2作为系统时钟,主频为108M。TIM2_Init(1000000-1,108-1);即每1us计数一次,当计数1000000us(1s)时触发一次中断。每中断一次秒+1,TIM2->CNT的值即为微秒。因为soem采用的计时方式就是秒+微秒,因此达到要求。
2.也可以采用王惠娇同志的硕士论文《基于嵌入式平台的EtherCAT主站实现研究》中提到的主从定时器的方案。
3.也可以选用stm32的SysTick定时器作为时钟源,因为SysTick定时器是cortex-M处理器都拥有的定时器,freertos等嵌入式实时操作系统都是用SysTick定时器作为系统时钟的。
我给的源码是采用了主从定时器的方案。
void MX_TIM2_Init(void)
{
TIM_ClockConfigTypeDef sClockSourceConfig;
TIM_MasterConfigTypeDef sMasterConfig;
htim2.Instance = TIM2; //通用定时器2
htim2.Init.Prescaler = 108-1; //分频
htim2.Init.CounterMode = TIM_COUNTERMODE_UP; //向上计数器
htim2.Init.Period = 1000000-1; //自动装载值
htim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; //时钟分频因子
htim2.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_ENABLE;
HAL_TIM_Base_Init(&htim2);
sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL;
HAL_TIM_ConfigClockSource(&htim2, &sClockSourceConfig);
sMasterConfig.MasterOutputTrigger = TIM_TRGO_UPDATE;
sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_ENABLE;
HAL_TIMEx_MasterConfigSynchronization(&htim2, &sMasterConfig);
HAL_TIM_Base_Start(&htim2);
}
/* TIM3 init function */
void MX_TIM3_Init(void)
{
TIM_SlaveConfigTypeDef sSlaveConfig;
htim3.Instance = TIM3; //通用定时器3
htim3.Init.Prescaler = 0; //分频
htim3.Init.CounterMode = TIM_COUNTERMODE_UP; //向上计数器
htim3.Init.Period = 1000000; //自动装载值
htim3.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; //时钟分频因子
htim3.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_ENABLE;
HAL_TIM_Base_Init(&htim3);
sSlaveConfig.SlaveMode = TIM_SLAVEMODE_EXTERNAL1;
sSlaveConfig.InputTrigger = TIM_TS_ITR1;
HAL_TIM_SlaveConfigSynchronization(&htim3, &sSlaveConfig);
HAL_TIM_Base_Start(&htim3);
}
uint32_t GetSec(void)
{
return TIM3->CNT;
}
uint32_t GetUSec(void)
{
return TIM2->CNT;
}
版权声明:本文为CSDN博主「拉松」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/cln512/article/details/122094054
暂无评论