




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、dsp的c语言程序设计一、 为什么要使用c语言对dsp编程?c语言是高级语言,易学易用。c语言的编程效率极高,易于调试。c语言的可移植性好。二、 c程序的结构及组成完整的c程序是由一个主函数main()和其它的子函数组成的,每一个子函数完成特定的功能。dsp的c语言的入口地址固定为c_int00,在rts.lib中定义。c语言支持丰富的数据类型和数据结构,在ccs集成开发环境中,为c语言提供了完整的支持硬件的底层函数库和支持算法的dsp函数库。在使用c语言的库函数时,在工程中必须包括相应的函数库和rts.lib运行时支持库。下面是一般c语言程序的结构和组成框架。一般c程序的结构如下:/ #in
2、clude包含语句定义程序中使用的函数库对应的. h头文件#include “函数库1”#include #include “函数库3”/ #define 定义程序中所有的宏替换#define 宏替换名替换内容/本程序的内部函数声明,这些函数一般放在main()函数的后面函数类型 函数名(函数参数列表);/中断服务程序(函数)的声明interrupt void function_name (void);/全局变量声明变量类型全局变量名;/主函数main()void main(void)/局部变量定义for(;)/调用子函数来处理数据/完成数据的输入和输出功能/本程序的内部函数函数类型 函数名(
3、函数参数列表)/本函数的局部变量定义/本函数中的算法/程序结束三、 数据类型c语言支持的数据类型很丰富,包括字符型、短整型、整型、长整型、枚举型、浮点型、双精度浮点型、长双精度浮点型、数据指针及程序指针,要注意的是由于54x dsp是16位的处理器,它的字符型数据的长度是16位的,另外注意比较各种数据类型的长度、内容以及所表示的值的范围大小,可以发现短整型和整型数据类型是一致的,浮点型、双精度浮点型和长双精度浮点型是一致的,这是因为54x dsp的c语言编译器为了适应不同的编程习惯而这样定义的,所以实际使用中可以将常用的数据类型进行适当简化,即将短整型、整型统一为整型(int),将各种浮点类型
4、统一为浮点型(float)。另外,为了简化书写,用户可以自定义数据类型,例如在type.h中的定义:typedef float f32; /浮点型typedef long s32; /有符号的长整型typedef int s16; /有符号的整型typedef unsigned char u8; /无符号的字符型typedef unsigned int u16; /无符号的整型typedef unsigned long u32; /无符号的长整型详细内容请参考头文件type.h。四、 头文件中存储器映射寄存器(mmr)的定义和访问对于dsp的软件设计,首先必须明了dsp的可用片内资源及其访问方
5、法,包括dsp的片上存储器映射寄存器、程序存储器、数据存储器、i/o空间的寻址范围、寻址方式,片上外设的寄存器定义、工作流程以及编程控制方法。54x dsp的片内寄存器资源是通过两个头文件regs.h 和regs54x.h进行定义的,这些头文件位于 c:tic5400dsk5402include目录下,在这两个文件中定义了c54x dsp中涉及到的所有寄存器及其所包含的控制和状态比特,这些定义是使用宏替换定义#define进行的,例如:串口控制寄存器中接收移位寄存器满标志位的比特域定义:# define rsrfull 13 /rsrfull标志比特位于寄存器的bit13位置#define r
6、srfull_sz 1 /此标志的长度为1个比特我们只需要了解这些寄存器定义,在编程过程中直接使用而不需要自己来重新定义。reg54xx.h是对regs.h的扩展和补充,并且reg54xx.h头文件包含regs.h。注意#define的语句中“”是续行符。在regs.h和regs54xx.h中还定义了寄存器的访问方式宏定义,如: reg_read(addr); /寄存器读 reg_write(addr,val); /寄存器写 reset_bit(addr,bit); /bit位清零 get_bit(addr,bit); /取得bit位的值 set-bit(addr,bit); /bit位置1详
7、细内容请参考c:tic5400dsk5402include目录下的头文件regs.h 和regs54x.h。在头文件中,采用了以下几种方法对dsp内部的存储器映射寄存器(mmr)进行定义和访问: 使用#define宏定义语句定义mmr的地址,有两种定义方法:统一定义法:如mcbsp串口接收寄存器的定义:#define drr2_addr(port)(port? 0x40:0x20)#define drr1_addr(port)(port?0x41:0x21)它把mcbsp0和mcbsp1的串口接收寄存器合在一起进行了定义,通过port参数进行区分。单独定义法:#define drr20_add
8、r 0x20#define drr10_addr 0x21#define drr21_addr 0x40#define drr11_addr 0x41分别将mcbsp0和mcbsp1的串口接收寄存器进行了定义。统一定义法定义的寄存器用于对二者同时进行访问时比较方便,单独定义法定义的寄存器用于单独访问某个外设时比较方便。访问时使用“指针前缀+地址”的方式,例如:* (volatile unsigned int *) dxr1_addr(port)=value;/写dxr1寄存器variable=* (volatile unsigned int *) drr1_addr(port);/读drr1寄
9、存器使用宏定义函数进行访问。在regs.h和reg54xx.h头文件中,定义了如下的宏函数,可以使用它们对寄存器或存储器进行访问。 reg_read(addr);/寄存器读,addr为寄存器地址 reg_write(addr,value);/寄存器写,addr为寄存器地址,value为要写入的值例如:reg_read(ddr1_addr (port));/读drr1寄存器reg_write(dxr1_addr (port),value);/写dxr1寄存器,value为要写入的值 直接使用* (volatile unsigned int *) +地址的指针方式定义寄存器,其中“volutile
10、”关键字用来防止c编译器对本条语句进行优化。 例如:#define drr20 * (volatile unsigned int *)0x200x20是寄存器的地址,相当于&p,(volatile unsigned int *)0x20相当于一个地址变量p,* (volatile unsigned int *)0x20相当于指针数据类型。访问时直接使用即可,例如:dxr20=value;/写寄存器dxr20variable=drr20;/读寄存器drr20在头文件中,习惯上使用 “寄存器名+_+ addr”表示寄存器的地址宏定义,而是用寄存器名表示寄存器指针方式的宏定义,请注意区分,并在实际编
11、程时遵守这一习惯。由于54x dsp的存储器映像寄存器在头文件regs.h 和regs54x.h中已经按方式进行了定义,所以推荐使用方式访问dsp的存储器映像寄存器,不需要自己重新进行宏替换定义。对于ram存贮器可使用变量、数据指针、结构、联合、枚举等方式进行访问。其它等效的定义和访问方式除了的定义和访问方法之外,还有一些等效的定义和访问方法,这些方法不建议大家使用,只需要进行了解。定义:#define bspc0 (volatile unsigned int*)0x22使用: *bspc0=value;/写寄存器 reg_value=*bspc0;/读寄存器五、 dsp i/o空间的访问方式
12、1:在c语言中访问dsp的i/o空间借助于关键字ioport来进行,注意,此关键字只为dsp 54xx的编译器所识别和使用。在54xx中其定义格式为: ioport unsigned int porthex_num其中的import和port均为关键字,unsigned int 是i/o数据类型,在54xx中,i/o空间共有64k字,所以数据类型只能是char 、short、 int等16位的类型。一般使用格式如下:volatile ioport unsigned int portxx;/xx为16进制(hex)格式地址portxx=value;/写i/o端口variable=portxx;/
13、读i/o端口例如:当访问i/o空间在200h地址时,可以采取以下定义形式:ioport unsigned int port200;unsigned int test;test=port200; /读i/o端口,port200作为一个变量使用port200=test; /写i/o端口,port200作为一个变量使用更进一步地,可以使用ioport关键字和宏替换来定义i/o地址。例如:volatile ioport unsigned int portxx;/xx为16进制(hex)格式地址#define porta portxx/使用宏替换对portxx端口进行进一步定义porta=value;/
14、写i/o端口varich=porta;/读i/o端口例如,在board.h中对cpld扩展i/o寄存器的定义如下:/port declarations used to access cpld registersvolatile ioport u16 port0;volatile ioport u16 port1;volatile ioport u16 port2;volatile ioport u16 port3;volatile ioport u16 port4;volatile ioport u16 port5;volatile ioport u16 port6;volatile iopo
15、rt u16 port7;#define cpld_ctrl1_reg port0#define cpld_stat_reg port1#define cpld_dmctrl_reg port2#define cpld_dbio_reg port3#define cpld_ctrl2_reg port4#define cpld_sem0_reg port5#define cpld_sem1_reg port6#define cpld_slic_reg port7方式2:借助于库函数portread(port)和portwrite(port)对一段连续i/o端口进行读写在portio.h头中定义
16、了portread()、portwrite()函数。/*/* copyright (c) texas instruments, incorporated 2000 */*/*/*/* portio.h - header file for portio_.asm */* */* */* functions: */* */* portread() */* portwrite() */* */* */* static functions: */* none */* */* */* global variables defined */* */* */ /*/#ifndef _portio_h#def
17、ine _portio_h#include /*/* s16 portread(u16 port) */* */ /* this routine reads a word from the specified port. */* */* parameters: */* - port - port address (hex) */* */* return: */* - returns value read from port. */* */* notes: */* */ /*/s16 portread(u16 port);/*/* portwrite(u16 port, s16 value) *
18、/* */ /* this routine writes a word to the specified port. */* */* parameters: */* - port - port address (hex) */* - value - 16 bit word to write. */* */* return: */* - none */* */* notes: */* */ /*/void portwrite(u16 port, s16 value);#endif /* end of #ifndef _portio_h */使用时,先使用宏替换或枚举定义i/o端口的地址,然后使用
19、portread()和portwrite()函数访问i/o端口例如:#include portio.h /所需要的函数包含在portio.h中#define porta 0x00/使用宏替换定义i/o端口的地址#define portb 0x01或typedef enum/使用枚举定义i/o端口的地址porta=0x00;portb=0x01; cpldreg, *pcpldreg. variable=portread(porta);/读i/o端口 portwrite (portb)=value;/写i/o端口四、ccs中与c54xx相关的头文件ccs中与c54xx相关的所有头文件位于c:ti
20、c5400dsk5402include目录下,可以分为两类:一类头文件对dsp本身及外部接口电路所拥有的硬件资源进行描述定义,如regs.h 、regs54xx.h。另一类头文件对这些资源的设置和使用的接口函数库进行了描述,使用户可以不关心底层的驱动程序,直接调用库函数即可实现对硬件的控制,这些往往都是硬件开发人员所完成的,如ccs中的board.h 和mcbsp54.h.c5400cgtoolsinclude目录与c5400dsk5402include目录中的头文件类型不同。c5400cgtoolsinclude目录下是5000系列dsp的通用头文件,与硬件无关。c5400dsk5402in
21、clude目录下是硬件专用头文件,包括dsp芯片和dsk板。头文件和特定的库文件相关联,c5400cgtoolsinclude目录下的头文件与运行时支持库rts.lib相关联,c5400dsk5402include目录中的部分头文件与dsk板库文件drv5402.lib和dsk5402.lib相关联。drv5402.lib和dsk5402.lib函数库在c5400dsk5402lib目录下,dsk5402.lib是一个主要的库函数,内部使用了drv5402.lib。五、关于dsp程序中段的定义一个程序中到底有哪些段定义?一般地,对于固定的硬件应用系统,其存储器的配置也较为固定,存储器的配置需要
22、设计者自己定义,但理解了基本的段如:.text 、.data、 .stack 、.bss之外,用c语言编程时,对程序中所使用的段并不十分清楚,可以在写 .cmd文件时,只将memory部分写出,而暂时省略掉sections定义,ccs集成开发环境会自动生成 .map文件,其中详细记录了存储器和段的配置和使用情况、各个段的绝对地址和重新分配后的全局符号,根据其中的段的描述,我们反过来再重新修改 .cmd文件,进行合理地段到存储器的分配。dsp c语言开发环境所必有的段定义: cinit;c语言初始化段,包括初始化变量和常量表text;代码段,包括可执行代码、字符串和常量vectors;中断向量段
23、stack;堆栈段,为c的系统堆栈分配存储空间,用于变量的传递trapconst ;包括字符串常量和以const关键字定义的常量data;数据段bss;保留全局和静态变量空间cioswitch;为 .const语句建立的表格system;为动态存储器函数malloc、calloc、realloc分配存储空间dsp的c语言程序设计实验一、 分析工程blink.pjt中的程序blink.c,了解c语言程序的一般结构以及头文件和函数库的关系,并解读头文件的内容二、 修改程序blink.c,使三个发光二极管指示灯依次流水点亮熄灭例:编写程序blink.c主要说明:dsp c程序编制的流程函数库中函数的
24、使用(例如board.h)project的建立、编译、调试、执行cmd文件的编写试重新定义 .cmd文件,重新对project进行编译运行。自编写codec程序,.h头文件在c5400dsk5402include目录下,头文件对应的函数在c5400dsk5402libdrv5402.lib和dsk5402.lib 中。 dsk5402是一个主要的库函数,内部使用了drv5402.lib。5402上有两个多通道缓冲串行口(mcbsp0和mcbsp1),其寄存器定义位于头文件regs.h和reg54xx.h当中。 如果在file菜单中头“load program”项说明目标报未正常连接,注意观察
25、条提示:vecs:0080h length=0080h /*internetpram:orgin=7600h,length=8000h program ran */scratch ran5402 dsp 程序寄存储藏256k 如同加载执行 dsp 5402 64k(更多)程序存储器空间 64k(更多)数据存储器空间 64k i/o存储器空间可以由:片上rom,片上ran,片外floah,片外ran构成取决定于:mp/mc ovly flashenb,当map在外部存储器时,由于flashe决定访问flah=1还是外部ran=0,ovly flash 可以由片上ram、ran,片外flash r
26、am构成取决于drom dmsel,当map外部存储器空间时,由dmsel决定是访问flash/ram(dmsel=0)还是子报存储器,flash14个等待周期;ram1个等待周期。 c5402 device simulater; mp/mc=1 ovly=1 dram=05402 dsk load program 后:mp/mc=1 ovly=1 drom=0运行程序后:mp/mc=0 ovly=1 drom=0与管脚一致,suwsr等待状态寄存器d844 1 1 0 1 1 0 0 0 01 00 0 100 i/o空间 高32k 低32k 高32k 低32k 5 4 1 0 4mcbsp
27、串口以及ad50的初始化,ad50初始化包括以下步骤:1 打开codec 获取句柄(指针)2 设置ad转换的工作方式3 设置da转换的工作方式4 设置模拟输入增益5 设置模输出增益6 设置取样率 board init flagcade init flag code_setup_serial_port 设置串口 code_reset codee复位 cline_reset code_disable_tx_isr code_disable_vx_isr code_write_regs code_setup_serical_port serial_reset d:dsptest、dtkfftdee5
28、416.c 把project中所用到的所有头文件、库文件、包含文件均方向在project目录下,解析此工程,了解库函数的定义与源程序,code 的操作 串口(mcbsp)的操作mcbsp:tms320c5000系统dsp系统设计与开发实例,熟悉多通道缓冲串口的结构组成以及各个寄存器的内容工作方式,编程方法:mcbsp的初始化串口复位(发送复位、接收复位)设置所有寄存器的值spcr1、spcr2、rcr1、rcr2、xcr1、xcr2、spgr1、spgr2、pcrcode (ad50)的初始化 codec 复位 设置线路输入通道增益 设置输出增益 设置模拟工作方式输入选择line 设置数据部分
29、的运行模式 设置电源模式 设置数据格式,codec工作于主方式 设置波样率 启动codec另外:mcbsp的初始化及使用参考csl_mcbsp.h头文件的有关函数。mcbsp的初始化:接收器复位,spcr1的d0=0发送器复位,spcr2的d0=0设置spcr1寄存器:(0x007)(d15禁止数字环回:dlb=0(d14d13)接收数据符号扩展和调整方式:=00右对齐mcbs零填充(d12d11)时钟停止模式: =00时钟停止模式营业(d10d08)保留 (d7)dx31脚延迟功能 =0 关闭dx3脚延时功能(d6)保留(d5d4)接收中断模式 =00 当rrdy有效时,产生接收中断(d3)
30、接收帧同步错误标志 =0 不检测同步错误(d2)接收移位寄存满过速错误标志 =1接收移位寄存器满(d1)接收就绪标志 =1接收器就绪(d0)接收器复位 =1串口接收使能(接收器停止复位)设置rcr1寄存器(接收控制寄存器官)=0x0040ad50 寄存器的初始化:(按enter功能)codec 复位:control reg:ster1的设置adc工作模式为15bit模式 control register 2的 d4=0设置dac的工作模式为15bit模式 control register 1的 d0=0 设置dodec的模拟输入增益6db: control register 4的 d3d2=0
31、1设置dodec的模拟输入增益-6db: control register 4的 d1d0=01设置dodec的取样率为8000hz: control register 4的 d604=n=mclk 1288000ad50按寄存器初始化ad50按功能进行初始化 在code.h头文件中,定义了与codec(ad50)功能相关的枚举变量,除了可以调用code.h中提供的函数之外,我们可以利用这些枚举变量重新编写自己的函数,用枚举变量相或产生所需要的寄存器初始化值。片上外设寄存器的初始化方法:有两种,一是按要求填表,然后将结果直接写入寄存器;二是用寄存器各部分的宏定义相或,如mcbsp54.h各寄存
32、器比特的宏定义。报卡初始化brdinit(100);初始化的内容;#8806h29单元 ohxpc #0a0hpmstc1knd1=0 设置cpu的工作频率c1k2=0 c1k3=1 设置等待周期swr=d844h 设置报卡初始化标志 sxm=1 intm=1 *zch=*zch or ox2c 对i/o端口0、4、2、3、5、6进行初始化dsp技术及其应用常见问题.cmd文件的格式及编写.cmd文件的编写?硬件确定存贮器配置就基本确定了吗?5402 dsp存储器配置如何?是64k ram 、256k flash吗?boot loader 过程如何察看函数库内容,如board.h头文件中的函数
33、?在程序调试中,打开汇编窗口,使用断点、单步方式进行调试。dsp从复位到运行,mp/mc、 ovly 、drom位的变化?如何知道c程序中有哪些段定义?编译时生成并察看.map文件。ad50的一次通信二次通信如何用软件实现?ad50、aic23两种codec的操作是否一致?是否可调用一个库函数?不一致。dsk板的初始化包含哪些内容?csl库是否只能用于dsp_bios编程模式?否,可以在非dsp_bios环境下调用csl库。ad50的primary、second通信对应于mcbsp串口,是如何实现的分两次写,使用了宏函数mcbsp_dxr12.write().吗?5402dsk板上集成了一个并口仿真器,它仿真时装载程序是使用的jtag接口,还是hpi接口?使用dsk并口仿真器调试dsp时,各控制比特的设置以及memory的map如何?此时是否为hpi boot loader方式?并口仿真与hpi引导是否为一回事?不是,通过jtag下载调试程序,程序运行后暂停,此时mp/mc=0,ovly=1,drom=0。i/o空间cpld寄存器如何观察?ram中数据可读可改,ro
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 养殖厂出售合同标准文本
- 仓库购买合同范例简约
- 借款合同标准文本 汽车抵押
- 债权投资转让合同标准文本
- 书画挂牌合同标准文本
- 可爱的小猫(教学设计)-2023-2024学年六年级下册数学北师大版
- 京牌转让合同标准文本
- 农业劳务用工合同标准文本
- 停车泊位出让合同标准文本
- 内勤聘任合同标准文本
- 2024年上海杨浦区社区工作者笔试真题
- 建筑消防工程监理细则
- 天然气站租赁合同
- 2024年贵州贵州乌江煤层气勘探开发有限公司招聘笔试真题
- 2025年社会工作者职业水平考试初级综合能力测试题库
- 四川2025年01月成都市金牛区人民政府金泉街道办事处2025年招考2名社区工作者笔试历年典型考题(历年真题考点)解题思路附带答案详解
- 2025届山东省青岛市高三下学期一模英语试题(含答案)
- 导数压轴大题归类知识清单(15题型提分练) 原卷版-2025年高考数学一轮复习
- 2025春统编版(2024)道德与法治一年级下册第二单元我们一起长大《第6课 请帮我一下》教学设计(名师教案)表格版
- 中学生心理健康与道德教育知到课后答案智慧树章节测试答案2025年春青海师范大学
- 气管切开非机械通气患者气道护理团体标准课件
评论
0/150
提交评论