dsp pie怎样控制外设中断传到cpu,cpu对外设的响应过程

dsp pie怎样控制外设中断传到cpu,cpu对外设的响应过程,第1张

最近在用2812编程,遇到一个问题,想请教各位高手,我先说一下自己的一点理解请教高手指点。PIE一般用到的中断组是INT1-INT12。我们知道他们的优先级顺序是INT1>INT2>INT3…INT11>INT12。在开所有中断使能的前提下,如果不同组(如INT1组的TINT0和INT2组的T1CINT)的中断同时向PIE发出中断请求,

那么PIE会放中断优先级较高(INT1.TINT0)的中断过去。同样的在如果是同组的中断请求同时到达的话(如INT2组的),那么也同样按照PIE中断向量表查看同组优先级,CPU响应优先级较高的中断。

我的理解是,

(1)不同组之间的中断可以实现中断嵌套。如INT1组的TINT0和INT2组的T1CINT。当CPU正在响应INT2组的T1CINT中断服务程序这时如果产生了INT1组的TINT0中断的话那么CPU便会产生中断嵌套,先停下T1CINT转而去执行TINT0,

当TINT0中岩宏断服务程序执行完之后再去执行剩余没有执行网的INT1中断服务程序。

(2)同组之间的中断不可以实现中断嵌套。如果同样是INT1组的两个中断比如ADCINT和TINT0。当CPU正在响应INT1的中断服务程序时,这时如果产生了ADCINT,尽管ADCINT在INT1组中的优先级比TINT0的优先级高,还是不会产生中断嵌套。

因为同组的中断在向CPU发出中断请求之前先要经过则散PIE中的应答位PIEACK验证,如果PIEACK为1说明此时正有改组的中断正在响应,PIE不会放响应该发出中断请求的中断源通过,只有等到正在响应的中断服务程序执行完才会去响应刚刚

发出中断请求的中断服务程序。这也就是为什么,我们在中断服务程序的后面都要加上一句PieCtrl.PIEACK.bit.ACKx=1就是为了让应答位清零,可以响应同组的其他中断。

以上两点是我对2812中断嵌套的一点理解,尤其是提到的第(2)点,万望高粗盯册手不吝指导。

给你个文本说明

由软件或硬件驱动的信号,可暂停目前执行的主程序,转而去执行一个中断服务子笑哪程序

中断分类:

▲ 可屏蔽中断:可用软件加以屏蔽或解除屏蔽。

▲ 非屏蔽中断:这些中断不能够被屏蔽。C28x将立即响应该种中断并转入相应的子程序去执行。所有用软件调用的中断都属于该类中断。

处理中断过程:

1.接收中断请求:由软件中断(从程序代码中)或者硬件中断(从一个引脚或一个基于芯片的设备)提出请求去暂停当前主程序的执行。

2.响应中断:C28x必须能够响应中断请求。如果中断是可屏蔽的,则必须满足一定的条件,按照一定的顺序去进行测试。而对于非屏蔽硬件中断和软件中断,C28x会立即作出响应。

3.准备执行中断服务程序并保存寄存器值。

(1)完整地执行完当前指令,清除流水线中还没有到达第二阶段的所有指令。

(2)将寄存器ST0、T、AH、AL、PH、PL、AR0、ARl、DP、STl、DBGSTAT、PC和IER的内容保存到堆栈中,以便自动保存主程携码序的大部分内容。

(3)取回中断向量并把它放入程序寄存器PC中。

4.执行中断服务子程序:C28x进入预先规定的向量地址,并且执行已写好的中断服务程序ISR。

一、中断矢量

▲ C28x支持32个中断向量,包括复位向量。每一向量是一个22位的地址,该地址是相应中断服务程序ISR的入口地址。每一个32位的向量被保存在一个连续地址中。见书中表4-1-1

▲中断向量地址的低16位保存该向量的低16位,高地址则保存它的高6位。当—个中断被确定后,其22位的向量被取回,而地址的高10位被忽略。

▲向量表可以映像到程序空间的底部或顶部,这取决于状态寄存器STl的向量映像位VMAP,如果VMAP位是0,向量就映像在以000000h开始的地址上;如果其值是1,向量就映像到以3FFFC0h开始的地址上。

▲ VMAP位可以由SETC VMAP指令进行置位,由CLR CVMAP指令进行复位。VMAP的复位值是1。

二、可屏蔽中断

▲ 14个通用中断——INTl~INTl4

为仿真而设计的中断——DLOGINT(数据标志中断)和TOSINT(实

时 *** 作系统中断)是。

▲ 中断寄存器:

√ 中断标志寄存器IFR——l6位寄存器IFR包含的标志位表明相应中断在等待CPU的确认。外部输入线INTl~INTl4在CPU的每—个时钟周期都被采样。如果识别出—个中断信号,IFR相应的位就被置位和锁存。DLOGINT或RTOSINT,CPU片内分析逻辑送来的信号使得相应标志位被设置和锁存。

√ 中断使能寄存器IER——包含的每一位为可屏蔽中断进行使能和关闭。

√ 调试中断使能寄存器DBGIER——包含的每一位为可屏蔽中断进行使能和关闭。表明了当CPU处于实时仿真模式时哪一个中断可以利用。

▲ 可屏蔽中断也利用状态寄存器STl的0位,即中断全局屏蔽位INTM,辩升哪可用来进行全局使能中断和关闭中断。

√当INTM=0时,这些中断全局使能;

√当INTM=1时,这些中断全局关闭。

▲ 在IFR中一个标志关闭后,直到IER、DBGIER和INTM位被使能,否则相应的中断将不再响应。

中断标志寄存器(IFR)

▲ 为了识别未确认中断,可以利用指令PUSH IFR,然后测试堆栈的值。

▲ 运用OR IFR指令来设置IFR位,

▲ 利用指令AND IFR,#0或硬件复位可以对所有的未决中断进行清0。

注意:当通过指令TRAP发出中断请求时,如果IFR的相应位被置位,CPU并不会自动清除它。如果有一个应用请求,它的IFR已被清0,则必须在中断服务子程序中将相应位清0。

最简单的情况,拿溢出中断来说吧。当你设置的值超过计数值后,就会产生溢出中断,贴个程序你看一下。

#include "DSP281x_Device.h"

Uint16 Number_10ms = 0

#pragma CODE_SECTION(User_T3PINT_Isr, "ramfuncs")

interrupt void User_T3PINT_Isr(void)// EV-A

{

Number_10ms = (Number_10ms + 1) % 188

if(Number_20ms==0)

{

/////此处写你自己想要在中断中执行的函数。因为这个时中弊候就会产生中断。

}

EvbRegs.EVBIFRA.bit.T3PINT=1

PieCtrlRegs.PIEACK.all |= PIEACK_GROUP4

PieCtrlRegs.PIEIER2.bit.INTx4=1

IER|=M_INT2

}

void main(void)

{

InitSysCtrl()

DINT

InitPieCtrl()

IER = 0x0000

IFR = 0x0000

InitPieVectTable()

EALLOW

PieVectTable.T3PINT = &User_T3PINT_Isr

EDIS

MemCopy(&RamfuncsLoadStart,&RamfuncsLoadEnd,&RamfuncsRunStart)

EnT3PINT()

EINT // Enable Global interrupt INTM

ERTM // Enable Global realtime interrupt DBGM

while(1)

{}//循环,等待中断

}

好了,大概就是老培拍这样了,中断有很多种的,还是需要自己去慢慢侍羡弄的哦


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/12384714.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-25
下一篇 2023-05-25

发表评论

登录后才能评论

评论列表(0条)

保存