1. 中断相关概念
中断过程-----------------------------------你在下象棋,突然电话响了,你回屋接电话,然
后回来继续下象棋,这个过程就叫做中断响应过程。
CPU执行正常任务---------------------下象棋
保护现场----------------------------------你已经想好要“将军”,先在脑海中记下来。
中断发生----------------------------------电话响-
中断服务程序----------------------------接电话
恢复现场----------------------------------回来后恢复刚才想法
中断返回----------------------------------你回来继续下象棋
中断屏蔽----------------------------------Boss 正在训话,要求所有电话关机,你不能接电话
了。
非屏蔽中断—----------------------------你内急,即使是 Boss 在训话,你还是得到外面去
嘘嘘。
可屏蔽中断-------------------------------你在“闭关修炼”,可以不受外界干扰。
2. 中断源
C6000 支持软件中断和硬件中断。软件中断由指令产生中断请求,硬件中断可以来自
外设的一个请求信号,如外部中断。C620x/C670x 中断向量表
中断号 中断名称 中断功能
00000b DSPINT Host port host to DSP interrupt
00001b TINT0 Timer 0 interrupt
00010b TINT1 Timer 1 interrupt
00011b SD_INT EMIF SDRAM timer interrupt
00100b EXT_INT4 External interrupt 4
00101b EXT_INT5 External interrupt 5
00110b EXT_INT6 External interrupt 6
00111b EXT_INT7 External interrupt 7
01000b EDMA_INT EDMA channel (0 through 15) interrupt
01001b Reserved Not used
01010b Reserved Not used
01011b Reserved Not used
01100b XINT0 McBSP 0 transmit interrupt
01101b RINT0 McBSP 0 receive interrupt
01110b XINT1 McBSP 1 transmit interrupt
01111b RINT1 McBSP 1 receive interrupt
Other Reserved
不同型号的 DSP 定义中断号所对应的中断功能不同,为了达到统一使用中断号功能,
DSP 可以使用中断复用寄存器进行重新映射。通过中断复用寄存器映射可以把中断源映射
到任何 CPU中断。
中断复用寄存器默认中断号映射表
CPU |
Related |
INTSEL |
Interrupt |
|
Interrupt |
INTSEL field |
Reset Value |
Acronym |
Interrupt Deion |
INT4 |
INTSEL4 |
00100b |
EXT_INT4 |
External interrupt pin 4 |
INT5 |
INTSEL5 |
00101b |
EXT_INT5 |
External interrupt pin 5 |
INT6 |
INTSEL6 |
00110b |
EXT_INT6 |
External interrupt pin 6 |
INT7 |
INTSEL7 |
00111b |
EXT_INT7 |
External interrupt pin 7 |
INT8 |
INTSEL8 |
01000b |
DMA_INT0/ |
DMA Channel 0 Interrupt/ |
|
|
|
EDMA_INT |
EDMA interrupt |
INT9 |
INTSEL9 |
01001b |
DMA_INT1 |
DMA Channel 1 interrupt?? |
INT10 |
INTSEL10 |
00011b |
SD_INT |
EMIF SDRAM timer interrupt |
|
|
|
|
(C62x/C67x) |
|
|
|
SD_INTA |
EMIFA SDRAM timer interrupt |
|
|
|
|
(C64x) |
INT11 |
INTSEL11 |
01010b |
DMA_INT2 |
DMA Channel 2 interrupt?? |
INT12 |
INTSEL12 |
01011b |
DMA_INT3 |
DMA Channel 3 interrupt?? |
INT13 |
INTSEL13 |
00000b |
DSPINT |
Host port to DSP interrupt |
INT14 |
INTSEL14 |
00001b |
TINT0 |
Timer 0 interrupt |
INT15 |
INTSEL15 |
00010b |
TINT1 |
Timer 1 interrupt |
3. 常用中断寄存器
通过对中断寄存器进行配置,可以实现各种中断功能。
IER(中断使能寄存器)
IFR(中断标志寄存器)
ISR(中断设置寄存器)
ICR(中断清除寄存器)
ISTP(中断向量表起始地址寄存器)中断向量程序的地址可以通过 ISTP寄存器进行重新映
射
MUXH(中断复用寄存器)
MUXL(中断复用寄存器)
通过 DSP data sheet 可以很容易找到寄存器的绝对地址,但为了减少配置错误和方便移
植,在编程时一般采用 CSL 函数对中断寄存进行配置。
4. CSL(DSP API 函数)函数使用说明
在开发 DSP 的过程中一定要用好 CSL 函数,它给 DSP 的编程带来很多方便。使用 CSL
函数可以使程序更容易理解和维护,同时可以有效避免在编程中的笔误。
IRQ_clear(IRQ_EVT_TINT0);//对 IFR寄存器进行操作,定时中断标志位清零
IRQ_enable(IRQ_EVT_TINT0;//对 IER寄存器进行操作,使能定时中断
IRQ_map(IRQ_EVT_TINT0,12);//对 MUX 寄存器进行配置,根据需要把中断号进行重新映
射。
IRQ_globalEnable();//对CSR 中 GIE 标志位进行配置,标志位置 1;
。。。。。。。。。。。。。
相应的 CSL函数可以在 CCS自带的PDF 文档《TMS320C6000Chip Support Library API
Reference Guide》中进行查找
5. 中断响应流程图
6. 中断过程描述
1. 上电复位,产生复位中断请求,上电中断无需确认,直接执行。
2. STW B0,*--B15; 进行现场保护
3. MVKL addr,B0;
MVKH addr,B0;载入中断向量表,将中断向量表送入程序指针。
4. B B0;跳转至 B0 中存储的地址,执行中断向量表。
5. 执行_c_int00 进行初始化
6. 跳转至 main()执行 csl 函数,IO口,定时器等初始化。
7. 执行 while 循环。
8. 定时时间到,产生定时中断。
9. 重复执行 2-4步骤
10. 执行中断服务程序 c_int14。
11. 中断返回
12. LDW *B15++,B0 恢复现场。
13. 继续执行 while 循环。
7. 中断程序解析
void main()
{
CSL_init();//CSL函数初始化
Htimer = TIMER_open(TIMER_DEV0,TIMER_OPEN_RESET);//打开定时器 0,返回定
时器句柄
TimerEventId = TIMER_getEventId(Htimer);//取得定时事件 ID
TIMER_config(Htimer,&Mtimer_configA);//配置定时器
Hgpio = GPIO_open(GPIO_DEV0,GPIO_OPEN_RESET);//打开 IO
GPIO_config(Hgpio,&Mgpio_config);//配置 IO
IRQ_setVecs(vectors);//重新设置中断向量,
IRQ_globalEnable();//全局中断使能
IRQ_nmiEnable();
IRQ_map(TimerEventId,14);//把定时中断重新映射到 14
IRQ_reset(TimerEventId);
IRQ_enable(TimerEventId);//
TIMER_start(Htimer);//定时开始
while(1);//死循环
TIMER_close(Htimer);
GPIO_close(Hgpio);
}
/**********************************************************************
* 中断服务程序
**********************************************************************/
interrupt void c_int14(void)//中断服务程序
{
if(flag==0)
{
GPIO_pinWrite(Hgpio,GPIO_PIN3,flag);
flag=1;
}
else
{
GPIO_pinWrite(Hgpio,GPIO_PIN3,1); //点灯
flag=0;
}
}
*------------------------------------------------------------------------------
* Global symbols defined here and exported out of this file
*------------------------------------------------------------------------------
.global _vectors//全局标号,可以在别处使用.
.global _c_int00
.global _vector1
.global _vector2
.global _vector3
.global _vector4
.global _vector5
.global _vector6
.global _vector7
.global _vector8
.global _vector9
.global _vector10
.global _vector11
.global _vector12
.global _vector13
.global _c_int14 ; Hookup the c_int14 ISR in main()
.global _vector15
*------------------------------------------------------------------------------
* Global symbols referenced in this file but defined somewhere else.
* Remember that your interrupt service routines need to be referenced here.
*------------------------------------------------------------------------------
.ref _c_int00//相当于 extern,在这里引用,在别处定义
*------------------------------------------------------------------------------
* This is a macro that instantiates one entry in the interrupt service table.
*------------------------------------------------------------------------------
VEC_ENTRY .macro addr//定义中断向量入口地址
STW B0,*--B15;保存B0 内容,中断产生后执行的第一条指令
MVKL addr,B0;
MVKH addr,B0;//把地址装入 B0
B B0;跳转至 B0 中存储的地址
LDW *B15++,B0;恢复B0内容; 由于C6000流水线的原因,跳转后仍然可以执行多条指
令
NOP 2
NOP
NOP
.endm
*------------------------------------------------------------------------------
* This is a dummy interrupt service routine used to initialize the IST.
*------------------------------------------------------------------------------
_vec_dummy:未定义中断服务程序
B B3;其他没有定义的中断跳转至 B3 存储的地址
NOP 5
*------------------------------------------------------------------------------
* This is the actual interrupt service table (IST). It is properly aligned and
* is located in the subsection .text:vecs. This means if you don't explicitly
* specify this section in your linker command file, it will default and link
* into the .text section. Remember to set the ISTP register to point to this
* table.
*------------------------------------------------------------------------------
.sect ".text:vecs";定义段
.align 1024;1024 字节对边界对齐
_vectors:
_vector0: VEC_ENTRY _c_int00 ;RESET 跳转到_c_int00 ,_c_int00是 c语言程序的入口
_vector1: VEC_ENTRY _vec_dummy ;NMI
_vector2: VEC_ENTRY _vec_dummy ;RSVD
_vector3: VEC_ENTRY _vec_dummy ; 所有未定义中断均跳转到同一地址
_vector4: VEC_ENTRY _vec_dummy
_vector5: VEC_ENTRY _vec_dummy
_vector6: VEC_ENTRY _vec_dummy
_vector7: VEC_ENTRY _vec_dummy
_vector8: VEC_ENTRY _vec_dummy
_vector9: VEC_ENTRY _vec_dummy
_vector10: VEC_ENTRY _vec_dummy
_vector11: VEC_ENTRY _vec_dummy
_vector12: VEC_ENTRY _vec_dummy
_vector13: VEC_ENTRY _vec_dummy
_vector14: VEC_ENTRY _c_int14 ; Hookup the c_int14 ISR in main() 定时中断中断向量
_vector15: VEC_ENTRY _vec_dummy
*-------------------------------------------------------------------------------------------------------------