本帖最后由 ST_ARM 于 2010-7-16 11:13 编辑
楼主在16楼说:“ms_100_cntdbu和ms_100_cn这两个变量的值不等”
“TIM6->SR &= ~(1<<0); 这条语句不能是最后一条,否则就会再进一次中断,但标志没置位。通过输出管脚或者一个计数,很容易看到。只要TIM6->SR &= ~(1<<0); 再加一条语句,就行了。串口 和 dma都是这样。因为多进的这次查不到标志,一般人不容易注意。估计和指令流水线有关。”
请问你是在仿真的情况下看到的还是全速运行后停下来看到的?
楼主在33楼上说:“cntdbu = cnt 但other = 0。”
如果cntdbu = cnt说明中断每次都进去了且标志位UIF被置位了,说明中断没有问题;如果你使用仿真,有可能单步走时,又有一个中断进来,这时你的程序未对UIF标志进行被清除,该位被重复置位,而你的程序并不知道这个问题,在后清除该标志位时,第二次的中断的信息同时被你擦除了,但是该中断已被传输到Cortext-M3内核,当你退出该中断后,系统会再次进入该中断,但是你看不到UIF标志位,因为你已经将其清除。如果你全速运行时,这个问题就不会出现,因为CPU处理速度很快,能够在下一次中断到来之前清除掉UIF标志位。 |