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

2019-07-14 18:17发布

  1. /*变量定义*/
  2. //extern ledKeyState  led_key0 ;
  3. uint16_t tiM3per = 500;
  4. int main(void)
  5. {

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

  8. TIM_MasterSlaveModeInit(12,TIM3per,TIM3per>>1);
  9. // TIM_Cmd(TIM2,ENABLE);
  10. // TIM_Cmd(TIM3,ENABLE);

  11.    
  12.    while(1)
  13.    {
  14. //  TIM3per = TIM3per - 2;
  15. //  if(TIM3per < 50)
  16. //   TIM3per = 100;
  17. //  TIM_SetAutoreload(TIM3, TIM3per);//设置TIM3的重装值
  18. //  TIM_SetCompare1(TIM3,TIM3per>>1);//设置占空比为50%
  19. //    TIM_Cmd(TIM3,ENABLE);//使能TIM3;
  20.    }
  21. }

  22. /********************************************************************************
  23. * 函数名:TIM_MasterSlaveModeInit
  24. * 功能  :设置定时器主从模式
  25. * 输入  : TIM2per  定时器TIM2重载值
  26. *         TIM3per  定时器TIM3重载值
  27. *         TIM3Compare1  定时器TIM3比较预装载值
  28. * 输出  :无      
  29. ********************************************************************************/

  30. void TIM_MasterSlaveModeInit(uint16_t TIM2per, uint16_t TIM3per, uint16_t TIM3Compare1)
  31. {
  32.    TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct;
  33.    TIM_OCInitTypeDef TIM_OCInitStruct;
  34.    GPIO_InitTypeDef GPIO_InitStruct;
  35. NVIC_InitTypeDef NVIC_InitStructure;
  36.    
  37. /*使能外设时钟*/
  38.    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);
  39.    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);
  40.    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
  41.    RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
  42.    
  43.    GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP;            //复用推挽输出
  44.   GPIO_InitStruct.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_6;       //PA0
  45.    GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
  46.    GPIO_Init(GPIOA,&GPIO_InitStruct);
  47.    
  48.    /*TIM2工作在单脉冲下*/
  49.    TIM_TimeBaseInitStruct.TIM_ClockDivision = TIM_CKD_DIV1;     //没有时钟分割
  50.   TIM_TimeBaseInitStruct.TIM_CounterMode = TIM_CounterMode_Up; //向上计数模式
  51.   TIM_TimeBaseInitStruct.TIM_Prescaler = 719;                 //预分频值,每100us计数一次
  52.   TIM_TimeBaseInitStruct.TIM_Period = TIM2per;                 //重装值
  53.   TIM_TimeBaseInit(TIM2,&TIM_TimeBaseInitStruct);
  54.    
  55. //  TIM_SelectOnePulseMode(TIM2,TIM_OPMode_Single);              //设置TIM2在单脉冲模式
  56.   TIM_OC1PreloadConfig(TIM2,TIM_OCPreload_Enable);
  57.    
  58.    
  59.    TIM_OCInitStruct.TIM_OCMode = TIM_OCMode_PWM1;               //在向上计数时
  60.   TIM_OCInitStruct.TIM_OutputState = TIM_OutputState_Enable;   //OC1输出使能
  61.   TIM_OCInitStruct.TIM_OCPolarity = TIM_OCPolarity_High;       //有效电平为高
  62.   TIM_OCInitStruct.TIM_Pulse = 7;                              //预装载值
  63.   TIM_OC1Init(TIM2,&TIM_OCInitStruct);

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


  67.    NVIC_SetPriorityGrouping(NVIC_PriorityGroup_0);
  68.    NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;  
  69.    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
  70.    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
  71.    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  72.    NVIC_Init(&NVIC_InitStructure);
  73. /*********************/

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


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

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

  96. // TIM_OC1PreloadConfig(TIM3,TIM_OCPreload_Disable);
  97. TIM_ARRPreloadConfig(TIM3, ENABLE);
  98. /*使能定时器TIM3主输出*/
  99.    TIM_CtrlPWMOutputs(TIM3, ENABLE);
  100.    
  101.    TIM_Cmd(TIM2,ENABLE);   //使能TIM2
  102. TIM_Cmd(TIM3,ENABLE);   //使能TIM3
  103. }

  104. void TIM2_IRQHandler(void)
  105. {
  106.    if(TIM_GetITStatus(TIM2,TIM_IT_Update)!=RESET)   //检查溢出信号
  107.   {
  108.      TIM_ClearITPendingBit(TIM2,TIM_IT_Update);     //清除溢出标志
  109.     TIM_Cmd(TIM3,DISABLE);
  110.    }
  111. }
复制代码
实现功能:利用定时器主从模式,通过定时器TIM3 内部输出TIM_TRGOSource_OC1Ref时钟触发TIM2计数,TIM2计数中断关闭TIM3 ,实现TIM3输出PWM脉冲数可控
遇到的问题:TIM3 与 TIM2 开启不同步,TIM3先开启工作一段时间后才输出脉冲触发TIM2计数,原因是什么?求解答


友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。