Hi all,
请问在使用5418a的各个模块时,由于要响应中断,所以就要打开相应模块的中断位。比如,UART模块,需要打开收发中断,UCTXIE、UCRXIE。但是Status Register
中还有一个GIE位,请问我在响应中断的时候,是不是要将GIE置位呢?还是有中断到来时,GIE会自动置位呢?在离开中断函数时,需不需要清除GIE位呢?
Thanks
Nick
Young Hu:
Nick
您好!
可以参考一下TI的5418a的例程。
在初始化的时候要将GIE置位,必须手动置位,不然不把全局中断使能的话,中断不会响应。
在执行中断ISR的时候,首先SR寄存器会被压入堆栈,然后中断ISR中,GIE清零,不会再响应中断。在中断ISR退出的时候,SR寄存器出栈,恢复之前的状态。
所以在中断ISR中不用对GIE有任何操作,除非您想中断嵌套。
Peter_Zheng:
GIE: General interrupt enable. When set, enables maskable interrupts. When reset, all maskable interrupts are disabled. GIE是SR这个寄存器的第四位。进入中断时,SR会入栈,GIE reset,出中断时,SR出栈,GIE set。
Nick wang:
回复 Young Hu:
Hi 鸵鸟蝈蝈,
你所说的 “在执行中断ISR的时候,首先SR寄存器会被压入堆栈,然后中断ISR中,GIE清零,不会再响应中断。在中断ISR退出的时候,SR寄存器出栈,恢复之前的状态” 这句话中的GIE清零,是手动清零还是MCU会自动清零?
还有个问题,你说进中断后将GIE清零,那么如果我是UART中断,要发送多个字节的数据,由于每次中断只能发送一个
字节,所以需要多次进入中断,但是此时GIE已经复位了,如何再响应中断呢?
Thanks
Best regards,
Nick
Nick wang:
回复 Peter_Zheng:
Hi Peter,
GIE reset 和GIE set 的动作是手动实现的还是MCU自己实现的?而且,要发送多个数据,就需要多次中断,如果GIE复
位了,如何响应下次中断呢?
Thanks
Best regards,
Nick
Peter_Zheng:
回复 Nick wang:
在代码初始化的时候将GIE置位既可。后面的操作都能够自动置位和复位,即入栈和出栈的过程。当同时来多个中断时,按中断优先级来操作。当在中断过程中,又来一中断,则在执行完该中断后进入下一中断。因为每一个中断都有自己的中断标志位。