DSP中断设置例如简明教程.docx

上传人:b****1 文档编号:13223713 上传时间:2023-06-12 格式:DOCX 页数:12 大小:27.50KB
下载 相关 举报
DSP中断设置例如简明教程.docx_第1页
第1页 / 共12页
DSP中断设置例如简明教程.docx_第2页
第2页 / 共12页
DSP中断设置例如简明教程.docx_第3页
第3页 / 共12页
DSP中断设置例如简明教程.docx_第4页
第4页 / 共12页
DSP中断设置例如简明教程.docx_第5页
第5页 / 共12页
DSP中断设置例如简明教程.docx_第6页
第6页 / 共12页
DSP中断设置例如简明教程.docx_第7页
第7页 / 共12页
DSP中断设置例如简明教程.docx_第8页
第8页 / 共12页
DSP中断设置例如简明教程.docx_第9页
第9页 / 共12页
DSP中断设置例如简明教程.docx_第10页
第10页 / 共12页
DSP中断设置例如简明教程.docx_第11页
第11页 / 共12页
DSP中断设置例如简明教程.docx_第12页
第12页 / 共12页
亲,该文档总共12页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

DSP中断设置例如简明教程.docx

《DSP中断设置例如简明教程.docx》由会员分享,可在线阅读,更多相关《DSP中断设置例如简明教程.docx(12页珍藏版)》请在冰点文库上搜索。

DSP中断设置例如简明教程.docx

DSP中断设置例如简明教程

DSP中断设置简明教程

wuzhenzhi

一、简述

本文介绍TMS320C6000系列中断设置的简明方式。

通过例如按时器中断,MCBSP串口接收中断及外部中断这三种中断实现进程,介绍如何实现中断各个寄放器的配置,中断向量表书写和中断效劳函数。

最后提供一个简要的例如程序可供大伙儿下载利用。

此例如在DSK6416的TI官方实验板上通过测试。

由于按时器和串口工作模式较繁,因此对中断无关部份不做介绍。

二、实现DSP中断需要做哪些通用工作

设置许诺哪些非屏蔽中断

设置各个许诺的非屏蔽中断的中断来源

设置开启总中断

设计中断向量表

将中断向量表通过cmd文件挂载到指令内存

提供中断处置函数

若是中断向量表首地址挂载的不是0地址,那么需要设置中断向量表地址寄放器

关于不同的中断源,需要做各个自己的工作,比如若是是外部中断,那么需要设置管脚极性,即由高->低产生中断抑或反之。

为了照顾知识较少的读者,下面将从一个新工程动身,引导大伙儿成立一个中断例如程序。

若是您对成立工程很熟悉,能够跳过此步。

三、成立新工程

1.点击Project->New,设置ProjectName为intexample,ProjectType为Executable,Target选择您需要的器件,在此由于本人利用的是DSK6416评估板。

因此选择TMS320C64XX。

2.添加标准库,以便自动产生c_int00等函数。

右击当前工程,选择“AddFilestoProject”,选择库所在途径,一样为CCS安装自带,可参考本版本的途径地址:

\\C6000\cgtools\lib\

若是您利用的是其他器件类型,请在lib文件夹内选择其他器件库。

添加源文件,选择File->New->SourceFile,保留为到工程途径下。

在此文件内书写主函数。

voidmain(void)

{

while

(1);

}

最后通过如2步骤添加此文件到工程。

3.添加寄放器别名概念头文件。

在本例如中,对需要用到的寄放器概念别名后,组成文件,内容在后文慢慢介绍。

在此能够成立一个空文件,并在中包括它。

#include""

到此,一个DSP的新工程框架制作完毕。

为了实现链接时内存配置,咱们需要提供一个cmd文件,为了方便,能够从官方的例如程序中拷贝一份,再加以修改。

在安装目录下D:

\\tutorial\器件类型\hello1例如下,会找到一个,

将其拷贝到本工程目录下,并将其更名为,最后将其添加到工程中。

由于此文件没有声明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

}

至此,工程成立完毕,能够编译一遍,观看是不是正常。

----------------------------Debug---------------------------

[]"D:

\\C6000\cgtools\bin\cl6x"-g-fr"D:

