dsp DM642学习必备资料.docx
- 文档编号:10941189
- 上传时间:2023-02-23
- 格式:DOCX
- 页数:55
- 大小:247.84KB
dsp DM642学习必备资料.docx
《dsp DM642学习必备资料.docx》由会员分享,可在线阅读,更多相关《dsp DM642学习必备资料.docx(55页珍藏版)》请在冰豆网上搜索。
dspDM642学习必备资料
EDMA事件
(2010-11-3016:
43:
41)
转载
分类:
DSP学习笔记
DM642处理器片上带有一个EDMA控制器,如果把CPU的工作比喻为前台事务,那么EDMA的工作则视为后台事务,不占用CPU时间,这种机制提高了CPU的工作效率。
DM642的EDMA控制器具有64个EDMA通道,每个通道均与DM642的某个事件关联,EDMA事件触发和CPU中断触发类似,只要正确设置了EDMA通道,满足触发条件后在程序中便会自动进入相应的EDMA事件处理函数。
下面来分析一下,关于视频通道与EDMA通道的关联
DM642的EDMA事件和EDMA通道之间的映射关系如下:
EDMA通道
EDMA事件名称
事件描述
16
VP0EVTYA
发生在VP0A通道上与视频Y分量相关的事件
17
VP0EVTUA
发生在VP0A通道上与视频U分量相关的事件
18
VP0EVTVA
发生在VP0A通道上与视频V分量相关的事件
24
VP0EVTYB
发生在VP0B通道上与视频Y分量相关的事件
25
VP0EVTUB
发生在VP0B通道上与视频U分量相关的事件
26
VP0EVTVB
发生在VP0B通道上与视频V分量相关的事件
38
VP1EVTYB
发生在VP1B通道上与视频Y分量相关的事件
39
VP1EVTUB
发生在VP1B通道上与视频U分量相关的事件
40
VP1EVTVB
发生在VP1B通道上与视频V分量相关的事件
41
VP2EVTYA
发生在VP2B通道上与视频Y分量相关的事件
42
VP2EVTUB
发生在VP2B通道上与视频U分量相关的事件
43
VP2EVTVB
发生在VP2B通道上与视频V分量相关的事件
56
VP1EVTYA
发生在VP1A通道上与视频Y分量相关的事件
57
VP1EVTUA
发生在VP1A通道上与视频U分量相关的事件
58
VP1EVTVA
发生在VP1A通道上与视频V分量相关的事件
59
VP2EVTYA
发生在VP2A通道上与视频Y分量相关的事件
60
VP2EVTUA
发生在VP2A通道上与视频U分量相关的事件
61
VP2EVTVA
发生在VP2A通道上与视频V分量相关的事件
EDMA是数字信号处理器用于快速数据交换的重要技术,具有独立于CPU的后台批量数据传输能力,能够满足实时图像处理中高速数据传输的要求。
CSL库中的EDMA配置和操作函数:
EDMA_open()函数用于打开一个EDMA通道,该函数具有如下形式:
EDMA_HandleEDMA_open(intchaNum,Uint32flags);
eg:
EDMA_Handle*edmaHandle; *edmaHandle=EDMA_open(eventId,EDMA_OPEN_RESET);
该函数返回指向EDMA通道的句柄EDMA_Handle,chaNum为EDMA通道对应的事件名称。
flags为EDMA通道的打开方式,去EDMA_OPEN_RESET或EDMA_OPEN_ENABLE中的一个。
与EDMA_open()函数对应的是voidEDMA_close(EDMA_HandlehEdma)函数,该函数关闭jEdma指向的已经被打开的EDMA通道。
EDMA_open()函数和EDMA_close()函数的使用方法如下:
EDMA_HandlehEdma;
…
hEdma=EDMA_open(EDMA_CHA_TINT0,EDMA_OPEN_RESET);
…
EDMA_close(hEdma);
eg:
CSLAPIEDMA_HandleEDMA_open(intchaNum,Uint32flags);
CSLAPIvoidEDMA_close(EDMA_HandlehEdma);
EDMA_config()函数和EDMA_configArgs()函数用于配置DSP的EDMA通道,EDMA_config()函数使用一个EDMA_Config结构体设置EDMA,而EDMA_configArgs()函数使用独立的参数设置EDMA,两个函数尽管在形式上有所区别,但在功能上是类似的,它们的定义如下:
voidEDMA_config(EDMA_HandlehEdma,EDMA_Config*config);
voidEDMA_configArgs(EDMA_HandlehEdma,Uint32opt,Uint32src,Uintcnt,Uint32dst,Uintidx,Uint32rld);
在EDMA_config()函数中,hEdma是指向EDMA通道的句柄,config是指向EDMA_Config类型结构体的结构变量。
在EDMA_configArfs()函数中opt、src、cnt、dst、idx、rld等变量与EDMA_Config结构体中定义的成员变量含义相同。
CSLAPIEDMA_HandleEDMA_allocTable(inttableNum);
CSLAPIvoidEDMA_freeTable(EDMA_HandlehEdma);
EDMA_allocTable()函数为EDMA通道分配PRAM连接表,tableNum是分配的表号,它的取值范围从0至EDMA_TABLE_CNT-1。
与DMA的自动初始化模式相比,DM642的EDMA控制器建立了一种更加灵活的数据传输机制,即链接机制,通过链接把多个EDMA参数联系起来,构成一个传输链,传输链中的所有参数服务于同一个EDMA通道。
在传输链中,数据传输结束后,链接机制会自动从RAM中加载下一批事件参数。
CSLAPIintEDMA_allocTableEx(intcnt,EDMA_Handle*array);
CSLAPIvoidEDMA_freeTableEx(intcnt,EDMA_Handle*array);
EDMA_allocTableEx()函数为EDMA分配一系列链接表。
cnt为链接表的数目,array为存放链接表指针的数组。
EDMA_allocTableEx()函数的使用方法如下:
EDMA_HandlehEdmaTableArray[16];
…
if(EDMA_allocTableEx(16,hEdmaTableArray))
{//执行相应的代码
…
}
EDMA_chain()函数用于设置EDMA通道的TCC和TCINT字段,它的形式如下:
IDECL voidEDMA_chain(EDMA_Handleparent,EDMA_HandlenextChannel,inttccflag,intatccflag);
EDMA_chain()函数的使用方法如下:
EDMA_link()函数用于连接两个EDMA数据传输通道,它的定义如下:
VoidEDMA_link(EDMA_Handleparent,EDMA_handlechild);
parent、child分别指向父EDMA通道和子EDMA通道的句柄,该函数的使用方法为
EDMA_HandlehEdma;
EDMA_HandlehEdmaTable;
…
hEdma=EDMA_open(EDMA_CHA_TINT1,0);
hEdmaTable=EDMA_allocTable(-1);
EDMA_link(hEdma,hEdmaTable);
EDMA_link(hEdmaTable,hEdmaTable);
中断向量表的初始化
(2010-11-3019:
48:
06)
转载
分类:
DSP学习笔记
//PointtotheIRQvectortable
IRQ_setVecs(vectors);
IRQ_map(IRQ_EVT_VINT1,11);
IRQ_map(IRQ_EVT_VINT0,12);
IRQ_reset(IRQ_EVT_VINT0);
IRQ_reset(IRQ_EVT_VINT1);
IRQ_nmiEnable();
IRQ_globalEnable();
CSLAPIvoidIRQ_map(Uint32eventId,Uint32intNumber)函数把事件eventId与中断intNumber关联起来。
CSLAPIvoid*IRQ_setVecs(void*vecs)函数用于设置中断向量表。
IDECLvoidIRQ_reset(Uint32eventId)函数用于分为eventId对应的事件。
IDECLvoidIRQ_globalEnable()函数用于设置CSR寄存器中的GIE位,把该位置“1”使能全局中断,然后才能使能与事件关联的事件中断。
IDECLvoidIRQ_nmiEnable()函数把IER寄存器的相应的位置1,施恩能够NMI中断;
DAT模块函数
(2010-11-3020:
13:
58)
转载
分类:
DSP学习笔记
DAT模块函数在DM642的EDMA操作中用于搬运数据。
DAT_busy()函数用于检测EDMA数据传输过程是否已经结束,定义如下:
Uint32DAT_busy(Uint32ID);
DAT_busy()函数如果返回一个非零值,则表明数据传输过程(DAT_copy()操作或DAT_fill()操作)正在进行,其他操作需要等待,如果该函数返回零,则表明数据传输过程已经完成,可以执行其他操作了。
DAT_busy()函数的使用方法如下:
DAT_open(DAT_CHAANY,DAT_PRI_LOW,0);//打开数据传输通道
…
Transferid=DAT_copy(src,dst,len);//数据copy,返回通道值
…
while(DAT_busy(transferid));//等待数据copy过程完成
DAT_copy()函数把源数据区中的数据转移到目标数据区中,它的定义如下:
Uint32DAT_copy(void*src,void*dst,Uint16byteCnt);
src表示源数据区起始地址指针,dst表示目标数据区起始指针,byteCnt为被搬运数据的长度,单位为字节,该函数返回数据搬运通道的ID值,供DAT_busy()等函数调用。
DM642的L2的EDMA数据总线为64位,要求数据以8字节为单位进行对其,所以bateCnt应为8的倍数,byteCnt为0时,数据搬运的结果是随机的。
函数的使用方法是:
DAT_open()函数用于打开一个DAT通道,该函数具有如下的定义:
Uint32DAT_open(intchaNum,intpriority,Uint32flags);
chaNum是为EDMA操作分配的数据通道,取DAT_CHAANY、DAT_CHA0、DAT_CHA1、DAT_CHA2、DAT_CHA3中的一个,priority变量规定了该通道的优先级,priority取DAT_PRI_LOW(低优先级)、DAT_PRI_HIGH(高优先级)中的一个,flags为标志位,明确数据操作的方式,如一维数据操作、二维数据操作等,对于二维数据操作flags应为DAT_OPEN_2D。
与DAT_open()函数想对应的是DAT_close()函数,DAT_close()函数用于关闭已打开的DAT通道。
CSLAPIintDAT_open(intchaNum,intpriority,Uint32flags);
CSLAPIvoidDAT_close();
CSLAPIUint32DAT_copy(void*src,void*dst,Uint16byteCnt);
CSLAPIUint32DAT_fill(void*dst,Uint16byteCnt,Uint32*value);
CSLAPIvoid DAT_wait(Uint32id);
CSLAPIint DAT_busy(Uint32id);
CSLAPIUint32DAT_copy2d(Uint32type,void*src,void*dst,Uint16lineLen,Uint16lineCnt,Uint16linePitch);
IDECLvoidDAT_setPriority(intpriority);
CSL库
(2010-11-3020:
33:
20)
转载
分类:
DSP学习笔记
在学习ti的dsp的时候,不可避免的要遭遇到“CSL”,在这里,我摘取《TMS320DM642DSP应用系统设计与开发》中的一些资料,来介绍CSL。
TI公司为其DSP产品提供了CSL(ChipSupportLibrary,CSL)库函数,DM642对应的CSL库文件的名称为cslDM642.lib(LittleEndian模式下使用的CSL库)或cslDM642e.lib(BigEndian模式下使用的CSL库)。
这下你就知道为什么在建立一个project的时候,要添加cslDM642.lib或者cslDM642e.lib文件了吧!
在程序设计过程中利用CSL库函数可以方便地访问DSP的寄存器和硬件资源,提高DSP软件的开发效率和速度。
现在我们来看一下针对DM642相关的CSL库中的模块函数。
CACHE\CHIP\DAT\DMA\EMAC\EMIFA\GPIO\HPI\IRQ\McASP\McBSP\MDIO\PCI\PWR\TIMER\VIC\VP.
左图为某project中添加了cslDM642.lib,编译成功之后,自动添加的CSL库中的相关的头文件。
右图为在CSL库中,头文件中的变量和函数与DSP硬件资源的对应关系。
GPIO模块函数
(2010-11-3020:
37:
02)
转载
分类:
DSP学习笔记
GPIO_RSET(GPGC,0x0);
GPIO_RSET(GPDIR,0x1);
GPIO_RSET(GPVAL,0x0);
voidGPIO_reset(GPIO_HandleHGpio)函数用于复位GPIO通道,GPIO寄存器将复位缺省值。
DSP常见错误
(2010-12-0108:
42:
55)
转载
分类:
DSP学习笔记
1、仿真器驱动的问题。
CCS和仿真器驱动要装在同一路径下,最好都选择其默认的路径。
有时,通过usb20emurst.exe检验到仿真器连接是好的,但打开CCS时,仍然跳出窗口提示Can’tinitializetargetCPU。
还是因为仿真器驱动安装问题,先将仿真器换一个usb接口试一下,如仍提示错误,则要重新安装驱动。
2、CCS配置。
选择C64xxXDS510Emulator;ConfigurationFile选择Auto-generateboarddatafilewithextraconfiguration项,C:
\ti\drivers\Seedusb2.cfg;I/OPort0x240;StartupGEL:
C:
\ti\cc\gel\SEEDDM642.gel。
3、编译错误:
SEED301_AverageSmooth\AverageSmoothloop2.jpt
error:
illegalrelocationtype050002foundinsection.debug_info,file
是因为rts6400.lib库文件与CCS版本不符。
库文件要使用CCS安装文件夹自带的。
4、编译错误:
symbolxxxisdefinedmultipletimes.
(1)因为库文件的问题,更改库文件;
(2)是因为将本应该在include下的文件加在了source里。
注意:
在uCOS_II.c文件里有include语句,包括了os_core.c、os_flag.c、os_mbox.c、os_mem.c、os_mutex.c、os_q.c、os_sem.c、os_task.c、os_time.c文件,因而这些文件不需手动加入工程。
5、编译错误:
symbolxxxisundefined。
出现symbol错误,一般都是因为库文件的问题。
6、编译错误:
fatalerror:
#errorNOCHIPDEFINED
解决方法:
buildoptions->compiler->preprocessor->definesymbols:
添加上实际的DSP芯片的型号,本工程为_DEBUG;CHIP_6416。
7、endian模式问题。
littleendian和bigendian是计算机字节顺序的两种格式,所谓字节顺序指的是长度跨越多个字节的数据的存放形式。
littleendian把低字节存放在内存的低位;bigendian将低字节存放在内存的高位。
现在主流的CPU,intel系列采用littleendian,motorola系列的CPU采用bigendian。
本工程中使用的C6416EVM,J25脚为endian模式选择脚,开路为littleendian,短路为bigendian,本工程选择littleendian模式。
8、CDM文件。
CMD文件是用来分配ROM和RAM空间的,告诉链接程序怎样计算地址和分配空间。
CMD给每个段分配地址,当想从一个段跳到另一个段时,就可以知道这个段的起始地址。
CMD文件包括两个部分:
MEMORY和SECTIONS。
例:
MEMORY
{
PAGE0:
VECS:
origin=00000h,length=00040h
LOW:
origin=00040h,length=03FC0h
SARAM:
origin=04000h,length=00800h
B0:
origin=0FF00h,length=00100h
PAGE1:
B0:
origin=00200h,length=00100h
B1:
origin=00300h,length=00100h
B2:
origin=00060h,length=00020h
SARAM:
origin=08000h,length=00800h
}
SECTIONS
{
.text :
{}>LOWPAGE0
.cinit:
{}>LOWPAGE0
.switch:
{}>LOWPAGE0
.const:
{}>SARAMPAGE1
.data :
{}>SARAMPAGE1
.bss :
{}>SARAMPAGE1
.stack:
{}>SARAMPAGE1
.sysmem:
{}>SARAMPAGE1
}
(1)系统定义:
.cinit存放C程序中的变量初值和常量;
.const存放C程序中的字符常量、浮点常量和用const声明的常量;
.switch存放C程序中switch语句的跳针表;
.text存放C程序的代码;
.bss为C程序中的全局和静态变量保留存储空间;
.far为C程序中用far声明的全局和静态变量保留空间;
.stack为C程序系统堆栈保留存储空间,用于保存返回地址、函数间的参数传递、存储局部变量和保存中间结果;
.sysmem用于C程序中malloc、calloc和realloc函数动态分配存储空间。
(2)用户定义:
#pragmaCODE_SECTION(symbol,"sectionname");
#pragmaDATA_SECTION(symbol,"sectionname");
另:
CMD文件中,可以不指定heap和stack的大小。
编译的时候只会警告。
CMD文件中的注释只能使用。
9、打印数组时,printf("%c",buff[i]);
10、CCS中,unsignedshort为2个字节,unsignedint为4个字节。
11、文件中include语句的使用。
如果AincludeB,且A、B属于同一文件夹,那就直接#include“B”;若B在另一个文件夹里(例如B在my文件夹里),那就#include“.\my\B”;若A在文件夹里,而B在文件夹外,则#include“..\B”(注意点的个数)。
做DSP最应该懂得157个问题
(2010-12-0117:
02:
25)
转载
分类:
DSP学习笔记
第1601篇:
做DSP最应该懂得157个问题(回答)
发布时间:
2006年5月28日
点击次数:
160
详细内容:
做DSP最应该懂得157个问题(回答)
做DSP最应该懂得157个问题(回答)
四.5V/3.3V如何混接?
TIDSP的发展同集成电路的发展一样,新的DSP都是3.3V的,但目前还有许多外围电路是5V的,因此在DSP系统中,经常有5V和3.3V的DSP混接问题。
在这些系统中,应注意:
1)DSP输出给5V的电路(如D/A),无需加任何缓冲电路,可以直接连接。
2)DSP输入5V的信号(如A/D),由于输入信号的电压>4V,超过了DSP的电源电压,DSP的外部信号没有保护电路,需要加缓冲,如74LVC245等,将5V信号变换成3.3V的信号。
3)仿真器的JTAG口的信号也必须为3.3V,否则有可能损坏DSP。
五.为什么要片内RAM大的DSP效率高?
目前DSP发展的片内存储器RAM越来越大,要设计高效的DSP系统,就应该选择片内RAM较大的DSP。
片内RAM同片外存储器相比,有以下优点:
1)片内RAM的速度较快,可以保证DSP无等待运行。
2)对于C2000/C3x/C5000系列,部分片内存储器可以在一个指令周期内访问两次,使得指令可以更加高效。
3)片内RAM运行稳定,不受外部的干扰影响,也不会干扰外部。
4)DSP片内多总线,在访问片内RAM时,不会影响其它总线的访问,效率较高。
六.为什么DSP从5V发展成3.3V?
超大规模集成电路的发展从1um,发展到目前的0.1um,芯片的电源电压也随之降低,功耗也随之降低。
DSP也同样从5V发展到目前的3.3V,核心电压发展到1V。
目前主流的DSP的外围均已发展为3.3V,5V的DSP的价格和功耗都价格,以逐渐被3.3V的DSP取代。
七如何选择DSP的电源芯片?
TMS320LF24
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- dsp DM642学习必备资料 DM642 学习 必备 资料
![提示](https://static.bdocx.com/images/bang_tan.gif)