打印
[STM32F1]

上电初始化后第一次TIM_IT_Update进不去中断,会是什么原因?

[复制链接]
986|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
金色大元宝|  楼主 | 2020-5-30 10:38 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
TIM3脉冲计数,搞了一个TIM_IT_Update中断,很奇怪,上电后第一次TIM_IT_Update中断进不去。后续就没问题了。不知道问题出在哪里了。
利用外部中断3,使能TIM3的TIM_IT_Update,走完一定脉冲后停止。


初始化TIM3
static void TIM3_Mode_Config(void)
{
    TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
    TIM_OCInitTypeDef  TIM_OCInitStructure;
   
    /* Time base configuration */                 
    TIM_TimeBaseStructure.TIM_Period = 0xffff;
    TIM_TimeBaseStructure.TIM_Prescaler = 71;
    TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1 ;
    TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //向上计数模式
    TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);

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

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

        //TIM_ClearITPendingBit(TIM3, TIM_IT_Update);         // 清除溢出中断标志
        //TIM_ITConfig(TIM3, TIM_IT_Update, ENABLE);   // 开启TIM3溢出中断 (周期中断)
   
    /* TIM3 enable counter */
    //TIM_Cmd(TIM3, ENABLE);                   //使能定时器3       
}



TIM3 TIM_IT_Update 中断
void TIM3_ISR(void)
{
        if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET)
        {
                TIM3->SR  = ~TIM_IT_Update;        // 清除TIM3溢出中断标志
                //TIM_ClearITPendingBit(TIM3, TIM_IT_Update);         // 清除溢出中断标志               
        }
   
        if (VR_RunMode==1) //同步模式
        {
                if(--Cnt_IRQPulse == 0)        //脉冲跑完
                {
                        TIM3->CNT = 0;                        //计数器同步复位
                        TIM3->CR1 &= ~0x01;                //TIM3定时器禁止
                        TIM3->DIER &= ~TIM_IT_Update;        //关闭TIM3溢出中断

                        //TIM_ITConfig(TIM3, TIM_IT_Update, DISABLE);     // 关闭TIM3溢出中断
                }
        }
}



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

                //bsp_LedToggle(4);
        }
  
}



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

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

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

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

                bsp_DelayMS(50);
        }
}

使用特权

评论回复
沙发
香水城| | 2020-5-30 11:43 | 只看该作者
对你这句话 “调试时在TIM_IT_Update中加了LED闪烁,发现上电后第一次使能中断,进不去,后续才可以。”
不是很理解。

你说第一次使能中断,只是允许更新中断发生,但最终要有相应的中断事件才会进中断的。

使用特权

评论回复
板凳
金色大元宝|  楼主 | 2020-5-30 13:46 | 只看该作者
香水城 发表于 2020-5-30 11:43
对你这句话 “调试时在TIM_IT_Update中加了LED闪烁,发现上电后第一次使能中断,进不去,后续才可以。”
不 ...

TIM3->SR     = ~TIM_IT_Update;                //清除TIM3溢出中断标志
TIM3->DIER   |= TIM_IT_Update;                //开启TIM3溢出中断
TIM3->CR1    |= 0x01;                                //使能 TIM3


上电后,使能中断,因为是溢出中断,只要TIM3使能开启,到达TIM3->ARR溢出的时候,肯定得进中断啊。

使用特权

评论回复
地板
香水城| | 2020-5-30 17:40 | 只看该作者
金色大元宝 发表于 2020-5-30 13:46
TIM3->SR     = ~TIM_IT_Update;                //清除TIM3溢出中断标志
TIM3->DIER   |= TIM_IT_Update ...

嗯,你这个逻辑没有问题。

清更新事件标志--》 使能更新中断--》配置ARR并启动计数  这样溢出时肯定发生中断。

你是怎么肯定第一个计数周期的溢出没有中断?若感觉是,一定是哪里将其清零了。

另外,你说使能更新中断后 空跑一会儿 就可以?你这个空跑跟计数器的工作没啥关系了,溢出时该中断还是得中断。你看看这个空跑还会跟哪些有关系? 有无中断优先级方面的问题?

还有,将ARR尽量配置大点看看,这样或许更容易发现问题。

使用特权

评论回复
5
yediezeus| | 2020-6-2 10:56 | 只看该作者
你这个代码挺有意思的
1、脉冲数是怎么记的Sync_Pitch2Pulse没看见第二个出现的地方
2、外部中断也不知道是手动触发还是咋回事
3、定时器中断上电可以进入
看这个代码的意思是你先手动开启 然后开始计数 当到达VR =1时,定时器跑完脉冲数定时器停止
总之程序流程屡一下可能会更好

使用特权

评论回复
6
390871020| | 2020-12-23 00:30 | 只看该作者
你好,我这边有点问题想咨询一下,如果最近看到你的帖子有点疑问需要解答,能否加我QQ390871020.

使用特权

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

本版积分规则

24

主题

82

帖子

3

粉丝