C6726系列DSP外部中断的实现.docx
- 文档编号:24049750
- 上传时间:2023-05-23
- 格式:DOCX
- 页数:11
- 大小:585.28KB
C6726系列DSP外部中断的实现.docx
《C6726系列DSP外部中断的实现.docx》由会员分享,可在线阅读,更多相关《C6726系列DSP外部中断的实现.docx(11页珍藏版)》请在冰豆网上搜索。
C6726系列DSP外部中断的实现
C672x系列中断实现流程
TIC6727没有提供专门的外部中断引脚,使用McASPAMUTEIN引脚作为外部中断引脚,利用McASP的AMUTEiN事件触发dMAX,使dMAX产生相应的中断递交给CPU(可用中断:
INT9,INT10,INT11,INT12,INT13,INT15)。
以下为配置该中断的步骤及每步所要编的程序,同时又给出了每步所要配置的寄存器在数据手册中的说明。
一、配置CFGMCASPx寄存器,选择AMUTEINx引脚
#defineCFGMCASP0((int*)0x40000018)
#defineAXR70xFFFFFFF8
*CFGMCASP0=(*CFGMCASP0&AXR7)|0x00000001;
二、将上一步选择的相应管脚配置为GPIO输入引脚
#definePFUNC((int*)0x44000010)
#definePDIR((int*)0x44000014)
#definePOUT((int*)0x44000018)
#definePDIN((int*)0x4400001C)
#definePDSET((int*)0x4400001C)
#definePDCLR((int*)0x44000020)
#defineINTERUPT0xFFFFFF7F
*PDIR=(*PDIR&INTERUPT)|0x0;
*PFUNC=(*PFUNC&INTERUPT)|0x00000080;
三、在相应McASP模块中,禁止AMUTEIN信号驱动AMUTE输出,通过将AMUTE寄存器的INEN位清“0”来实现:
#defineAMUTE((int*)0x44000048)
#defineINEN0xFFFFFFFB
*AMUTE=(*AMUTE&INEN)|0x0;
四、配置dMAX
1)配置DEPR寄存器,选择上升沿或下降沿触发
2)配置DEHPR或DELPR寄存器,选择高优先级或低优先级
3)配置EVENTENTRY,选择中断号,将其保存在对应的Param位置
4)配置DEER寄存器,使能相应的dMAX事件
5,配置中断(SPRU733A)
以下为在数据手册中找到的dMAX的各个寄存器的地址,以及各个寄存器内部的说明:
.
(1)
#defineDEPR((int*)0x60000008)
#defineRISEING0X0
*DEPR=(*DEPR&RISEING|0xFFFFFFFF;
(2)
#defineDEHPR((int*)0x60000014
#definePRIORITY0X0
*DEHPR=(*DEHPR&PRIORITY|0xFFFFFFFF;
(3)配置EVENTENTRY,选择中断号,将其保存在对应的Param位置
(4)
#defineDEPR*(int*)0x60000008
#defineDEER*(int*)0x6000000C
#defineDEDR*(int*)0x60000010
#defineDEHPR*(int*)0x60000014
#defineDELPR*(int*)0x60000018
#defineDEFR*(int*)0x6000001C
#defineDER0*(int*)0x60000034
#defineDER1*(int*)0x60000054
#defineDER2*(int*)0x60000074
#defineDER3*(int*)0x60000094
#defineDFSR0*(int*)0x60000040
#defineDFSR1*(int*)0x60000060
#defineDTCR0*(int*)0x60000080
#defineDTCR1*(int*)0x600000A0
#defineMAX0_EVENT_TABLE0x61008000
#defineEVENT26(*(int*)(MAX0_EVENT_TABLE+26*4))
#defineEVENT26_PARA0x00060007
voidinitdMAX(void)
{
EVENT26=EVENT26_PARA;
DEPR|=0x04000000;
DEHPR|=0x04000000;
DEER|=0x04000000;
}
五配置中断(SPRU733A)
修改中断向量表,将相应中断的跳转地址改为对应的中断服务程序(也可通过程序实现),然后使能相应中断:
1)禁止全局中断CSR.GIE=0
2)使能相应中断IER.IEn=1
3)使能NMI中断IER.NMIE=1
4)使能全局中断CSR.GIE=1
下表为C672x系列DSP中各个中断的的意义,
中断向量表是.asm格式的文件,里面内容如下,根据情况可自行修改
unused.macroid
.globalunused:
id:
unused:
id:
bunused:
id:
;nestedbranchestoblockinterrupts
nop4
bunused:
id:
nop
nop
nop
nop
nop
.endm
.sect".vectors"
.align32*8*4;mustbealignedon256wordboundary
RESET:
unused0;resetvector
unused1
unused2
unused3
unused4
unused5
unused6
unused7
unused8
unused9
unused10
unused11
unused12
;unused13
.ref_xint
mvkl_xint,b0;loaddestinationfunctionaddresstob0
mvkh_xint,b0
bb0
nop
nop
nop
nop
nop
unused14
unused15
而对中断寄存器的操作如下所示:
cregisterunsignedintISTP,CSR,IER;
voidinitIntc(void)
{
CSR&=~1;//GIE=0,globaldisableinterrupt
ISTP=0x10000000;//interruptvectorbaseaddress=0x10000000ifyouchangeitmustchangexint.cmd.vectorssections
IER=0x2002;//interruptenableINT13andNMI
CSR|=1;//GIE=1,globalenableinterrupt
}
这里的cregister在TI的技术文档中有这样的描述:
ThecompilerextendstheC/C++languagebyaddingthecregisterkeywordtoallowhighlevellanguageaccesstocontrolregisters.Whenyouusethecregisterkeywordonanobject,thecompilercomparesthenameoftheobjecttoalistofstandardcontrolregistersfortheC28x(seeTable6-2).Ifthenamematches,thecompilergeneratesthecodetoreferencethecontrolregister.Ifthenamedoesnotmatch,thecompilerissuesanerror.
Table6-2.ValidControlRegisters
------------------------------------
RegisterDescription
------------------------------------------
IERInterruptenableregister
IFRInterruptflagregister
TousethecontrolregistersinTable6-2,youmustdeclareeachregisterasfollows.Thec28x.hincludefiledefinesallthecontrolregistersthroughthissyntax:
externcregistervolatileunsignedintregister;
所以ISTP,CSR,IER这三个寄存器是可以用关键字cregister定义的寄存器,定义之后就可以直接调用了并修改了。
PS:
在DSP62XX系列中有更多这样的寄存器。
六中断服务程序的格式:
如下
voidinterruptxint(void)
{
/*此处加入中断服务程序需要执行的内容*/
}
这里interrupt为关键字,xint与中断向量表中的xint是对应的,不要修改,
所有的这些都弄完了,就可以进行编译、运行了。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- C6726 系列 DSP 外部 中断 实现