本帖最后由 yushiqian2012 于 2013-4-1 13:42 编辑
话不多少,直接正题:
话说我一直使用STM32,然后就轻易地想当然的认为AVR也是支持嵌套中断的,然后悲剧就产生了,我用定时器中断里面发送指令,然后想用外部中断中断掉它,然后再用SPI中断中断掉外部中断,处理标志位,然后再依次回归,最后定时器中断中判断标志位while(!标志位);
结果就死机了,彻底的死机。搞了一下午,很是郁闷。然后就开始怀疑他是不是不支持嵌套中断,结果还真是。
AVR的中断级别是死的,不像STM32,可以指定中断优先级,同时AVR中断是采用优先响应,但是进入中断后,硬件就直接关闭全局中断了。离开中断函数以后,硬件再重新打开全局中断。读到这里,大家应该明白了吧,这么来说,其实只要在中断函数里面重新打开全局中断,那么AVR也可以像STM32一样指定优先级了,如在中断函数里面屏蔽掉不想让响应的中断,打开想让响应的中断,就可以灵活的制定响应流程。我是用的是IAR编译器,所以流程就可以这么来做:
进入定时器中断以后:
1:屏蔽掉自身中断,防止嵌套自身中断
2:屏蔽掉其他不想让其相应的中断 ,打开让响应的中断
3:打开全局中断(IAR里面可以直接调用__enable_interrupt(); )
搞定!
|