基于STM32构建EtherCAT主站(SOEM方案)4

这里讲一下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

生成海报
点赞 0

拉松

我还没有学会写个人说明!

暂无评论

发表评论

相关推荐

STM32F2————配置时钟延迟不准的问题

STM32F2配置时钟问题 笔者在本科毕业设计使用STM32F207芯片,但是在配置时钟时出现了问题。 问题 我按照F1写代码的延时函数放在F2竟然不准了 换个办法 使用Systick时钟也是不准,原因是笔者代

为什么重写printf函数没有用?

以前在网上找了无数方法去重写printf函数,但发现都没效果,今天偶然发现重写printf函数可以了,原因是以前没有勾选微库(Use MicroLlB)! 这里