打印
[其他ST产品]

为什么我设置STM32的2定时器主从模式内部互联却不同步?

[复制链接]
167|13
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
内政奇才|  楼主 | 2023-12-20 11:36 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
/*变量定义*/
//extern ledKeyState  led_key0 ;
uint16_t tiM3per = 500;
int main(void)
{

   vRCC_Config();                            //初始化系统,使得系统频率为72M
Init_Delay(72);

TIM_MasterSlaveModeInit(12,TIM3per,TIM3per>>1);
// TIM_Cmd(TIM2,ENABLE);
// TIM_Cmd(TIM3,ENABLE);

   
   while(1)
   {
//  TIM3per = TIM3per - 2;
//  if(TIM3per < 50)
//   TIM3per = 100;
//  TIM_SetAutoreload(TIM3, TIM3per);//设置TIM3的重装值
//  TIM_SetCompare1(TIM3,TIM3per>>1);//设置占空比为50%
//    TIM_Cmd(TIM3,ENABLE);//使能TIM3;
   }
}

/********************************************************************************
* 函数名:TIM_MasterSlaveModeInit
* 功能  :设置定时器主从模式
* 输入  : TIM2per  定时器TIM2重载值
*         TIM3per  定时器TIM3重载值
*         TIM3Compare1  定时器TIM3比较预装载值
* 输出  :无      
********************************************************************************/

void TIM_MasterSlaveModeInit(uint16_t TIM2per, uint16_t TIM3per, uint16_t TIM3Compare1)
{
   TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct;
   TIM_OCInitTypeDef TIM_OCInitStruct;
   GPIO_InitTypeDef GPIO_InitStruct;
NVIC_InitTypeDef NVIC_InitStructure;
   
/*使能外设时钟*/
   RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);
   RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);
   RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
   RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
   
   GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP;            //复用推挽输出
  GPIO_InitStruct.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_6;       //PA0
   GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
   GPIO_Init(GPIOA,&GPIO_InitStruct);
   
   /*TIM2工作在单脉冲下*/
   TIM_TimeBaseInitStruct.TIM_ClockDivision = TIM_CKD_DIV1;     //没有时钟分割
  TIM_TimeBaseInitStruct.TIM_CounterMode = TIM_CounterMode_Up; //向上计数模式
  TIM_TimeBaseInitStruct.TIM_Prescaler = 719;                 //预分频值,每100us计数一次
  TIM_TimeBaseInitStruct.TIM_Period = TIM2per;                 //重装值
  TIM_TimeBaseInit(TIM2,&TIM_TimeBaseInitStruct);
   
//  TIM_SelectOnePulseMode(TIM2,TIM_OPMode_Single);              //设置TIM2在单脉冲模式
  TIM_OC1PreloadConfig(TIM2,TIM_OCPreload_Enable);
   
   
   TIM_OCInitStruct.TIM_OCMode = TIM_OCMode_PWM1;               //在向上计数时
  TIM_OCInitStruct.TIM_OutputState = TIM_OutputState_Enable;   //OC1输出使能
  TIM_OCInitStruct.TIM_OCPolarity = TIM_OCPolarity_High;       //有效电平为高
  TIM_OCInitStruct.TIM_Pulse = 7;                              //预装载值
  TIM_OC1Init(TIM2,&TIM_OCInitStruct);

/*TIM2中断设置*/
TIM_ClearFlag(TIM2,TIM_FLAG_Update);
   TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE);


   NVIC_SetPriorityGrouping(NVIC_PriorityGroup_0);
   NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;  
   NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
   NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
   NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
   NVIC_Init(&NVIC_InitStructure);
/*********************/

