打印
[STM32F1]

STM32 2定时器主从模式内部互联,不同步!!有木有解

[复制链接]
2020|7
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
STM32 2定时器主从模式内部互联,不同步!!有木有解????
实现功能:利用定时器主从模式,通过定时器TIM3 内部输出TIM_TRGOSource_OC1Ref时钟触发TIM2计数,TIM2计数中断关闭TIM3 ,实现TIM3输出PWM脉冲数可控
遇到的问题:TIM3 与 TIM2 开启不同步,TIM3先开启工作一段时间后才输出脉冲触发TIM2计数,原因是什么?求解


代码如下:
/*变量定义*/
//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);
  }
}



沙发
小明的同学| | 2018-8-26 18:56 | 只看该作者
没试过这种操作

使用特权

评论回复
板凳
caoenq| | 2018-8-27 06:56 | 只看该作者
使用HAL库就可以了,用过类似功能

使用特权

评论回复
评论
2011_断桥 2018-8-27 23:30 回复TA
还使用过HAL库 
地板
香水城| | 2018-8-27 14:33 | 只看该作者
你的从定时器的从模式是怎样的?你可以将主的CEN使能作为同步信号给从模式控制器。

另外,如果只是实现几个脉冲输出,用带RCR控制的单脉冲模式即可。

使用特权

评论回复
5
2011_断桥|  楼主 | 2018-8-27 23:34 | 只看该作者
caoenq 发表于 2018-8-27 06:56
使用HAL库就可以了,用过类似功能

还没使用过HAL库

使用特权

评论回复
6
2011_断桥|  楼主 | 2018-8-27 23:36 | 只看该作者
香水城 发表于 2018-8-27 14:33
你的从定时器的从模式是怎样的?你可以将主的CEN使能作为同步信号给从模式控制器。

另外,如果只是实现几 ...

TIM3上升沿触发TIM2计数,只要为了输出特定数量的脉冲,控制步进电机运动

使用特权

评论回复
7
zhangdd097| | 2018-10-27 16:31 | 只看该作者
楼主问题解决没,我也遇到这种问题,很抓狂,请问能不能加QQ787751509讨论一下啊

使用特权

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

本版积分规则

4

主题

18

帖子

0

粉丝