amobbs.com 阿莫电子论坛

 找回密码
 注册
搜索
bottom↓
回复: 0

上电后第一次TIM_IT_Update进不去中断,百思不得其解?

[复制链接]
(3518454)

打赏出0元收入0元

发表于 2020-5-30 10:34:13 | 显示全部楼层 |阅读模式
TIM3脉冲计数,搞了一个TIM_IT_Update中断,很奇怪,上电后第一次TIM_IT_Update中断进不去。后续就没问题了。不知道问题出在哪里了。
利用外部中断3,使能TIM3的TIM_IT_Update,走完一定脉冲后停止。


初始化TIM3
  1. static void TIM3_Mode_Config(void)
  2. {
  3.     TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
  4.     TIM_OCInitTypeDef  TIM_OCInitStructure;
  5.    
  6.     /* Time base configuration */                 
  7.     TIM_TimeBaseStructure.TIM_Period = 0xffff;
  8.     TIM_TimeBaseStructure.TIM_Prescaler = 71;
  9.     TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1 ;
  10.     TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //向上计数模式
  11.     TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);

  12.     TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;            //配置为PWM模式1
  13.     TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;  //当定时器计数值小于CCR_Val时为高电平

  14.     TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
  15.     TIM_OCInitStructure.TIM_Pulse = 0;       
  16.     TIM_OC3Init(TIM3, &TIM_OCInitStructure);
  17.     TIM_OC3PreloadConfig(TIM3, TIM_OCPreload_Enable);
  18.    
  19.     TIM_ARRPreloadConfig(TIM3, ENABLE);                         // 使能TIM3重载寄存器ARR

  20.         //TIM_ClearITPendingBit(TIM3, TIM_IT_Update);         // 清除溢出中断标志
  21.         //TIM_ITConfig(TIM3, TIM_IT_Update, ENABLE);   // 开启TIM3溢出中断 (周期中断)
  22.    
  23.     /* TIM3 enable counter */
  24.     //TIM_Cmd(TIM3, ENABLE);                   //使能定时器3       
  25. }
复制代码



TIM3 TIM_IT_Update 中断
  1. void TIM3_ISR(void)
  2. {
  3.         if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET)
  4.         {
  5.                 TIM3->SR  = ~TIM_IT_Update;        // 清除TIM3溢出中断标志
  6.                 //TIM_ClearITPendingBit(TIM3, TIM_IT_Update);         // 清除溢出中断标志               
  7.         }
  8.    
  9.         if (VR_RunMode==1) //同步模式
  10.         {
  11.                 if(--Cnt_IRQPulse == 0)        //脉冲跑完
  12.                 {
  13.                         TIM3->CNT = 0;                        //计数器同步复位
  14.                         TIM3->CR1 &= ~0x01;                //TIM3定时器禁止
  15.                         TIM3->DIER &= ~TIM_IT_Update;        //关闭TIM3溢出中断

  16.                         //TIM_ITConfig(TIM3, TIM_IT_Update, DISABLE);     // 关闭TIM3溢出中断
  17.                 }
  18.         }
  19. }
复制代码



外部中断3使能TIM3
  1. void EXTI3_ISR(void)
  2. {
  3.     if(EXTI_GetITStatus(EXTI_Line3) != RESET)        // Z
  4.         {
  5.                 EXTI_ClearITPendingBit(EXTI_Line3);     //清除中断标志位
  6.                
  7.                 if (VR_RunMode == 1)
  8.                 {
  9.                         Cnt_IRQPulse = Sync_Pitch2Pulse;        //中断里的计数值
  10.                         TIM3->ARR    = Sync_TIM_ARR;                //设定计数器自动重装值
  11.                         TIM3->CCR3   = Sync_TIM_CCR;
  12.                         TIM3->CNT    = 0;                                        //计数器同步复位
  13.                         TIM3->SR     = ~TIM_IT_Update;                //清除TIM3溢出中断标志
  14.                         TIM3->DIER   |= TIM_IT_Update;                //开启TIM3溢出中断
  15.                         TIM3->CR1    |= 0x01;                                //使能 TIM3
  16.                 }

  17.                 //bsp_LedToggle(4);
  18.         }
  19.   
  20. }
复制代码



调试时在TIM_IT_Update中加了LED闪烁,发现上电后第一次使能中断,进不去,后续才可以。

现在在上电初始化的时候,手工加了几个脉冲,才正常。但这不是解决办法,麻烦大家提点一下。

目前解决办法,上电时手工发几个脉冲,
在PWM初始化完成时

  1. /* PWM初始化,第一次进溢出中断失效,预空走几步 */
  2. if (VR_RunMode == 1) //同步模式
  3. {
  4.         for (i=0;i<3;i++)
  5.         {
  6.                 Cnt_IRQPulse = 5;                                        //中断里的计数值
  7.                 TIM3->ARR    = Sync_TIM_ARR;                //设定计数器自动重装值
  8.                 TIM3->CCR3   = Sync_TIM_CCR;
  9.                 TIM3->CNT    = 0;                                        //计数器同步复位
  10.                 TIM3->SR     = ~TIM_IT_Update;                //清除TIM3溢出中断标志
  11.                 TIM3->DIER   |= TIM_IT_Update;                //开启TIM3溢出中断
  12.                 TIM3->CR1    |= 0x01;                                //使能 TIM3

  13.                 bsp_DelayMS(50);
  14.         }
  15. }
复制代码

回帖提示: 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子论坛 ( 公安交互式论坛备案:44190002001997 粤ICP备09047143号-1 )

GMT+8, 2020-7-10 03:55

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表