// TIM_SelectMasterSlaveMode(TIM2,TIM_MasterSlaveMode_Enable);//使能TIM2的主从模式
TIM_SelectSlaveMode(TIM2, TIM_SlaveMode_External1);          //TIM2为上升沿为触发时钟
TIM_SelectInputTrigger(TIM2,TIM_TS_ITR2);                    //内部触发,从TIM3触发


  TIM_ARRPreloadConfig(TIM2, ENABLE);
   TIM_CtrlPWMOutputs(TIM2, ENABLE);
   TIM_Cmd(TIM2,ENABLE);//先不使能能TIM2
   
   
   //TIM3工作在从模式的门控模式下的PWM输出模式
  TIM_TimeBaseInitStruct.TIM_ClockDivision = TIM_CKD_DIV1;       //没有时钟分割
  TIM_TimeBaseInitStruct.TIM_CounterMode = TIM_CounterMode_Up;   //向上计数模式
  TIM_TimeBaseInitStruct.TIM_Prescaler = 719;                    //预分频值,1MHz
   TIM_TimeBaseInitStruct.TIM_Period = TIM3per;                   //重装值
  TIM_TimeBaseInit(TIM3,&TIM_TimeBaseInitStruct);
   
   TIM_OCInitStruct.TIM_OCMode = TIM_OCMode_PWM1;
   TIM_OCInitStruct.TIM_OutputState = TIM_OutputState_Enable;
   TIM_OCInitStruct.TIM_OCPolarity = TIM_OCPolarity_Low;
   TIM_OCInitStruct.TIM_Pulse = TIM3Compare1;
   TIM_OC1Init(TIM3,&TIM_OCInitStruct);

   TIM_SelectMasterSlaveMode(TIM3,TIM_MasterSlaveMode_Enable);   //使能TIM3的主从模式
  TIM_SelectOutputTrigger(TIM3,TIM_TRGOSource_OC1Ref);          //输出内部触发

// TIM_OC1PreloadConfig(TIM3,TIM_OCPreload_Disable);
TIM_ARRPreloadConfig(TIM3, ENABLE);
/*使能定时器TIM3主输出*/
   TIM_CtrlPWMOutputs(TIM3, ENABLE);
   
   TIM_Cmd(TIM2,ENABLE);   //使能TIM2
TIM_Cmd(TIM3,ENABLE);   //使能TIM3
}

void TIM2_IRQHandler(void)
{
   if(TIM_GetITStatus(TIM2,TIM_IT_Update)!=RESET)   //检查溢出信号
  {
     TIM_ClearITPendingBit(TIM2,TIM_IT_Update);     //清除溢出标志
    TIM_Cmd(TIM3,DISABLE);
   }
}
复制代码


实现功能:利用定时器主从模式,通过定时器TIM3 内部输出TIM_TRGOSource_OC1Ref时钟触发TIM2计数,TIM2计数中断关闭TIM3 ,实现TIM3输出PWM脉冲数可控
遇到的问题:TIM3 与 TIM2 开启不同步,TIM3先开启工作一段时间后才输出脉冲触发TIM2计数,原因是什么?求解答

使用特权

评论回复
沙发
tpgf| | 2024-1-2 14:12 | 只看该作者
实际数据和理论数据大概能相差多少呀

使用特权

评论回复
板凳
nawu| | 2024-1-2 14:41 | 只看该作者
这个是不是必须要特定的定时器有这个自带的功能呢

使用特权

评论回复
地板
两只袜子| | 2024-1-2 14:50 | 只看该作者
定时器配置错误

使用特权

评论回复
5
jcky001| | 2024-1-2 14:50 | 只看该作者
中断或DMA的影响

使用特权

评论回复
6
cr315| | 2024-1-2 14:50 | 只看该作者
电磁干扰或电源噪声可能会影响定时器的运行,导致它们不同步。

使用特权

评论回复
7
elephant00| | 2024-1-2 14:51 | 只看该作者
可能是硬件问题

使用特权

评论回复
8
laocuo1142| | 2024-1-2 14:51 | 只看该作者
即使配置了同步,两个定时器刚开始时可能不会立即同步。可能需要一段时间,特别是当主从定时器的值差异很大时。

使用特权

评论回复
9
gwsan| | 2024-1-2 15:34 | 只看该作者
定时器3的模式有问题或者定时器2的启动配置有问题

使用特权

评论回复
10
tfqi| | 2024-1-2 16:16 | 只看该作者
这个内部输出的信号如何进行监测呢

使用特权

评论回复
11
zljiu| | 2024-1-2 23:04 | 只看该作者
他们的时钟源同步吗  如果是软件前后使能的话 是不是不能严格的同步呀

使用特权

评论回复
12
zljiu| | 2024-1-2 23:04 | 只看该作者
他们的时钟源同步吗  如果是软件前后使能的话 是不是不能严格的同步呀

使用特权

评论回复
13
aoyi| | 2024-1-2 23:36 | 只看该作者
楼主可以观察一下定时器3的输出是不是有问题

使用特权

评论回复
14
香水城| | 2024-1-3 16:09 | 只看该作者
本帖最后由 香水城 于 2024-1-3 16:12 编辑

连STM32型号都没有说。TIMER内部互联是基于硬件支持,不说型号别人都不知你配置得对不对。
STM32定时器同步启动示例及应用提

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

139

主题

816

帖子

0

粉丝