使用CCS进行DSP编程三CCS编程入门精.docx

上传人:b****6 文档编号:15983486 上传时间:2023-07-09 格式:DOCX 页数:11 大小:625.92KB
下载 相关 举报
使用CCS进行DSP编程三CCS编程入门精.docx_第1页
第1页 / 共11页
使用CCS进行DSP编程三CCS编程入门精.docx_第2页
第2页 / 共11页
使用CCS进行DSP编程三CCS编程入门精.docx_第3页
第3页 / 共11页
使用CCS进行DSP编程三CCS编程入门精.docx_第4页
第4页 / 共11页
使用CCS进行DSP编程三CCS编程入门精.docx_第5页
第5页 / 共11页
使用CCS进行DSP编程三CCS编程入门精.docx_第6页
第6页 / 共11页
使用CCS进行DSP编程三CCS编程入门精.docx_第7页
第7页 / 共11页
使用CCS进行DSP编程三CCS编程入门精.docx_第8页
第8页 / 共11页
使用CCS进行DSP编程三CCS编程入门精.docx_第9页
第9页 / 共11页
使用CCS进行DSP编程三CCS编程入门精.docx_第10页
第10页 / 共11页
使用CCS进行DSP编程三CCS编程入门精.docx_第11页
第11页 / 共11页
亲,该文档总共11页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

使用CCS进行DSP编程三CCS编程入门精.docx

《使用CCS进行DSP编程三CCS编程入门精.docx》由会员分享,可在线阅读,更多相关《使用CCS进行DSP编程三CCS编程入门精.docx(11页珍藏版)》请在冰点文库上搜索。

使用CCS进行DSP编程三CCS编程入门精.docx

使用CCS进行DSP编程三CCS编程入门精

使用CCS进行DSP编程(三)

——实现DMA和Interrupt

现在讨论在CCS进行DSP编程来实现DMA和Interrupt功能。

假定读者对CCS的使用已经比较了解,并有了一定的CCS编程经验。

如果读者还不太了解,请参阅《使用CCS进行DSP编程

(一)——CCS编程入门》、《使用CCS进行DSP编程

(二)——实现FFT》及其他CCS的学习文档。

下面用闻亭公司的C6xPa板硬件和闻亭公司的PCI仿真器为例,来实现DSP的DMA传输和硬件Interrupt功能。

首先来描述一下使用的硬件资源。

闻亭公司的C6xPa板有两路独立的最高采样率为40MHz精度为12bit的A/D,它与DSP的EXT_INT7相连,可以产生外部中断信号,通过FPGA的逻辑可以控制A/D的采集和采集多少数据产生一次中断,采集的数据放在DPRAM中(0x1400000开始的地址空间),通过DMA传输到DSP芯片上的存储器中(0x80000000开始的地址空间)。

在C语言环境中使用DMA和Interrupt功能,需要包含两个头文件,同时要用到相应的运行时库文件“csl6201.lib”和“dev6x.lib”。

对这两组头文件和运行时库文件,我们深入研究一下,看一看我们比较关心的函数有哪些。

下一次用到这些函数时,别忘了带上相应的运行时库文件%*&^*&^喔。

在dev6x.lib库文件中,直接与实现DMA和Interrupt功能相关的函数有如下几个:

dma_init

dma_global_init

dma_reset

intr_reset

intr_init

intr_hook

intr_map

intr_isn

intr_get_cpu_intr

isr_jump_table

在csl6201.lib库文件中,直接与实现DMA功能相关的函数有如下几个:

DMA_AllocGlobalReg

DMA_GetEventId

DMA_GBL_PRIVATE

DMA_Open

DMA_Start

DMA_HCHA0

DMA_HCHA1

DMA_HCHA2

DMA_HCHA3

DMA_Wait

DMA_SetGlobalReg

DMA_ConfigA

DMA_ConfigB

DMA_Stop

DMA_AutoStart

DMA_Pause

DMA_Reset

DMA_GetGlobalReg

DMA_SetAuxCtl

DMA_Close

DMA_FreeGlobalReg

DMA_Init

DMA_GetStatus

我们只需其中的一部分便可以实现DMA和Interrupt功能。

函数的具体使用说明和调用方式请参看TI的说明档。

下面直接看一下程序的源码,有一个整体的理解,然后再对具体的相关内容做一下说明,如果源码能够理解,就不需要再看具体说明了。

为了便于读者理解,

