中断向量表配置.docx
- 文档编号:29866590
- 上传时间:2023-07-27
- 格式:DOCX
- 页数:15
- 大小:22.88KB
中断向量表配置.docx
《中断向量表配置.docx》由会员分享,可在线阅读,更多相关《中断向量表配置.docx(15页珍藏版)》请在冰豆网上搜索。
中断向量表配置
DM6437 中断向量表配置
1.编写中断服务例程
在.c源文件中编写ISR函数c_intXX,用于中断处理,如:
interruptvoidc_intXX(void)
{
…;
}
注:
对于硬件中断而言,XX=00~15。
2.初始化中断向量表,并在内存段中的中断向量表中配置好对应的中断向量
首先是把中断向量表定位到某一内存段中,我们可以在cmd文件中配置中断向量表的内存映射,如:
MEMORY
{
VECS:
o=0x10800000 l=0x00000400
MEMTEST:
o=0x10800400 l=0x00000200
IRAM:
o=0x10800600 l=0x0001FA00
DDR2:
o=0x80000000 l=0x10000000
}
SECTIONS
{
.bss > IRAM
.cinit > IRAM
.cio > IRAM
.const > IRAM
.data > IRAM
.far > IRAM
.stack > IRAM
.switch > IRAM
.sysmem > IRAM
.text > IRAM
.vecs > VECS
.ddr2 > DDR2
}
然后建立一个.asm文件,用以配置中断向量表中的中断向量,我们需要声明一些全局变量,以便其他源文件可以引用这些变量或者引用其他源文件的变量,如:
*-----------------------------------------------------------------*Globalsymbolsdefinedhereandexportedoutofthisfile
*-------------------------------------------------------------------- .global_vectors
.global_c_int00
.global_vector1
.global_vector2 ;RSVD保留
.global_vector3 ;RSVD保留
.global_vector4
.global_vector5
.global_vector6
.global_vector7
.global_vector8
.global_vector9
.global_vector10
.global_vector11
.global_vector12
.global_vector13
.global_c_int14_vencint ;Hookupthec_int14ISRinmain()
.global_vector15
因为引用了rts的_c_int00中断,即RESET中断,因此需要引入这个符号:
.ref _c_int00
为了把中断服务例程的地址,即中断向量插入到中断向量表中,可以定义一个宏:
VEC_ENTRY.macroaddr
STW B0,*--B15
MVKL addr,B0
MVKH addr,B0
B B0
LDW *B15++,B0
NOP 2
NOP
NOP
.endm
为了初始化中断向量表中的中断向量,可以定义一个虚拟的中断向量:
_vec_dummy:
B B3
NOP 5
接下来就可以配置中断向量表了:
.sect“.vecs”
.align1024
_vectors:
_vector0:
VEC_ENTRY_c_int00 ;RESET中断
_vector1:
VEC_ENTRY_vec_dummy ;NMI不可屏蔽中断
_vector2:
VEC_ENTRY_vec_dummy ;保留中断1
_vector3:
VEC_ENTRY_vec_dummy ;保留中断2
_vector4:
VEC_ENTRY_vec_dummy;外部中断INT4
_vector5:
VEC_ENTRY_vec_dummy;外部中断INT5
_vector6:
VEC_ENTRY_vec_dummy ;外部中断INT6
_vector7:
VEC_ENTRY_vec_dummy;外部中断INT7
_vector8:
VEC_ENTRY_c_int08; EDMA控制器中断EDMAINT,对应于c_int08ISR
_vector9:
VEC_ENTRY_vec_dummy;JTAGRTDX中断
_vector10:
VEC_ENTRY_vec_dummy;EMIF_SDRAM_Timer中断
_vector11:
VEC_ENTRY_vec_dummy;McBSP_0_Receive中断
_vector12:
VEC_ENTRY_vec_dummy;McBSP_1_Transmit中断
_vector13:
VEC_ENTRY_vec_dummy;Host_Port_Host_to_DSP中断
_vector14:
VEC_ENTRY_vec_dummy;Timer0中断
_vector15:
VEC_ENTRY_vec_dummy;Timer1中断
3.在C程序中指定定义的中断向量表,并且启用CPU中断功能
在C程序中,用CSL的IRQ模块来设置中断比较方便,在设置之前,需要外部链接上面的asm程序的中断向量表符号:
externfarvoidvectors();//之所以为vectors,因为C编译器编译后自动改名其为_vectors
引用了中断向量表之后,就可以设置中断了:
IRQ_setVecs(vectors);//指向asm中定义的中断向量表
IRQ_nmiEnable();
IRQ_globalEnable();
IRQ_map(IRQ_EVT_EDMAINT,8); //映射事件到指定的物理中断号
IRQ_reset(IRQ_EVT_EDMAINT);
4.启动中断源,如venc中断
至此,中断服务例程c_int14_vencint 就可以为venc中断服务了,其它硬件中断向量的配置同理。
DSP中断设置简明教程 (2011-10-2610:
14)
分类:
未分类
一、 简述
本文介绍TMS320C6000系列中断设置的简明方法。
通过示例定时器中断,MCBSP串口接收中断及外部中断这三种中断实现过程,介绍如何实现中断各个寄存器的配置,中断向量表书写以及中断服务函数。
最后提供一个简要的示例程序可供大家下载使用。
此示例在DSK6416的TI官方实验板上通过测试。
由于定时器和串口工作模式较繁,因此对中断无关部分不做介绍。
二、 实现DSP中断需要做哪些通用工作
设置允许哪些非屏蔽中断
设置各个允许的非屏蔽中断的中断来源
设置开启总中断
设计中断向量表
将中断向量表通过cmd文件挂载到指令内存
提供中断处理函数
如果中断向量表首地址挂载的不是0地址,那么需要设置中断向量表地址寄存器
对于不同的中断源,需要做各个自己的工作,比如如果是外部中断,那么需要设置管脚极性,即由高->低产生中断抑或反之。
为了照顾知识较少的读者,下面将从一个新工程出发,引导大家建立一个中断示例程序。
如果您对建立工程很熟悉,可以跳过此步。
三、 建立新工程
1.点击Project->New,设置ProjectName为intexample,ProjectType为Executable,Target选择您需要的器件,在此由于本人使用的是DSK6416评估板。
因此选择TMS320C64XX。
2.添加标准库rts6400.lib,以便自动产生c_int00等函数。
右击当前工程,选择“AddFilestoProject”,选择库所在路径,一般为CCS安装自带,可参考本CCS3.1版本的路径地址:
\CCStudio_v3.1\C6000\cgtools\lib\rts6400.lib
如果您使用的是其他器件类型,请在lib文件夹内选择其他器件库。
添加源文件,选择File->New->SourceFile,保存为main.c到工程路径下。
在此文件内书写主函数。
voidmain(void)
{
while
(1);
}
最后通过如2步骤添加此文件到工程。
3.添加寄存器别名定义头文件。
在本示例中,对需要用到的寄存器定义别名后,构成global.h文件,内容在后文逐步介绍。
在此可以建立一个空文件,并在main.c中包括它。
#include"global.h"
到此,一个DSP的新工程框架制作完毕。
4.添加cmd链接文件
为了实现链接时内存配置,我们需要提供一个cmd文件,为了方便,可以从官方的示例程序中拷贝一份,再加以修改。
在安装目录下D:
\CCStudio_v3.1\tutorial\器件类型\hello1示例下,会找到一个hello1.cmd,
将其拷贝到本工程目录下,并将其改名为link.cmd,最后将其添加到工程中。
由于此文件没有声明stack和heap,会产生警告,如果动态数据较多也容易溢出。
因此我们最好在此文件提供stack和heap的大小,其值可根据实际情况调整,修改后,此文件内容类似为:
-stack0x1000
-heap0x1000
MEMORY
{
ISRAM :
origin=0x0, len=0x1000000
}
SECTIONS
{
.vectors>ISRAM
.text >ISRAM
.bss >ISRAM
.cinit >ISRAM
.const >ISRAM
.far >ISRAM
.stack >ISRAM
.cio >ISRAM
.sysmem >ISRAM
}
至此,工程建立完毕,可以编译一遍,观察是否正常。
--------------------------- intexample.pjt-Debug ---------------------------
[main.c]"D:
\CCStudio_v3.1\C6000\cgtools\bin\cl6x"-g-fr"D:
/intexample/Debug"-d"_DEBUG"-mv6400-@"Debug.lkf""main.c"
[Linking...]"D:
\CCStudio_v3.1\C6000\cgtools\bin\cl6x"-@"Debug.lkf"
BuildComplete,
0Errors,0Warnings,0Remarks.
四、 定时器中断设计
首先,我们先实现一个定时器中断,因为它不受外部影响,容易测试。
在global.h文件中,加入控制寄存器和中断寄存器别名定义,另外为了使用定时器1,也应对其别名进行定义:
/*定义控制寄存器*/
externcregistervolatileunsignedintAMR; /*AddressModeRegister */
externcregistervolatileunsignedintCSR; /*ControlStatusRegister */
externcregistervolatileunsignedintIFR; /*InterruptFlagRegister */
externcregistervolatileunsignedintISR; /*InterruptSetRegister */
externcregistervolatileunsignedintICR; /*InterruptClearRegister */
externcregistervolatileunsignedintIER; /*InterruptEnableRegister */
externcregistervolatileunsignedintISTP; /*InterruptServiceTblPtr */
externcregistervolatileunsignedintIRP; /*InterruptReturnPointer */
externcregistervolatileunsignedintNRP; /*Non-maskableIntReturnPtr*/
externcregistervolatileunsignedintIN; /*GeneralPurposeInputReg */
externcregistervolatileunsignedintOUT; /*GeneralPurposeOutputReg*/
/*定义中断选择寄存器*/
#defineMUXH 0x019C0000
#defineMUXL 0x019C0004
#defineEXTPOL 0x019C0008
/*定义定时器1寄存器*/
#defineCTL1 0x01980000 //Timer1controlregister
#definePRD1 0x01980004 //Timer1periodregister
#defineCNT1 0x01980008 //Timer1counterregister
之后,在main函数中对定时器进行初始化,在此我们使用Timer1,参数初始化函数如下:
voidTimer1_Init(void)
{
*(volatileunsignedint*)CTL1=0x00000201; //计数器功能设置
*(volatileunsignedint*)PRD1=0x1000; //计数器周期值
*(volatileunsignedint*)CTL1|=0x000000C0; //计数器清零,启动
}
并在主函数中调用它。
随后我们设置中断寄存器参数。
DSP支持1个RESET中断,1个NMI(不可屏蔽中断),12个可屏蔽中断(INT4-15),它们具有优先级顺序,INT4最高,INT15最低。
每个中断号都可以设置任何中断来源。
在此我们选择中断INT10,即开启中断10,并设置其中断来源为定时器1,即在MUXH或MUXL中指定位上填写中断来源选择码:
中断来源选择码定义如下:
(此内容可以通过帮助中搜索INTSEL得到)
INTSEL(InterruptSelectionNumberDeion)
00000b DSPINT HostporthosttoDSPinterrupt
00001b TINT0 Timer0interrupt
00010b TINT1 Timer1interrupt
00011b SD_INT EMIFSDRAMtimerinterrupt
00100b EXT_INT4 Externalinterrupt4
00101b EXT_INT5 Externalinterrupt5
00110b EXT_INT6 Externalinterrupt6
00111b EXT_INT7 Externalinterrupt7
01000b EDMA_INT EDMAchannel(0-15)interrupt
01001-01011b Reserved
01100b XINT0 McBSP0transmitinterrupt
01101b RINT0 McBSP0receiveinterrupt
01110b XINT1 McBSP1transmitinterrupt
01111b RINT1 McBSP1receiveinterrupt
10000-11111b Reserved
从中得到定时器1的中断选择码为00010。
MUXH和MUXL的寄存器定义如下:
(也可以通过帮助得到)
MUXH
位 中断来源
30-26 INTSEL15
25-21 INTSEL14
20-16 INTSEL13
14-10 INTSEL12
9-5 INTSEL11
4-0 INTSEL10
31,15位保留,填0
MUXL
位 中断来源
30-26 INTSEL9
25-21 INTSEL8
20-16 INTSEL7
14-10 INTSEL6
9-5 INTSEL5
4-0 INTSEL4
31,15位保留,填0
因此,我们设置MUXH的第4-0位为定时器1的中断选择码00010,其余位可以任意设置(在此可以填1)。
转换为16进制后,设置如下:
*(volatileunsignedint*)MUXH=0x7fff7fe2;
MUXL可以不设置。
开启中断到IE10,使能全局中断:
IER|=0x00000402; //IE10=1
CSR |=0x00000001; //全局中断使能
以上就完成了中断参数的配置,中断启动并且可以进入了。
下面是中断的处理过程。
主要分为设计中断向量表和中断处理函数。
我们可以从DSPCCS的示例中复制一份向量表的雏形。
例如\CCStudio_v3.1\tutorial\dsk6416\hello1\vectors.asm
将其拷贝到本工程目录下并加入工程中。
中断向量表包含了16个中断处理单元,每个单元限制必须是8条指令。
如果不够8条,可以用nop填充,(但nop4算1条语句),如果服务程序过多,那么可以制作专门的中断服务程序,此时此表只起到跳转作用,这样CPU就可以正确寻址找到正确的中断服务入口。
首先分析一下此文件。
文件开始定义了一个宏,用于处理未用到的中断。
unused .macroid
.globalunused:
id:
unused:
id:
bunused:
id:
;nestedbranchestoblockinterrupts
nop4
bunused:
id:
nop
nop
nop
nop
nop
它的做法是让程序进入死循环,我认为这种做法未必最优,因此我建议使用直接返回的方式。
返回到被中断地址,对于可屏蔽中断为birp,因此将此宏部分替换成,注意一定要凑够8条。
unused .macroid
.globalunused:
id:
unused:
id:
birp
nop
nop
nop
nop
nop
nop
nop
.endm
这样,即使我们误开启了此中断,也会顺利返回。
当然,如果我们确信的确没有开启,那么其内容是无意义的。
代码的正文部分用了一系列unusedn来插入此宏,起到占地的作用。
由于NMI的返回与可屏蔽中断不同,它在向量表中位于RESET之下,即unused1,我们将其删除,替换为
NMI:
bnrp
nop
nop
nop
nop
nop
nop
nop
为了实现定时器1中断的处理,我们将unused10删除,替换为我们自己的中断跳转程序,如下:
INT10:
stwb0,*--b15
mvkl_xint0_isr,b0
mvkh_xint0_isr,b0
bb0
ldw*b15++,b0
nop3
nop
nop
另外,需要和语句:
.ref_c_int00 ;Centrypoint
类似,添加处理程序的引用
.ref_xint0_isr ;timer1interrupthandler
由于中断向量表的位置需要特定指明,且应对齐到400H,在此文件中,已经定义了段名:
.sect".vectors"
因此我们需要将此.vector代码段挂载到专门的一段指定内存区域。
修改link.cmd链接文件,加入INT区域,起点为0地址。
其大小为400H,将原先的ISRAM起始点修改。
并将SECTIONS中的.vector指向自己定义的内存区域。
MEMORY
{
INT :
origin=0x00000000, len=0x0000400
ISRAM :
origin=0x00000400, len=0x1000000
}
SECTIONS
{
.vectors>INT
…
}
中断向量表设置、安装完毕。
最后,设计中断服务函数,在main.c中添加:
inte
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 中断 量表 配置