使用Cortex M3通用定时器发现一个奇怪的问题,求解!

Other Parts Discussed in Thread: LM3S608, LM3S811

MCU: Stellaris® LM3S608 Microcontroller

编译环境: IAR Embedded Workbench 5.5

问题描述:初始化3个通用定时器,均配置为32位周期性定时器,使能了定时器中断和定时器中断源  IntEnable(ulIntTimer);    TimerIntEnable(ulBase, ulIntFlags);但是此处没有使能定时器(TimerEnable(TIMER0_BASE, TIMER_A);)

接着初始化了其他的外设以及驱动,最后运行系统,使能IntMasterEnable();和定时器中断TimerEnable(TIMER0_BASE, TIMER_A);

现象:定时器初始化完毕之后,在没有使能定时器的情况下,发现代码进入了定时器中断处理函数。(通过在中断处理函数中放置while(1);捕获)

如果将IntEnable(ulIntTimer);    TimerIntEnable(ulBase, ulIntFlags);放置所有外设以及驱动初始化之后,运行系统之前,就不会出现这种问题。

在Stellaris® LM3S5K31 Microcontroller上也出现过类似情况。

问题是没有使能定时器的时候,问什么会进入定时器中断呢?勘误上也没有此类问题描述。

  • 本来以为处理器中断默认是关闭的

    经过试验发现,初始化系统时钟时候,处理器中断已经开启了。

    如果初始化系统时钟之后,关闭处理器中断,IntMasterDisable()就不会在进入定时器中断了。

    虽然问题可以这么解决,但是在定时器没有使能的时候进入定时器中断的原因还是没有搞清楚~

  • 或者问题可以这么描述:

    处理器中断开启了,定时器中断也配置好并开启了,但是没有使能定时器,为什么会进入定时器中断处理函数呢?

  • 初步怀疑是板子的问题,现在用的是LM3s811的评估板,没有液晶屏,有一块塑料板,周围有6个LED的那种

    我发现初始化定时器的时候,使能定时器外设,相关的寄存器中中断标志位已经置位了。

    换用公司的产品板子,没有复现此问题,但是代码有些差异,还需要进一步验证

  • 在使能Timer及其中断前,最好用TimerIntClear将中断标志位清除一下,以防止配置时,模式的改变引起的该标志位的置位

  • 更换了一块评估板,现在使用的是9B96的评估板,类似的代码,没有发现此问题。使用JLINK单步调试的时候,看到TIMER寄存器中相应的标志位也没有置位。应该还是和板子有关。