图4-12和图4-13分别给出了中断源及其复用情况。
PIE模块让8个外设或外部引脚中断复用一个CPU中断,这些中断又被分成12个组(PIE分组1~12)。每一分组都有对应的PIEIER和PIEIFR寄存器,这些寄存器可用来控制向CPU发送中断请求。当中断发生时,CPU也可以通过这些寄存器内容进行解码来判断响应哪一个中断。
图4-12 PIE中断源和外部中断1~2
1.PIEIER和PIEIFR
当对PIEIER和PIEIFR寄存器进行相关操作时,需要注意几点。
(1)不要软件清零PIEIFR位
当对PIEIFR寄存器进行写或读—修改—写操作指令时,可能会丢失产生的中断。如果要将PIEIFR位清零,则须等当前的中断服务程序被执行。若用户想通过清除PIEIFR标志位使CPU不执行正常的中断服务程序,则应采用如下操作步骤:
1)将EALLOW置位,允许用户修改PIE向量表。
2)修改PIE向量表,使对应外设中断的向量指向一个临时的中断服务程序(ISR)。这个临时的服务程序仅仅实现一个中断返回操作(IRET)。
3)使能中断,则CPU将会响应中断,并执行该临时中断服务程序。
4)临时的中断服务程序执行完毕后,PIEIFR位将被自动清零。
图4-13 PIE中断源和外部中断3~7
5)修改PIE向量表,使其重新映射到正确的外设中断服务程序。
6)清除EALLOW位。
(2)软件设置中断优先级
1)CPU级IER寄存器用来设置全局中断优先级,各个PIEIER寄存器用来设置每一分组中的中断优先级。在这种情况下,PIEIER寄存器只能在同组的中断服务程序中修改,因为此时可以通过PIEACK位来阻止CPU响应同组中的其他中断。
2)在响应某一PIE分组的中断时,不要禁止其他PIE分组的PIEIER位。
(3)使用PIEIER禁止中断
如果用户想使用PIEIER寄存器来使能中断然后禁止中断,则应遵循下面两种操作方法。
方法1:使用PIEIERx寄存器禁止中断并且保持相应的PIEIFRx标志位。
1)禁止全局中断(INTM=1)。
2)清零PIEIERx.y,禁止相应外设中断。
3)等待5个指令周期。这个等待是为了保证已向CPU发出中断请求的中断能将CPU IFRx寄存器的相应位置位。
4)清除相应PIE分组的CPUIFRx标志位(对CPUIFR操作为安全操作)。
5)清除相应PIE分组的PIEACKx位。
6)使能全局中断(INTM=0)。
方法2:使用PIEIERx寄存器禁止中断并清除相应的PIEIFRx标志位。
1)禁止全局中断(INTM=1)。(www.xing528.com)
2)置位EALLOW。
3)修改PIE向量表将相应的外设中断映射到一个临时的空中断服务程序(ISR),这个空的服务程序仅仅进行一个中断返回操作(IRET)。这是清除PIEIFRx.y的安全方法,可以保证不丢失同一分组的其他外设中断。
4)在外设相应寄存器中禁止外设中断。
5)使能全局中断(INTM=0)。
6)等待外设中断服务程序执行完毕(执行空ISR)。
7)禁止全局中断(INTM=1)。
8)修改PIE向量表使相应外设中断映射到原始ISR。
9)清除EALLOW位。
10)禁止与给定外设相对应的PIEIER位。
11)清除与给定外设相对应的CPU IFR标志位(对CPU IFR操作为安全操作)。
12)清除相应PIE分组的PIEACK位。
13)使能全局中断。
2.CPU响应外设复用中断请求流程
图4-14描述了复用的中断请求从外设产生到CPU响应的一个流程,其具体步骤如下。
图4-14 复用中断请求流程
1)PIE分组中的外设或外部引脚产生中断请求。如果外设模块中使能了对应的中断,那么该中断请求将送至PIE模块。
2)PIE模块将识别出中断的来源(第x分组中的第y个中断,即INTx.y),且相应的PIE中断标志位PIEIFRx.y锁存为1。
3)为使中断请求能够从PIE传送至CPU,需要同时满足以下两个条件:
①相应的PIE中断使能位必须置位(PIEIERx.y=1)。
②PIEACKx位必须被清除。
4)若步骤3的两个条件都满足,则中断请求将被传送至CPU,并且对应的应答位再次被置位(PIEACKx=1)。PIEACKx将保持置位状态直到被手动清零。手动清零该位后,该PIE分组其他中断产生的中断请求便可以由PIE传送至CPU。
5)相应的CPU级中断标志位被置位(IFRx=1),表明CPU有一个中断挂起。
6)若使能了CPU中断(CPU IERx=1)并且全局中断屏蔽位被清除(INTM=0),则CPU将响应该中断INTx。
7)CPU识别中断并且自动保护中断现场、清除IER、置位INTM及清除EALLOW。所有的步骤CPU都按顺序执行。
8)CPU请求PIE提供相应的中断向量。
9)对于复用的中断源,PIE模块根据寄存器PIEIERx和PIEIFRx的当前值来解码、确定CPU所需要的中断向量地址。
CPU进入中断后会自动清除PIEIFRx.y位。需要注意的是,PIEIERx寄存器用来决定哪一个中断向量被用来作为跳转地址,所以在清除PIEIERx时必须谨慎。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。