版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、DSP+ARM转载DSP中断设置简明教程定时器,工作,寄存器,通用,程序一、简述本文介绍TMS320C6000系列中断设置的简明方法。通过示例定时器中断,MCBSP串口接收中断及外部中断这三种中断实现过程,介绍如何实现中断各个寄存器的配置,中断向量表书写以及中断服务函数。最后提供一个简要的示例程序可供大家下载使用。此示例在DSK6416的TI官方实验板上通过测试。由于定时器和串口工作模式较繁,因此对中断无关部分不做介绍。二、实现DSP中断需要做哪些通用工作设置允许哪些非屏蔽中断设置各个允许的非屏蔽中断的中断来源设置开启总中断设计中断向量表将中断向量表通过cmd文件挂载到指令内存提供中断处理函数
2、如果中断向量表首地址挂载的不是0地址,那么需要设置中断向量表地址寄存器对于不同的中断源,需要做各个自己的工作,比如如果是外部中断,那么需要设置管脚极性,即由高-低产生中断抑或反之。为了照顾知识较少的读者,下面将从一个新工程出发,引导大家建立一个中断示例程序。如果您对建立工程很熟悉,可以跳过此步。三、建立新工程1.点击Project-New,设置ProjectName为intexample,ProjectType为Executable,Target选择您需要的器件,在此由于本人使用的是DSK6416评估板。因此选择TMS320C64XX。2.添加标准库rts6400.lib,以便自动产生c_in
3、t00等函数。右击当前工程,选择“AddFilestoProject”,选择库所在路径,一般为CCS安装自带,可参考本CCS3.1版本的路径地址:CCStudio_v3.1C6000cgtoolslibrts6400.lib如果您使用的是其他器件类型,请在lib文件夹内选择其他器件库。添加源文件,选择File-New-SourceFile,保存为main.c到工程路径下。在此文件内书写主函数。voidmain(voidwhile(1;最后通过如2步骤添加此文件到工程。3.添加寄存器别名定义头文件。在本示例中,对需要用到的寄存器定义别名后,构成global.h文件,内容在后文逐步介绍。在此可以建
4、立一个空文件,并在main.c中包括它。includeglobal.h到此,一个DSP的新工程框架制作完毕。4.添加cmd链接文件为了实现链接时内存配置,我们需要提供一个cmd文件,为了方便,可以从官方的示例程序中拷贝一份,再加以修改。在安装目录下D:CCStudio_v3.1tutorial器件类型hellol示例下,会找到一个hello1.cmd,将其拷贝到本工程目录下,并将其改名为link.cmd,最后将其添加到工程中。由于此文件没有声明stack和heap,会产生警告,如果动态数据较多也容易溢出。因此我们最好在此文件提供stack和heap的大小,其值可根据实际情况调整,修改后,此文件
5、内容类似为:-stack0 x1000-heap0 x1000MEMORYISRAM:origin=0 x0,len=0 x1000000SECTIONS.vectorsISRAM.textISRAM.bssISRAM.cinitISRAM.constISRAM.farISRAM.stackISRAM.cioISRAM.sysmemISRAM至此,工程建立完毕,可以编译一遍,观察是否正常。intexample.pjt-Debugmain.cD:CCStudio_v3.1C6000cgtoolsbincl6x-g-frD:/intexample/Debug-d_DEBUG-mv6400-Debu
6、g.lkfmain.cLinking.D:CCStudio_v3.1C6000cgtoolsbincl6x-Debug.lkfBuildComplete,0Errors,0Warnings,0Remarks.四、定时器中断设计首先,我们先实现一个定时器中断,因为它不受外部影响,容易测试。在global.h文件中,加入控制寄存器和中断寄存器别名定义,另外为了使用定时器1,也应对其别名进行定义:externcregistervolatileunsignedintAMR;externcregistervolatileunsignedintCSR;externcregistervolatileunsi
7、gnedintIFR;externcregistervolatileunsignedintISR;externcregistervolatileunsignedintICR;externcregistervolatileunsignedintIER;externcregistervolatileunsignedintISTP;externcregistervolatileunsignedintIRP;externcregistervolatileunsignedintNRP;externcregistervolatileunsignedintIN;externcregistervolatile
8、unsignedintOUT;#defineMUXH0 x019C0000#defineMUXL0 x019C0004#defineEXTPOL0 x019C0008#defineCTL10 x01980000/Timer1controlregister#definePRD10 x01980004/Timer1periodregister#defineCNT10 x01980008/Timer1counterregister之后,在main函数中对定时器进行初始化,在此我们使用Timerl,参数初始化函数如下:voidTimerl_Init(void*(volatileunsignedint*
9、CTLl=0 x0000020l;/计数器功能设置*(volatileunsignedint*PRDl=0 xl000;/计数器周期值*(volatileunsignedint*CTLl|=0 x000000C0;/计数器清零,启动并在主函数中调用它随后我们设置中断寄存器参数DSP支持1个RESET中断,1个NMI(不可屏蔽中断),12个可屏蔽中断(INT4-15),它们具有优先级顺序,INT4最高,INT15最低。每个中断号都可以设置任何中断来源。在此我们选择中断INT10,即开启中断10,并设置其中断来源为定时器1,即在MUXH或MUXL中指定位上填写中断来源选择码:中断来源选择码定义如下
10、:(此内容可以通过帮助中搜索INTSEL得到)INTSEL(InterruptSelectionNumberDeion00000bDSPINTHostporthosttoDSPinterrupt00001bTINT0Timer0interrupt00010bTINT1Timer1interrupt00011bSD_INTEMIFSDRAMtimerinterrupt00100bEXT_INT4Externalinterrupt400101bEXT_INT5Externalinterrupt500110bEXT_INT6Externalinterrupt600111bEXT_INT7Extern
11、alinterrupt701000bEDMA_INTEDMAchannel(0-15interrupt01001-01011bReserved01100bXINT0McBSP0transmitinterrupt01101bRINT0McBSP0receiveinterrupt01110bXINT1McBSP1transmitinterrupt01111bRINT1McBSP1receiveinterrupt10000-11111bReserved从中得到定时器1的中断选择码为00010。MUXH和MUXL的寄存器定义如下:(也可以通过帮助得到)MUXH位中断来源30-26INTSEL1525-
12、21INTSEL1420-16INTSEL1314-10INTSEL129-5INTSEL114-0INTSEL1031,15位保留,填0MUXL位中断来源30-26INTSEL925-21INTSEL820-16INTSEL714-10INTSEL69-5INTSEL54-0INTSEL431,15位保留,填0因此,我们设置MUXH的第4-0位为定时器1的中断选择码00010,其余位可以任意设置(在此可以填1。转换为16进制后,设置如下:*(volatileunsignedint*MUXH=0 x7fff7fe2;MUXL可以不设置。开启中断到IE10,使能全局中断:IER|=0 x0000
13、0402;/IE10=1CSR|=0 x00000001;/全局中断使能以上就完成了中断参数的配置,中断启动并且可以进入了。下面是中断的处理过程。主要分为设计中断向量表和中断处理函数。我们可以从DSPCCS的示例中复制一份向量表的雏形。例如CCStudio_v3.1tutorialdsk6416hello1vectors.asm将其拷贝到本工程目录下并加入工程中。中断向量表包含了16个中断处理单元,每个单元限制必须是8条指令。如果不够8条,可以用nop填充,(但nop4算1条语句),如果服务程序过多,那么可以制作专门的中断服务程序,此时此表只起到跳转作用,这样CPU就可以正确寻址找到正确的中断
14、服务入口。首先分析一下此文件。文件开始定义了一个宏,用于处理未用到的中断。unused.macroid.globalunused:id:unused:id:bunused:id:;nestedbranchestoblockinterruptsnop4bunused:id:nopnopnopnopnop它的做法是让程序进入死循环,我认为这种做法未必最优,因此我建议使用直接返回的方式。返回到被中断地址,对于可屏蔽中断为birp,因此将此宏部分替换成,注意一定要凑够8条。unused.macroid.globalunused:id:unused:id:birpnopnopnopnopnopnopno
15、p.endm这样,即使我们误开启了此中断,也会顺利返回。当然,如果我们确信的确没有开启,那么其内容是无意义的。代码的正文部分用了一系列unusedn来插入此宏,起到占地的作用。由于NMI的返回与可屏蔽中断不同,它在向量表中位于RESET之下,即unused1,我们将其删除,替换为NMI:bnrpnopnopnopnopnopnopnop为了实现定时器1中断的处理,我们将unused10删除,替换为我们自己的中断跳转程序,如下:INT10:stwb0,*-b15mvkl_xint0_isr,b0mvkh_xint0_isr,b0bb0ldw*b15+,b0nop3nopnop另外,需要和语句:.
16、ref_c_int00;Centrypoint类似,添加处理程序的引用.ref_xint0_isr;timer1interrupthandler由于中断向量表的位置需要特定指明,且应对齐到400H,在此文件中,已经定义了段名:.sect.vectors因此我们需要将此.vector代码段挂载到专门的一段指定内存区域。修改link.cmd链接文件,加入INT区域,起点为0地址。其大小为400H,将原先的ISRAM起始点修改。并将SECTIONS中的.vector指向自己定义的内存区域。MEMORYINT:origin=0 x00000000,len=0 x0000400ISRAM:origin=
17、0 x00000400,len=0 x1000000SECTIONS.vectorsINT中断向量表设置、安装完毕最后,设计中断服务函数,在main.c中添加:interruptvoidxint0_isr(void注意,一定要标识interrupt关键字,用于产生中断返回语句birp,同时,此函数的入口参数和出口参数应为void。如果需要更新变量,可以通过全局变量的方式。另外,C语言函数名称与汇编相差一个“_”请在设计中断向量表时注意添加。经过上述步骤, 整个定时器中断的制作过程就完成了。 此时可以在interruptvoidxint0_isr(void上添加一个断点,运行后应该停在此处。如果
18、进入失败,可以先在vector.asm的INT10:stwb0,*-bl5句上设置断点,如果没有进入此处,证明中断没有进来,可以检查是否在参数设置上出现了问题。五、外部中断设计DSP6000系列提供了INT4-7四个中断输入管脚,因此可以通过此四个管脚的输入电平变化实现外部中断。对于电平变化的极性,分为高到低,低到高两种,因此,DSP采用寄存器EXTPOL来设置。EXTPOL只有低4位有效,分别代表INT4-7,对于每个位有:0:低-高产生中断1:高-低产生中断因此设置它即可完成极性变化。下面,以设置外部端口INT7中断,并将其挂载到12号中断为例,简述实现过程:将12号中断设置为外部中断7,
19、即MUXH(4:0)=00111,此时MUXH设置为:*(volatileunsignedint*MUXH=0 x7fff7ce2;/0111110011100010将IER的第12位开启。IER|=0 x00001402;/IE10=1IE12=1对vectors.asm的unused12替换为:INT12:stwb0,*-b15mvkl_extint7_isr,b0mvkh_extint7_isr,b0bb0ldw*b15+,b0nop3nopnop并添加引用.ref_extint7_isr在main.c中加入服务函数:interruptvoidextint7_isr(void在硬件上,对
20、INT7/GPIO7管脚产生一个低-高的信号,贝冋以触发出中断。若改变此极性,可以设置EXTPOL第四位为1:*(volatileunsignedint*EXTPOL|=0 x00000008;此时,一个高-低的信号可以产生中断。需要注意的是,如果你对GPIO进行过初始化,一定要保证GPEN的中断引脚相应位为1。如全部使能:*(volatileunsignedint*GPEN=0 x000000F0;六、MCBSP串口接收中断设计在实际应用过程中,经常需要通过中断接收串口数据。在此假设添加MCBSPO接收中断到11号。首先,将MCBSP0别名添加到global.h文件。设置MCBSP0参数并启
21、用,其初始化函数为:voidMCBSP0_Init(void*(volatileunsignedint*McBSP0_SPCR=0 x00000000;*(volatileunsignedint*McBSP0_SRGR=0 x200000FF;*(volatileunsignedint*McBSP0_PCR=0 x00000800;*(volatileunsignedint*McBSP0_XCR=0 x000100A0;*(volatileunsignedint*McBSP0_RCR=0 x000100A0;*(volatileunsignedint*McBSP0_MCR=0 x0000000
22、0;*(volatileunsignedint*McBSP0_SPCR|=0 x00C10001;并在main函数中调用。开启中断11:IER|=0 x00001C02;/IE10=1IE11=1IE12=1并将MUXH(9:5)=01101,综合以上三个中断,此时MUXH为:*(volatileunsignedint*MUXH=0 x7fff1da2;/0001110110100010当然,如果只考虑现在的中断,MUXH可以设置为:*(volatileunsignedint*MUXH=0 x7fff7dbf;/0111110110111111制作中断服务程序,将数据取出:interruptv
23、oidrint0_isr(voidintDotRev;DotRev=*(volatileunsignedint*McBSP0_DRR;修改vectors.asm,替换unused11为:INT11:stwb0,*-b15mvkl_rint0_isr,b0mvkh_rint0_isr,b0bb0ldw*b15+,b0nop3nopnop添加引用:.ref_rint0_isr;mcbsp0receiveinterrupthandler这时,所有的任务完成了,可以通过设置断点观察一下接收的数值。另外需要注意一定要在服务程序中将数据取出,否则会停止接到新的数据。七、其他话题1.设置中断向量表起始位置上
24、文讨论的都是将中断向量表放置在0地址,如果需要放置到任意地址(以400H对齐),那么就需要提供向量表起始地址。比如我们的终端向量位置:INT设置为:MEMORYINT:origin=0 x00000400,len=0 x0000400ISRAM:origin=0 x00000800,len=0 x1000000那么我们在初始化中断时,应设置:ISTP=0 x00000400;2.查看现在的中断位图可以查看中断标志寄存器IFR相应位(15:0)看是否有中断到达。3.清除/设置原先的中断如果需要清除原先的中断,可以通过对ICR寄存器相应位置位。如果希望人工触发中断,可以设置ISR寄存器相应位置位,它们将更新IFR位图。比如,我们在定时器中断服务程序中,通过设置ISR的第12位,人工触发外部INT7的12号中断。interruptvoidxint0_isr(voidISR=0 x00001000;那么CPU将执行extint7_isr(void处理此中断。又比如,在上例的外部中断中,有时会出现刚一开机,没有发送信号就有中断进来的情况,那么怎样克服呢?可以通过I
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年度网红电商品牌购销合同
- 施工方案对土石方材料的要求与选择
- 游泳教学与生命安全教育的融合
- 高校突发公共事件应急预案
- 数据中心安全管理措施与紧急情况应对实例分析
- 60条合同规定:如何实现一次性产品零使用
- 上市公司广告策划与执行合同范本
- 二手房订房合同条款解析
- 中欧技术合作合同
- 个人运输代理合同范例
- 《中国心力衰竭诊断和治疗指南(2024)》解读完整版
- 《档案管理课件》课件
- 2024年度中国共产主义共青团团课课件版
- 2025年中考物理终极押题猜想(新疆卷)(全解全析)
- 胫骨骨折的护理查房
- 抽水蓄能电站项目建设管理方案
- 电动工具培训课件
- 《智能网联汽车智能传感器测试与装调》电子教案
- 视频会议室改造方案
- 【中考真题】广东省2024年中考语文真题试卷
- GB/T 32399-2024信息技术云计算参考架构
评论
0/150
提交评论