《DSP中断设置简明教程》由会员分享,可在线阅读,更多相关《DSP中断设置简明教程(15页珍藏版)》请在金锄头文库上搜索。
1、DSP+ARM 转载 DSP中断设置简明教程定时器 , 工作, 寄存器, 通用, 程序一、简述本文介绍 TMS320C6000 系列中断设置的简明方法。通过示例定时器中断,MCBSP 串口接收中断及外部中断这三种中断实现过程,介绍如何实现中断各个寄 存器的配置,中断向量表书写以及中断服务函数。最后提供一个简要的示例程序可 供大家下载使用。此示例在 DSK6416的TI 官方实验板上通过测试。由于定时器和 串口工作模式较繁,因此对中断无关部分不做介绍。二、实现 DSP 中断需要做哪些通用工作设置允许哪些非屏蔽中断设置各个允许的非屏蔽中断的中断来源设置开启总中断设计中断向量表将中断向量表通过 cm
2、d 文件挂载到指令内存提供中断处理函数如果中断向量表首地址挂载的不是 0 地址,那么需要设置中断向量表地址寄存器对于不同的中断源,需要做各个自己的工作,比如如果是外部中断,那么需要设置 管脚极性,即由高 -低产生中断抑或反之。为了照顾知识较少的读者,下面将从一个新工程出发,引导大家建立一个中断示例 程序。如果您对建立工程很熟悉,可以跳过此步。三、建立新工程1. 点击 Project-New,设置 Project Name为 intexample,Project Type 为 Executable, Target选择您需要的器件,在此由于本人使用的是 DSK6416 评估板。因此选择 TMS32
3、0C64XX 。2. 添加标准库 rts6400.lib,以便自动产生 c_int00 等函数。右击当前工程,选择 “Add Files to Project 选择”库,所在路径,一般为 CCS 安装自带,可参考本 CCS3.1版本的 路径地址: CCStudio_v3.1C6000cgtoolslibrts6400.lib如果您使用的是其他器件类型,请在 lib 文件夹内选择其他器件库添加源文件,选择 File-New-Source File,保存为 main.c 到工程路径下 在此文件内书写主函数。void main(voidwhile(1;最后通过如 2 步骤添加此文件到工程。3. 添加
4、寄存器别名定义头文件。在本示例中,对需要用到的寄存器定义别名后,构 成 global.h 文件,内容在后文逐步介绍。在此可以建立一个空文件,并在main.c 中包括它。 i nclude global.h到此,一个 DSP 的新工程框架制作完毕。4. 添加 cmd 链接文件为了实现链接时内存配置,我们需要提供一个 cmd 文件,为了方便,可以从官方 的示例程序中拷贝一份,再加以修改。在安装目录下 D:CCStudio_v3.1tutorial 器件类型 hello1 示例下,会找到一个 hello1.cmd,将其拷贝到本工程目录下,并将其改名为 link.cmd ,最后将其添加到工程中。由于此
5、文件没有声明 stack 和 heap,会产生警告,如果动态数据较多也容易溢出。 因此我们最好在此文件提供 stack 和 heap的大小,其值可根据实际情况调整,修改 后,此文件内容类似为:-stack 0x1000-heap 0x1000MEMORYISRAM : origin = 0x0, len = 0x1000000SECTIONS.vectors ISRAM.text ISRAM.bss ISRAM.cinit ISRAM.const ISRAM.far ISRAM.stack ISRAM.cio ISRAM.sysmem ISRAM至此,工程建立完毕,可以编译一遍,观察是否正常。
6、 intexample.pjt - Debug main.c D:CCStudio_v3.1C6000cgtoolsbincl6x -g -frD:/intexample/Debug - d_DEBUG -mv6400 -Debug.lkf main.cLinking. D:CCStudio_v3.1C6000cgtoolsbincl6x -Debug.lkfBuild Complete,0 Errors, 0 Warnings, 0 Remarks.四、定时器中断设计首先,我们先实现一个定时器中断,因为它不受外部影响,容易测试。在 global.h 文件中,加入控制寄存器和中断寄存器别名定义
7、,另外为了使用定时器 1,也应对其别名进行定义: extern cregister volatile unsigned int AMR; extern cregister volatile unsigned int CSR; extern cregister volatile unsigned int IFR; extern cregister volatile unsigned int ISR; extern cregister volatile unsigned int ICR; extern cregister volatile unsigned int IER; extern creg
8、ister volatile unsigned int ISTP; extern cregister volatile unsigned int IRP; extern cregister volatile unsigned int NRP; extern cregister volatile unsigned int IN; extern cregister volatile unsigned int OUT;#define MUXH 0x019C0000#define MUXL 0x019C0004#define EXTPOL 0x019C0008#define CTL1 0x019800
9、00 /Timer1 control register#define PRD1 0x01980004 /Timer1 period register#define CNT1 0x01980008 /Timer1 counter register之后,在 main 函数中对定时器进行初始化,在此我们使用 Timer1,参数初始化函 数如下:void Timer1_Init(void*( volatile unsigned int* CTL1= 0x00000201; / 计数器功能设置*( volatile unsigned int* PRD1= 0x1000; / 计数器周期值*( volat
10、ile unsigned int* CTL1|= 0x000000C0; / 计数器清零,启动 并在主函数中调用它。随后我们设置中断寄存器参数。DSP支持 1个 RESET中断, 1个NMI (不可屏蔽中断), 12个可屏蔽中断 (INT4-15),它们具有优先级顺序, INT4最高, INT15 最低。每个中断号都可以 设置任何中断来源。在此我们选择中断 INT10 ,即开启中断 10,并设置其中断来 源为定时器 1,即在 MUXH 或 MUXL 中指定位上填写中断来源选择码:中断来源选择码定义如下:(此内容可以通过帮助中搜索 INTSEL 得到)INTSEL(Interrupt Selec
11、tion Number Deion00000b DSPINT Host port host to DSP interrupt00001b TINT0 Timer 0 interrupt00010b TINT1 Timer 1 interrupt00011b SD_INT EMIF SDRAM timer interrupt00100b EXT_INT4 External interrupt 400101b EXT_INT5 External interrupt 500110b EXT_INT6 External interrupt 600111b EXT_INT7 External inter
12、rupt 701000b EDMA_INT EDMA channel (0-15 interrupt01001-01011b Reserved01100b XINT0 McBSP0 transmit interrupt01101b RINT0 McBSP0 receive interrupt01110b XINT1 McBSP1 transmit interrupt01111b RINT1 McBSP1 receive interrupt10000-11111b Reserved从中得到定时器 1 的中断选择码为 00010。MUXH 和 MUXL 的寄存器定义如下:(也可以通过帮助得到)MU
13、XH位 中断来源30-26 INTSEL1525-21 INTSEL1420-16 INTSEL1314-10 INTSEL129-5 INTSEL114-0 INTSEL1031,15 位保留,填 0MUXL位 中断来源30-26 INTSEL925-21 INTSEL820-16 INTSEL714-10 INTSEL69-5 INTSEL54-0 INTSEL431,15 位保留,填 0因此,我们设置 MUXH 的第 4-0 位为定时器 1的中断选择码 00010,其余位可以任意设置 (在此可以填 1。转换为 16进制后,设置如下:*( volatile unsigned int* MU
14、XH=0x7fff7fe2;MUXL 可以不设置。开启中断到 IE10,使能全局中断:IER |= 0x00000402; / IE10=1CSR |= 0x00000001; / 全局中断使能以上就完成了中断参数的配置,中断启动并且可以进入了。下面是中断的处理过 程。主要分为设计中断向量表和中断处理函数。我们可以从 DSP CCS的示例中复制一份向量表的雏形。例如CCStudio_v3.1tutorialdsk6416hello1vectors.asm将其拷贝到本工程目录下并加入工程中 中断向量表包含了 16 个中断处理单元,每个单元限制必须是 8条指令。如果不够 8条,可以用 nop填充,
15、(但 nop 4算 1条语句),如果服务程序过多,那么可以 制作专门的中断服务程序,此时此表只起到跳转作用,这样 CPU 就可以正确寻址 找到正确的中断服务入口。首先分析一下此文件。文件开始定义了一个宏,用于处理未用到的中断。unused .macro id.global unused:id:unused:id:b unused:id: ; nested branches to block interruptsnop 4b unused:id:nopnopnopnopnop它的做法是让程序进入死循环,我认为这种做法未必最优,因此我建议使用直接返 回的方式。返回到被中断地址,对于可屏蔽中断为 b irp,因此将此宏部分替换 成,注意一定要凑够 8 条。unused .macro id.global unused:id:unused:id:b irpnop nopnop nopnopnopnop.endm这样,即使我们误开启了此中断,也会顺利返回。