dsp5509的中断系统
1. DSP5509有32个中断,中断分为软件中断和硬件中断,同时软件中断不可以屏蔽。软件中断由指令触发。55x在中断时DSP会自动保存ST0_55、ST1_55、ST2_55三个寄存器。
2. 其中中断最关键的,但是用户也不必关心的是,进入中断之前,需要把关键寄存器的值都入栈,就是把当前寄存器的值保存起来(在栈里面备份),因为进入中断可能需要改变这些寄存器的值,然后退出中断,再把栈里面的备份值重新写到关键寄存器,叫做恢复现场。
3. 看下工程,首先写一个中断ISR服务函数,5509A有5个外部中断,INT0-INT4,本次使用INT2
void interrupt XINT()
{
nCount++; nCount%=2;
if ( nCount==0 )
PCR1^=8;
}
4. 中断配置初始化函数
void INTR_init( void )
{
IVPD=0x80;
IVPH=0x80;
IER0=8;
DBIER0=8;
IFR0=0xffff;
asm(" BCLR INTM");
}
5. 相关的asm文件,主要是用来配置中断向量表
ISR序号 | 硬件中断优先级 | 中断名称 | 24位中断向量地址低八位 | 中断子程序功能 |
0 | 0(最高) | RESET | 0H | 复位(硬件或软件) |
1 | 1 | NMI | 8H | 外部不可屏蔽中断 |
2 | 2 | INT0 | 10H | 外部硬件中断0 |
3 | 5 | INT2 | 18H | 外部硬件中断2 |
4 | 6 | INT0 | 20H | 定时器0中断 |
5 | 7 | RINT0 | 28H | McBSP0接收中断 |
6 | 9 | RINT1 | 30H | McBSP1接收中断 |
7 | 10 | XINT1 | 38H | McBSP1发送中断 |
8 | 11 | --- | 40H | 软件中断8 |
9 | 13 | DMAC1 | 48H | DMA通道1中断 |
10 | 14 | DSPINT | 50H | 主机中断 |
11 | 15 | INT3 | 58H | 外部硬件中断3 |
12 | 17 | RINT2 | 60H | McBSP2接收中断 |
13 | 18 | XINT2 | 68H | McBSP2发送中断 |
14 | 21 | DMAC4 | 70H | DMA通道4中断 |
15 | 22 | DMAC5 | 78H | DMA通道5中断 |
16 | 4 | INT1 | 80H | 外部硬件中断1 |
17 | 8 | XINT0 | 88H | McBSP0发送中断 |
18 | 12 | DMAC0 | 90H | DMA通道0中断 |
19 | 16 | INT4 | 98H | 外部硬件中断4或RTC中断 |
20 | 19 | DMAC2 | A0H | DMA通道2中断 |
21 | 20 | DMAC3 | A8H | DMA通道3中断 |
22 | 23 | TINT1 | B0H | 定时器1中断 |
23 | 24 | I2C | B8H | I2C总线中断 |
24 | 2 | BERR | C0H | 总线出错中断 |
25 | 25 | DLOG | C8H | 数据记录中断 |
26 | 26(最低) | RTOS | D0H | 实时操作系统中断 |
27 | 27 | --- | D8H | 软件中断27 |
28 | 28 | --- | E0H | 软件中断28 |
29 | 29 | --- | E8H | 软件中断29 |
30 | 30 | --- | F0H | 软件中断30 |
31 | 31 | --- | F8H | 软件中断31 |
.sect ".vectors"
.ref _c_int00 ; C entry point
.ref _XINT
.if (.MNEMONIC)
rsv: ; reset vector
B _c_int00 ; branch to C entry point
NOP
.align 8
nmi:
.loop 8
nop
.endloop
int0:
.loop 8
nop
.endloop
int2:
b _XINT
nop
.align 8