TI官方提供的手册《TMS320x2833x, 2823x System Control and Interrupts Reference Guide》里面的6.3.2节中说,要禁止某个外设中断,要用以下两种方法,为何要如此复杂?直接PIEIEx.y=0不行吗?请大侠出来解惑!谢谢!
要清除PIEIER寄存器的位,有以下两种方法:
方法1:利用PIEIERx寄存器禁止中断并保护相应的PIEIFRx标志位。
当保护相应的PIEIFRx标志位,并清除PIEIERx中的位时,需要执行以下步骤:
①禁止全局中断(INTM=1)。
②清除PIEIERx.y位,禁止特定外设的中断,可以禁止一个或同一组中的多个中断。
③等待5个周期,这个延时是确保向CPU发出的任何中断都能在CPU IFR寄存器中被标记。
④清除外设中断组中的CPU IFRx位,这是在CPU IFR寄存器中的安全操作。
⑤清除外设中断组中的PIEACKx位。
⑥使能全局中断(INTM=0)。
方法2:利用PIEIERx寄存器禁止中断并清除相应的PIEIFRx标志位。
为了执行外设中断的软件复位,并清除PIEIFRx寄存器和CPU IFR寄存器中相应的PIEIFRx标志位,需要遵循以下步骤:
①禁止全局中断(INTM=1)。
②EALLOW位置1。
③修改PIE向量表映射到特定外设中断的临时映射,映射到一个空的中断服务程序,这个空的中断服务程序只完成从中断返回(IRET)指令。这种操作可以在没有丢失同一组内其他外设产生的任何中断的前提下,安全地清除单个PIEIFRx.y位。
④禁止外设寄存器中的外设中断。
⑤使能全局中断(INTM=0)。
⑥等待所有来自外设的未被执行的中断都执行了ISR程序。
⑦禁止全局中断(INTM=1)。
⑧修改PIE向量表,映射外设向量模块到它最初的ISR程序。
⑨清除EALLOW位。
⑩禁止给定外设的PIEIER位。
11)清除给定外设组的IFR位;清除PIE组的PIEACK位,则使能全局中断。
Eric Ma:
其实方法一相对是比较简单一点了。
它只所以这么去设置,是防止这个外设在之前或者修改的时候正在被触发。
一般你要禁止外设中断,在初始化的时候不要打开对应的外设中断,其实也就可以了。
ERIC
TI官方提供的手册《TMS320x2833x, 2823x System Control and Interrupts Reference Guide》里面的6.3.2节中说,要禁止某个外设中断,要用以下两种方法,为何要如此复杂?直接PIEIEx.y=0不行吗?请大侠出来解惑!谢谢!
要清除PIEIER寄存器的位,有以下两种方法:
方法1:利用PIEIERx寄存器禁止中断并保护相应的PIEIFRx标志位。
当保护相应的PIEIFRx标志位,并清除PIEIERx中的位时,需要执行以下步骤:
①禁止全局中断(INTM=1)。
②清除PIEIERx.y位,禁止特定外设的中断,可以禁止一个或同一组中的多个中断。
③等待5个周期,这个延时是确保向CPU发出的任何中断都能在CPU IFR寄存器中被标记。
④清除外设中断组中的CPU IFRx位,这是在CPU IFR寄存器中的安全操作。
⑤清除外设中断组中的PIEACKx位。
⑥使能全局中断(INTM=0)。
方法2:利用PIEIERx寄存器禁止中断并清除相应的PIEIFRx标志位。
为了执行外设中断的软件复位,并清除PIEIFRx寄存器和CPU IFR寄存器中相应的PIEIFRx标志位,需要遵循以下步骤:
①禁止全局中断(INTM=1)。
②EALLOW位置1。
③修改PIE向量表映射到特定外设中断的临时映射,映射到一个空的中断服务程序,这个空的中断服务程序只完成从中断返回(IRET)指令。这种操作可以在没有丢失同一组内其他外设产生的任何中断的前提下,安全地清除单个PIEIFRx.y位。
④禁止外设寄存器中的外设中断。
⑤使能全局中断(INTM=0)。
⑥等待所有来自外设的未被执行的中断都执行了ISR程序。
⑦禁止全局中断(INTM=1)。
⑧修改PIE向量表,映射外设向量模块到它最初的ISR程序。
⑨清除EALLOW位。
⑩禁止给定外设的PIEIER位。
11)清除给定外设组的IFR位;清除PIE组的PIEACK位,则使能全局中断。
DarkingStar:
回复 Eric Ma:
你意思是说,这是为了防止中断丢失吗?