打印

关于tim3中断的问题

[复制链接]
7623|22
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
soiso|  楼主 | 2009-2-3 23:16 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
  程序再初始化时执行如下语句,就会进一次TIM3中断,但这是TIM3并没有开启。
    TIM_TimeBaseInitTypeDef   TIM_TimeBaseStructure;  
   
    /* Time Base configuration */    
    TIM_TimeBaseStructure.TIM_Period = 0xFFFF;
    TIM_TimeBaseStructure.TIM_Prescaler = 0x00;
    TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
    TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
    TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);    
    //下降沿计数值加1,
    TIM_ETRClockMode2Config(TIM3, TIM_ExtTRGPSC_OFF, TIM_ExtTRGPolarity_Inverted, 0);    
      
   TIM_ITConfig(TIM3, TIM_IT_Update, ENABLE );    
沙发
soiso|  楼主 | 2009-2-3 23:21 | 只看该作者

re

   nvic配置如下:
     
     NVIC_InitStructure.NVIC_IRQChannel=TIM3_IRQChannel;
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;  
    NVIC_Init(&NVIC_InitStructure);
  这个现象比较奇怪,不知道为什么,程序仅仅是刚进行了定时器的初始化,还没有进行任何的操作,T3也没有开启,不知道这个中断是怎么来的。不过此情况就是在初始化的时候会出现一下,等到程序执行后就没有这样的现象了。
   

使用特权

评论回复
板凳
soiso|  楼主 | 2009-2-3 23:26 | 只看该作者

re

还有一个现象就是若再一个外部中断里开启T3,发现只要进入了外部中断就一定会触发一次T3中断,无论是否满足给定的T3产生中断条件(T3计数器器寄存器到达某一值)

  希望知道的朋友说一下,谢

使用特权

评论回复
地板
香水城| | 2009-2-4 08:37 | 只看该作者

估计与这个“再”有关

使用特权

评论回复
5
soiso|  楼主 | 2009-2-4 08:45 | 只看该作者

汗一下

是‘在’不是‘再’啊...

使用特权

评论回复
6
ST_ARM| | 2009-2-4 09:32 | 只看该作者

你的代码初始化的顺序是怎样的?

一般来说NVIC在最后初始化。

使用特权

评论回复
7
soiso|  楼主 | 2009-2-4 09:40 | 只看该作者

初始化顺序如下

void BSP_Initial(void)
{
      RCC_Configuration();
      GPIO_Configuration();
           GPIO_SetBits(GPIOE, GPIO_Pin_3);
      NVIC_Configuration();
      SysTick_Configuration();
      ADC1_Configuration();
      T2_Configuration();
      T3_Configuration();
      T4_Configuration();
      CAN_Configuration();
          UART_onfiguration ();
}

使用特权

评论回复
8
violet520| | 2009-2-4 09:40 | 只看该作者

这个怎么跟初始化的顺序有关?

想不明白,是不是芯片故意这么做的???

使用特权

评论回复
9
香水城| | 2009-2-4 11:01 | 只看该作者

没有初始化,就意味着该模块的状态不定

一个数据通道上,如果先初始化输出端,后初始化输入端,开放输出端后它肯定会输出输入端的不定状态信号,这样岂能得到正确的结果?

这不是芯片故意这么做的,而是事物固有的逻辑规律。

使用特权

评论回复
10
violet520| | 2009-2-4 13:01 | 只看该作者

那初始化的顺序到底应该是怎样的?

如果要设置一个定时器为外部计数模式到底应该是什么样的顺序????

使用特权

评论回复
11
soiso|  楼主 | 2009-2-4 13:06 | 只看该作者

修改初始化顺序后发现还是不行