/intexample/Debug"-d"_DEBUG"-mv6400-@""""

[Linking...]"D:

\\C6000\cgtools\bin\cl6x"-@""

BuildComplete,

0Errors,0Warnings,0Remarks.

四、按时器中断设计

第一,咱们先实现一个按时器中断,因为它不受外部阻碍,容易测试。

在文件中,加入操纵寄放器和中断寄放器别名概念,另外为了利用按时器1,也应付其别名进行概念:

/*概念操纵寄放器*/

externcregistervolatileunsignedintAMR;/*AddressModeRegister*/

externcregistervolatileunsignedintCSR;/*ControlStatusRegister*/

externcregistervolatileunsignedintIFR;/*InterruptFlagRegister*/

externcregistervolatileunsignedintISR;/*InterruptSetRegister*/

externcregistervolatileunsignedintICR;/*InterruptClearRegister*/

externcregistervolatileunsignedintIER;/*InterruptEnableRegister*/

externcregistervolatileunsignedintISTP;/*InterruptServiceTblPtr*/

externcregistervolatileunsignedintIRP;/*InterruptReturnPointer*/

externcregistervolatileunsignedintNRP;/*Non-maskableIntReturnPtr*/

externcregistervolatileunsignedintIN;/*GeneralPurposeInputReg*/

externcregistervolatileunsignedintOUT;/*GeneralPurposeOutputReg*/

/*概念中断选择寄放器*/

#defineMUXH0x019C0000

#defineMUXL0x019C0004

#defineEXTPOL0x019C0008

/*概念按时器1寄放器*/

#defineCTL10x01980000000000C

acroid

.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"

因此咱们需要。

修改链接文件,加入INT区域,起点为0地址。

其大小为400H,将原先的ISRAM起始点修改。

并将SECTIONS中的.vector指向自己概念的内存区域。

MEMORY

{

INT:

origin=0x00000000,len=0x0000400

ISRAM:

origin=0x00000400,len=0x1000000

}

SECTIONS

{

.vectors>INT

}

中断向量表设置、安装完毕。

最后,设计中断效劳函数,在中添加:

interruptvoidxint0_isr(void)

{

}

注意,必然要标识interrupt关键字,用于产生中断返回语句birp,同时,此函数的入口参数和出口参数应为void。

若是需要更新变量,能够通过全局变量的方式。

另外,C语言函数名称与汇编相差一个“_”,请在设计中断向量表时注意添加。

通过上述步骤,整个按时器中断的制作进程就完成了。

现在能够在interruptvoidxint0_isr(void)上添加一个断点,运行后应该停在此处。

若是进入失败,能够先在的INT10:

stwb0,*--b15一句上设置断点,若是没有进入此处,证明中断没有进来,能够检查是不是在参数设置上显现了问题。

五、外部中断设计

DSP6000系列提供了INT4-7四个中断输入管脚,因此能够通过此四个管脚的输入电平转变实现外部中断。

关于电平转变的极性,分为高到低,低到高两种,因此,DSP采纳寄放器EXTPOL来设置。

EXTPOL只有低4位有效,别离代表INT4-7,关于每一个位有:

0:

低->高产生中断

1:

高->低产生中断

因此设置它即可完成极性转变。

下面,以设置外部端口INT7中断,并将其挂载到12号中断为例,简述实现进程:

将12号中断设置为外部中断7,即MUXH(4:

0)=00111,现在MUXH设置为:

*(volatileunsignedint*)MUXH=0x7fff7ce2;ef_extint7_isr

在中加入效劳函数:

interruptvoidextint7_isr(void)

{

}

在硬件上,对INT7/GPIO7管脚产生一个低->高的信号,那么能够触发出中断。

假设改变此极性,能够设置EXTPOL第四位为1:

*(volatileunsignedint*)EXTPOL|=0x00000008;

现在,一个高->低的信号能够产生中断。

需要注意的是,若是你对GPIO进行过初始化,必然要保证GPEN的中断引脚相应位为1。

如全数使能:

*(volatileunsignedint*)GPEN=0x000000F0;

六、MCBSP串口接收中断设计

在实际应用进程中,常常需要通过中断接收串口数据。

在此假设添加MCBSP0接收中断到11号。

第一,将MCBSP0别名添加到文件。

设置MCBSP0参数并启用,其初始化函数为:

voidMCBSP0_Init(void)

{

*(volatileunsignedint*)McBSP0_SPCR=0x00000000;

*(volatileunsignedint*)McBSP0_SRGR=0x200000FF;

*(volatileunsignedint*)McBSP0_PCR=0x00000800;

*(volatileunsignedint*)McBSP0_XCR=0x000100A0;

*(volatileunsignedint*)McBSP0_RCR=0x000100A0;

*(volatileunsignedint*)McBSP0_MCR=0x00000000;

*(volatileunsignedint*)McBSP0_SPCR|=0x00C10001;

}

并在main函数中挪用。

开启中断11:

IER|=0x00001C02;ef_rint0_isr;mcbsp0receiveinterrupthandler

这时,所有的任务完成了,能够通过设置断点观看一下接收的数值。

另外需要注意必然要在效劳程序中将数据掏出,不然会停止接到新的数据。

七、其他话题

1.设置中断向量表起始位置

上文讨论的都是将中断向量表放置在0地址,若是需要放置到任意地址(以400H对齐),那么就需要提供向量表起始地址。

比如咱们的终端向量位置:

INT设置为:

MEMORY

{

INT:

origin=0x00000400,len=0x0000400

ISRAM:

origin=0x00000800,len=0x1000000

}

那么咱们在初始化中断时,应设置:

ISTP=0x00000400;

2.查看此刻的中断位图

能够查看中断标志寄放器IFR相应位(15:

0)看是不是有中断抵达。

3.清除/设置原先的中断

若是需要清除原先的中断,能够通过对ICR寄放器相应位置位。

若是希望人工触发中断,能够设置ISR寄放器相应位置位,它们将更新IFR位图。

比如,咱们在按时器中断效劳程序中,通过设置ISR的第12位,人工触发外部INT7的12号中断。

interruptvoidxint0_isr(void)

{

ISR=0x00001000;

}

那么CPU将执行extint7_isr(void)处置其中断。

又比如,在上例的外部中断中,有时会显现刚一开机,没有发送信号就有中断进来的情形,那么如何克服呢?

能够通过ICR克服。

对ICR置位能够清除可屏蔽中断。

对应位有效。

比如在设置中断初始化时清除所有原先的中断。

那么能够加入语句:

ICR=0xffffffff;

BIOS下的中断设置

在DSP/BIOS治理下,咱们不需要自己设定中断向量表,和中断初始化等等,一切通过BIOS的图形化设置即可完成。

添加一个DSP/BIOS

选择File->New,在本测试下选择DSK6416,读者可依照自己实际需要选取。

保留为。

将其添加到工程。

如上例需求,选择HWI的10,11,12号中断,右键选择Properties别离填写如下参数:

HWI_INT10interruptsource=Timer_1function=_xint0_isr(注意下划线!

HWI_INT11interruptsource=MCSP_0_Receivefunction=_rint0_isr

HWI_INT11interruptsource=External_Pin_7function=_extint7_isr

在main函数中能够通过一样的方式启动中断。

IER|=0x00001C02;断进不来如何检查?

第一检查是不是设置IER相应位开启,CSR最低位置位,第二看看中断向量表地址是不是设置正确。

若是确认无误。

在向量表中断应当进入的位置设定断点。

运行看是不是执行到断点。

若是有,那么看看中断效劳程序有无执行到。

若是中断只进来一次后就再也无法进入了,能够查看中断向量表是不是能返回到原程序,若是不能返回,查看是不是是8条语句。

另外能够通过跟踪查看birp语句是不是被执行。

若是能够正常返回到原程序,例如串口接收,看看是不是没有取值致使阻塞。

若是是如此需要将原先值掏出才有新的中断。

6.中断假设干寄放器的说明到哪里去找?

能够通过Help->Contents,搜索关键字的方式取得。

也能够参考官方文档。

八、附带程序

本教程以附件提供三个例如:

1.onlytimerint——仅包括了按时器的例如

2.int——包括了完整的3种中断

3.intbios——提供了DSP/BIOS下的此3种中断。

九、参考文档

《TMS320C64x/C64x+DSPCPUandInstructionSetReferenceGuide》Chapter5interrupts

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 自然科学 > 物理

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2