总结:中断服务函数入口通过执行相应的中断服务程序来响应中断。 响应处理将当前执行程序的指令地址压入堆栈并跳转到中断服务程序的入口地址。 入口地址是中断向量,存储在1位寄存器中。 完成这些任务后,中断服务程序就可以执行了。
A. 开始;
B. PIEIFRx.y = 1? 如果没有,请等待。
C,PIEIERx.y = 1?是,继续 D。 如果没有,请等待。
D,PIEACKx = 0?是,继续 E。 如果没有,请等待。
E,向CPU发送中断请求;
F,IFRx位1;
G,IERx = 1? 如果没有,请等待。
H,INTM = 0?是,继续 I。 如果没有,请等待。
在进入I、CPU响应、中断服务子程序之前,DSP硬件会自动将IFRx清0,然后清零CPU中的一些关键寄存器(如ST0)I会。 、ST1、IER等被压入堆栈并保存。 然后,硬件自动将 IERx 清为 0,将 INTM 清为 1,以避免中断嵌套。 中断服务子程序执行返回后,这些保存的内容自动从堆栈中弹出,并恢复原来的寄存器内容。 因此,无需在 ISR 中将 INTM 清 0 并将 IER 置 1。 但需要注意的是,在 ISR 中执行完中断响应任务后,返回前必须将外设寄存器中的中断标志软件清为 0。 这假设外设中断将再次生成。
J. 从PIE 获取中断向量,清除PIEIFRx.y,CPU 切换到ISR 执行。 这里,中断服务子程序的地址可以从PIE中断向量表中获得。 这是一个 32 位向量。 取中断向量后,PIE 模块的中断标志 PIEIFRx.y 自动清 0,但对应 PIE 应答位 PIEACKx 的中断 x 必须由软件清 0((写 1 清 0))。 中断服务子程序ISR。 这只有这样才能接受下一个外设中断。
K.
func:暂停服务函数入口。 XINT3
CPU响应中断。 即CPU必须执行相应的中断。 暂停服务程序。 响应处理使CPU将当前正在执行的程序的指令地址压入堆栈并跳转到中断服务程序的入口处。 地址,中断服务程序的入口地址就是中断向量。 该中断向量存储在两个 16 位寄存器中。 入口地址为22位,地址的低16位存储在向量的低16位中,地址的高16位存储在高6位中,高10位被保留。
上图显示了向CPU请求中断的外设多个中断的处理过程。
第一步:PIE中断组中的外设或外部中断产生中断。 如果外设中断使能,中断请求将发送到 PIE 模块。
步骤2:PIE模块识别其他PIE中断组x中的中断y(INTx.y)申请并分配相应的PIE中断Set。 标志位被锁存:PIEIFRx.y=1。
第3步:如果要向CPU发送PIE中断,必须满足两个条件:
1. 必须设置相应的使能位(PIEIERx.y=1)。
2. 相应的 PIEACKx 位必须清零。
步骤4:当步骤3中的两个条件满足时,向CPU发送中断请求,并将相应的响应寄存器位设置为1(PIEACKx=1)。PIEACKx位不会改变,除非它被清除以允许该组中的其他中断声明CPU。 =1) 表示已生成CPU级挂起中断。
第6步:如果CPU中断已启用(CPUIERx=1)或DBGIERx ) =1) 并且全局中断使能(INTM=0),CPU处理中断INTx。
第七步:CPU识别中断并保存。 CPU完成这些任务并调用中断服务例程:第8步:CPU从PIE中获取相应的中断向量。 >第九步:复用中断时,PIE模块根据PIEIERx和PIEIFRx寄存器的值来决定,有两种情况:
1如果在步骤 4 中生成并启用了更高优先级中断,则 PIEIERx 寄存器被置位,并且 PIEIFRx 中的相应位处于待处理状态。
2.如果不在该组中,则 PIE 响应该组中最高优先级的中断并使用 INTx.1 传输地址。 该操作相当于处理器的TRAP或INT指令。
CPU进入中断服务程序后,PIEIFRx.y位被清零。PIEIERx寄存器用于确定中断向量,所以清零PIEIFRx.y位时请注意,请订阅PIEIERx .
我附上百度文库文章的链接
<p style="text-indent:50px;"
评论前必须登录!
注册