void BSP_Initial(void)
{
      RCC_Configuration();
      GPIO_Configuration();
      GPIO_SetBits(GPIOE, GPIO_Pin_3);
      
      SysTick_Configuration();
      ADC1_Configuration();
      T2_Configuration();
      T3_Configuration();
      T4_Configuration();
      CAN_Configuration();
      UART_onfiguration ();

      NVIC_Configuration();
}
  程序执行了NVIC_Configuration中关于TIM3中断的设置:
    NVIC_InitStructure.NVIC_IRQChannel=TIM3_IRQChannel;
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
    NVIC_InitStructure.NVIC_IRQChannelCmd =ENABLE; 
    NVIC_Init(&NVIC_InitStructure);
 马上也会进入TIM3中断,这时候其实仅仅是初始化阶段,TIM3并没有开启。
同样的现象也发生在外部中断中,即程序执行了NVIC_Configuration中关于外部中断的设置:
    EXTI_InitStructure.EXTI_Line = EXTI_Line12;
    EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
    EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;
    EXTI_InitStructure.EXTI_LineCmd = ENABLE;
    EXTI_Init(&EXTI_InitStructure);  
    
    /* Enable the EXTI10_5 Interrupt */
    NVIC_InitStructure.NVIC_IRQChannel = EXTI15_10_IRQChannel;
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    NVIC_Init(&NVIC_InitStructure)
    也马上触发了外部中断,但是此时外部中断在硬件上并没有连接呢,所以实际并没有外部中断触发信号到来

使用特权

评论回复
12
香水城| | 2009-2-4 13:36 | 只看该作者

楼主位程序的最后一句话不就是开启了TIM3的Update中断吗?

使用特权

评论回复
13
soiso|  楼主 | 2009-2-4 13:57 | 只看该作者

回香版

我虽然在开了TIM3的中断 但是我并没有开启TIM3啊,这里还没有执行TIM_Cmd(TIM3, ENABLE)这样的指令。TIM3的计数器都没有开始工作呢,怎么就进入中断了,程序中我是计数到某个值才应该中断的。

使用特权

评论回复
14
香水城| | 2009-2-4 14:46 | 只看该作者

请在初始化时先把中断挂起标志清掉

同时,在进入中断后通过检查各个寄存器的内容,判断一下这个问题的原因是什么;我没有真正看到你的现象,不能明确告诉你问题的所在,只能给你指示一些调试的方向。

使用特权

评论回复
15
ST_ARM| | 2009-2-5 09:21 | 只看该作者

能否将你的项目打包上来

(最好是使用IAR)

使用特权

评论回复
16
soiso|  楼主 | 2009-2-5 14:13 | 只看该作者

问题解决

初始化之前手动将tim3的udis位清一下就能避免了

使用特权

评论回复
17
fqingy2003| | 2009-2-6 09:07 | 只看该作者

不只是TIM3有这个问题,好多外设都有中断问题

USART,RTC等好多都是开启中断就会产生中断,在开中断前一定要先设置中断向量地址,要不就会跑到他外婆家去了!我以前也在论坛上说过,可是人家说这是每个厂家的特点,汗!!好好修改一下程序,可以避免,当然不是STM32提供例程就可以搞定,那就太天真了!因为ST没有真正的技术支持,有的也是我们这样的外行的总结!

使用特权

评论回复
18
香水城| | 2009-2-6 10:00 | 只看该作者

在开中断前一定要先设置中断向量地址,好像不是STM32独有的

使用特权

评论回复
19
Swd21ic| | 2009-2-7 21:29 | 只看该作者

re

开启中断后就立刻进入是因为有NVIC中该中断处于挂起状态(=1).
我遇到过这个问题.是因为我JTAG调试没有接系统的nRST.下程序进去不会复位芯片.(复位NVIC).那么上一次程序运行的挂起标志还在.所以就进中断了.

可以查下是不是这个原因

使用特权

评论回复
20
soiso|  楼主 | 2009-2-9 16:51 | 只看该作者

回21楼

什么叫没事白开中断?中断需要用我不开行吗?
无论在哪里只要开了中断就自动进一次,这算不算我的bug?
回帖之前最好把别人的意思弄明白一点

使用特权

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

本版积分规则

18

主题

41

帖子

0

粉丝