本人对相应部分作了处理,尽量使结构清晰,突出对DMA和Interrupt功能的实现:

接下来进行详细说明。

首先,包含头文件,

接着对DMA进行初始化赋值,

其中,各参数的含义如下:

我们使用DMA的源地址为0x01400000,目标地址为0x80008000,传输数据长度为1k*32bit,DMA控制寄存器的值的具体含义请参看各对应DSP的datasheet。

然后是对使用的函数进行引用说明,其他函数跟普通的VisualC++函数没有太大的区别,除了以下的例外:

其中,有一个关键字“interrupt”,它告诉TI的C编译器,这个函数是一个特殊

的中断服务函数,C编译器会另眼看待。

接下来对DMA操作句柄定义,相应的头文件对DMA_HANDLE作了定义,我们这里可以直接使用:

主程序非常简单,

实现DMA功能的子程序也很简单,只有四句:

第一句:

语法如下:

其中的DMA_CHAANY含义是“任意一个闲置的DMA通道”,并非有一个DMA

通道叫DMA_CHAANY,除了通道0~3的4个通道外,还有一个辅助DMA通道,是另做他用的。

我们取得了对DMA操作的句柄,就可以进行初始化和使用了。

第二句:

语法如下:

这里需要提前做DMA_CONFIG的初始化,这两步也可以用一步来实现,就用到另外一个函数:

它直接把各DMA寄存器的设置当作参数,一步到位。

第三句:

语法如下:

这个函数检测DMA的状态位,直到DMA结束后才退出,读者可以在下一次使用这个DMA通道前使用。

DSP可以执行其他的操作,或者执行此操作等待DMA传输结束。

第四句:

语法如下:

使用完DMA通道后,需要对它进行关闭,释放资源以备他用。

DMA的使用是很简单的,复杂的工作都由DSP硬件和TI的库函数来完成了。

我们要做的工作是理解这些,要想使用这些函数,不可避免要知道DMA各控制寄存器的具体含义,除了少数“天才”可以不学而知外,最好老老实实学习TI的文档)。

下面来看看中断功能是怎样实现的。

在中断服务子程序中,调用了DMA,完成数据的从外部双口RAM到DSP片内的传输,

而中断服务子程序是如何与硬件中断联系起来的呢?

中断的实现主要在中断初始化子程序里,在程序中对每一步的操作都进行了详细的说明。

我们一步一步来分析一下:

首先是用于中断处理的函数:

然后是用于中断处理的宏定义:

用到的一些助记符如下:

大家觉得上面的内容还不够丰富,请参阅TI的文档spru273b.pdf。

有了上面的理解,中断的实现过程就比较清楚了:

1.初始化中断服务表指针(ISTP):

intr_init();

2.选择用哪一个中断:

intr_map(CPU_INT7,ISN_EXT_INT7);

3.清中断:

INTR_CLR_FLAG(CPU_INT7);

4.中断服务子程序与中断号挂钩:

intr_hook(Int7_ISR,CPU_INT7);

5.打开非屏蔽中断:

INTR_ENABLE(CPU_INT_NMI);

6.打开所选中断:

INTR_ENABLE(CPU_INT7);

7.全局中断使能:

INTR_GLOBAL_ENABLE();读者可能会注意到,中断处理函数都是小写的,而宏定义都是大写的,在C语言的语法里是要注意的,否则会出现找不到函数或者函数未定义。

如果想用其他的中断源,可以按照上面的步骤依样而行,相信不会是什么太难的事情了。

每一步不是必须的,顺序也不是固定的。

Int7_ISR是本人举例时用的中断服务子程序名,大家可以使用任意的名字,而其中的程序也是随意根据需要编写,没有太多的限制。

读者如果对DSP的硬件很清楚,可以直接对中断寄存器进行赋值,不需要调用这些函数与宏定义。

相信现在大家对中断与DMA的实现已经心中有数了,但我还要强调一下,我所讲的实现是突出软件上的实现,进行DSP编程需要对硬件有足够必要的了解,否则会遇到某些难以理解的问题,我在这里尽量不涉及硬件,只是希望大家仔细对TI有关资料认真研究,避免我的介绍产生先入为主的不良影响。

例如我在DMA中执行了对双口RAM的读操作,而双口RAM是连接在EMIF上的,因此,进行读操作之前就必须对EMIF进行初始化操作,否则,出错是必然的,而且很难找出错误原因,切记切记。

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

当前位置:首页 > IT计算机 > 电脑基础知识

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

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