DSP 基础学习 1:搭建环境与CCS6创建工程模板
鄙人之前学习过STM32,现在学习DSP的永磁同步电机矢量控制。同样是单片机,DSP显然比STM32“高级”很多。性能提高不少的同时,DSP使用起来也更为复杂。为了更好地学习DSP,鄙人在博客里记录学习过程。
鄙人使用的DSP是TMS320F28335PGFA,开发板是pop28335(师兄遗留的,开发板大同小异,貌似POP现在倒闭了?),仿真器是XDS100V3。电脑系统为windows8.1,CCS软件版本是6.0.1。
大部分DSP教学,不论是视频还是书籍,上来先一通理论,然后再是操作。这是因为大部分DSP使用者本身就有单片机与计算机的基础,所以会关注DSP在结构上有什么不一样的地方。如果是0基础者学习DSP也没有关系,不用听信别人诸如先学习51或STM32或AVR再学习DSP之类的言论。这些内容本质上是并列而非递进关系,就好比有人告诉您英文来源于拉丁文,先学习拉丁文再上手英文快,您不也照样英文66的,拉丁文毛都不会一样。因为大部分DSP学习者都是先学习的其他低性能单片机而后接触的DSP,只是单片机种类不同而已。所以我们本着先上手动起来的原则,先搭建环境并创建CCS6工程模板,然后在之后的例程使用中慢慢深入讲解DSP的体系。
1 DSP简介
DSP 全程是Digital Signal Processing,数字信号处理。在这里DSP指专门用来进行数字信号处理的芯片。 DSP芯片是一种快速强大的微处理器,独特之处在于它能即时处理资料。 DSP 芯片的内部采用程序和数据分开的哈佛结构,具有专门的硬件乘法器,可以用来快速的实现各种数字信号处理算法。 在当今的数字化时代背景下, DSP 己成为通信、计算机、消费类电子产品等领域的基础器件。
1.1 DSP 发展
DSP 芯片的诞生是时代所需。 20 世纪 60 年代以来,随着计算机和信息技术的飞速发展,数字信号处理技术应运而生并得到迅速的发展。在 DSP 芯片出现之前数字信号处理只能依靠微处理器来完成。但由于微处理器较低的处理速度不快,根本就无法满足越来越大的信息量的高速实时要求。因此应用更快更高效的信号处理方式成了日渐迫切的社会需求。
上世纪 70 年代, DSP 芯片的理论和算法基础已成熟。但那时的 DSP 仅仅停留在教科书上,即使是研制出来的 DSP 系统也是由分立元件组成的,其应用领域仅局限于军事、航空航天部门。
1978 年, AMI 公司发布世界上第一个单片 DSP 芯片 S2811,但没有现代 DSP芯片所必须有的硬件乘法器;
1979 年, 美国 Intel 公司发布的商用可编程器件 2920 是 DSP 芯片的一个主要里程碑,但其依然没有硬件乘法器;
1980 年,日本 NEC 公司推出的 MPD7720 是第一个具有硬件乘法器的商用 DSP芯片,从而被认为是第一块单片 DSP 器件。
1982 年世界上诞生了第一代 DSP 芯片 TMS32010 及其系列产品。这种 DSP 器件采用微米工艺 NMOS 技术制作,虽功耗和尺寸稍大,但运算速度却比微处理器快了几十倍。 DSP 芯片的问世是个里程碑,它标志着 DSP 应用系统由大型系统向小型化迈进了一大步。至 80 年代中期,随着 CMOS 工艺的 DSP 芯片应运而生,其存储容量和运算速度都得到成倍提高,成为语音处理、图像硬件处理技术的基础。
![](/qrcode.jpg)
80 年代后期,第三代 DSP 芯片问世。 运算速度进一步提高,其应用范围逐步扩大到通信、计算机领域;
90 年代 DSP 发展最快,相继出现了第四代和第五代 DSP 芯片。 第五代与第四代相比系统集成度更高,将 DSP 芯核及外围元件综合集成在单一芯片上。
进入 21 世纪后,第六代 DSP 芯片横空出世。第六代芯片在性能上全面碾压第五代芯片,同时基于商业目的的不同发展出了诸多个性化的分支,并开始逐渐拓展新的领域。
1.2 DSP 应用领域
DSP 芯片强调数字信号处理的实时性。 DSP 作为数字信号处理器将模拟信号转换成数字信号,用于专用处理器的高速实时处理。 它具有高速,灵活,可编程,低功耗的界面功能,在图形图像处理,语音处理,信号处理等通信领域起到越来越重要的作用。
应用 DSP 的领域较多, 未来新应用领域有望层出不穷。 根据美国的权威资讯公司统计,目前 DSP 芯片在市场上应用最多的是通信领域, 占 56.1%;其次是计算机领域,占 21.16%;消费电子和自动控制占 10.69%;军事/航空占 4.59%;仪器仪表占 3.5%;工业控制占 3.31%;办公自动化占 0.65%。
1)DSP 芯片在多媒体通信领域的应用。
媒体数据传输产生的信息量是巨大的,多媒体网络终端在整个过程中需要对获取的信息量进行快速分析和处理,因此 DSP 被运用在语音编码,图像压缩和减少语音通信上。如今 DSP 对于语音解码计算产生实时效果,设计协议要求已经成为最基本的一条国际标准。
2)DSP 芯片在工业控制领域的应用。
在工业控制领域, 工业机器人被广泛应用,对机器人控制系统的性能要求也越来越高。机器人控制系统重中之重就是实时性,在完成一个动作的同时会产生较多的数据和计算处理,这里可以采用高性能的 DSP。 DSP通过应用到机器人的控制系统后,充分利用自身的实时计算速度特性,使得机器人系统可以快速处理问题,随着不断提高 DSP 数字信号芯片速度,在系统中容易构成并行处理网络,大大提高控制系统的性能,使得机器人系统得到更为广泛的发展。
3)DSP 芯片在仪器仪表领域的应用。
DSP 丰富的片内资源可以大大简化仪器仪表的硬件电仪路,实现仪器仪表的 SOC 设计。仪器仪表的测量精度和速度是一项重要的指标,使用 DSP 芯片开发产品可使这两项指标大大提高。例如 TI 公司的 TMS320F2810 具有高效的 32 位 CPU 内核,12 位 A/D 转换器,丰富的片上存储器和灵活的指挥系统,为高精密仪器搭建了广阔的平台。高精密仪器现在已经发展成为 DSP 的一个重要应用,正处于快速传播时期,将推动产业的技术创新。
4)DSP 芯片在汽车安全与无人驾驶领域的应用。
汽车电子系统日益兴旺发达起来,诸如装设红外线和毫米波雷达,将需用 DSP 进行分析。如今,汽车愈来愈多,防冲撞系统已成为研究热点。而且,利用摄像机拍摄的图像数据需要经过 DSP 处理,才能在驾驶系统里显示出来,供驾驶人员参考。
5)DSP 芯片在军事领域的应用。
DSP 的功耗低、体积小、实时性反应速度都是武器装备中特别需要的。如机载空空导弹,在有限的体积内装有红外探测仪和相应的 DSP信号处理器等部分,完成目标的自动锁定与跟踪。先进战斗机上装备的目视瞄准器和步兵个人携带的头盔式微光仪,需用 DSP 技术完成图像的滤波与增强,智能化目标搜索捕获。 DSP 技术还用于自动火炮控制、巡航导弹、预警飞机、相控阵天线等雷达数字信号处理中。
1.3 DSP 产品现状
目前, 世界上 DSP 芯片制造商主要有 3 家:德州仪器(TI)、 模拟器件公司(ADI)和摩托罗拉(Motorola) 公司,其中 TI 公司独占鳌头, 占据绝大部分的国际市场份额, ADI 和摩托罗拉公司也有一定市场。
德州仪器公司(TI) 是 DSP 业界公认的龙头老大, 公司在 1982 年成功推出了其第一代 DSP 芯片 TMS32010,由于 TMS320 系列 DSP 芯片具有价格低廉、简单易用、功能强大等特点,所以逐渐成为目前最有影响、最为成功的 DSP 系列处理器。
在 TI公司主打的三个系列中, c2000 系列现在所占市场份额较小,如今 TI 官网上的 DSP产品主要以 c6000 与 c5000 为主。 TI 的三大主力 DSP 产品系列为 C2000 系列主要用于数字控制系统; C5000(C54x、 C55x)系列主要用于低功耗、便携的无线通信终端产品; C6000 系列主要用于高性能复杂的通信系统。 C5000 系列中的TMS320C54x 系列 DSP 芯片被广泛应用于通信和个人消费电子领域。
C6000 系列主打产品为: C6000 DSP+ARM 处理器(12)——OMAP-L1x (5)、66AK2x (7); C6000 DSP (94)——C674xDSP (5)、 C66x DSP (11)
C5000 系列主打产品为: C55x 超低功耗 DSP,为超低功耗的紧凑型嵌入式产品提供高效的信号处理。
1.4 哈佛结构
先来说说冯·诺伊曼结构,相信不少人从小上计算机课都背过以下内容:
![](https://img-blog.csdnimg.cn/2018121016000869.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2h1YWdlbmdwYWkxOTk0,size_16,color_FFFFFF,t_70)
计算机必须有一个存储器,必须有一个控制器,必须有一个运算器,必须有输入和输出设备,用于进行人机通信。如上图所示,冯·诺伊曼结构将程序指令存储器和数据存储器合并在一起,也就是说Memory里面不仅存储了指令还存储了数据。
而哈佛结构是一种将程序指令储存和数据储存分开的存储器结构,如下图所示。 中央处理器首先到程序指令储存器中读取程序指令内容,解码后得到数据地址,再到相应的数据储存器中读取数据,并进行下一步的操作(通常是执行)。显而易见,这样做的好处有:指令和数据可以并行处理,执行时可以预先读取下一条指令;可以使指令和数据有不同的数据宽度,如Microchip公司的PIC16芯片的程序指令是14位宽度,而数据是8位宽度。
![](https://img-blog.csdnimg.cn/20181210155920243.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2h1YWdlbmdwYWkxOTk0,size_16,color_FFFFFF,t_70)
总之,哈佛结构的微处理器通常具有较高的执行效率。 那既然哈佛结构比冯·诺伊曼结构要快,为什么不都使用哈佛结构呢。
这是因为,相对于冯·诺依曼结构,哈佛结构更可靠,更加适合于那些程序固化、任务相对简单的控制系统,哈佛结构的微处理器也相对更高效。不过在通用计算机系统中,应用软件的多样性使得计算机要不断地变化所执行的代码的内容,并且频繁地对数据与代码占有的存储器进行重新分配,这种情况下,冯·诺依曼结构占有绝对优势,因为统一编址可以最大限度地利用资源,而哈佛结构的计算机若应用于这种情形下则会对存储器资源产生理论上最大可达50%(指令存储器或者数据存储器有一个没用上)的浪费,这显然是不合理的。现在的处理器,不单是只有一种结构,而是运用了先进技术混合了多种结构,兼顾多方面需求。比如现在的高性能处理器虽然外部总线上看是诺依曼结构的,但是由于内部CACHE的存在,因此实际上内部来看已经算是改进型哈佛结构的了。
1.5 TMS320F28335 简介
TMS320F28335型数字信号处理器TI公司的一款TMS320C28X系列浮点DSP控制器。TMS320F28335具有150MHz的高速处理能力,具备32位浮 点处理单元,6个DMA通道支持ADC、McBSP和 EMIF,有多达18路的PWM输出,其中有6路为TI特有的更高精度的PWM输出(HRPWM),12位16通道ADC。得益于其浮点运算单元,用户可快速编写控制算法而无需在处理小数操作上耗费过多的时间和精力,与前代DSP相比,平均性能提高50%,并与定点C28x控制器软件兼容,从而简化软件开发, 缩短开发周期,降低开发成本。
2 搭建环境
废话这么多,DSP到底怎么写程序啊。别急,要想写程序,得先在电脑上配置好环境。
首先是IDE的选择,因为用的是TI的DSP当然选TI公司的CCS,全称是Code Composer Studio,建议使用CCS6。网上很容易就可以找到CCS6安装与破解资料的。如果是第一次用仿真器,可能需要仿真器的驱动。这个大部分电脑会自动识别出USB设备并安装的,实在不行插着仿真器用驱动精灵之类的软件安装一下就好了。还需要DSP的源文件和头文件,如果是复杂的数学运算,那么还需要数学运算库。这些东西在TI的官网都有,建议直接装一个controlSUITE,下载controlSUITE的时候需要注册用户。TI官网的下载链接如下:
http://www.ti.com.cn/tool/cn/CONTROLSUITE。
它是一个集成了DSP文件库、手册、例程的辅助软件。这些库有啥用呢,比如您要用三角函数,DSP里面可不能直接运算三角函数啊,当时学C的时候都要include<math.h>呢。如果您觉得麻烦,想快速上手,只想要最基本的文件,那么可以下载鄙人提供的资料。等需要用到TI的轮子的时候再去下载对应的文件。链接在下面,只要1个币,良心吧。
https://download.csdn.net/download/huagengpai1994/10841285
安装CCS6的过程就不说了,网上一大堆,重点说说怎么创建工程模板。
3 CCS6创建工程模板
装好CCS6打开它,会显示下面这个界面,貌似安装的时候就会设置,鄙人忘了。
![](https://img-blog.csdnimg.cn/20181210164941689.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2h1YWdlbmdwYWkxOTk0,size_16,color_FFFFFF,t_70)
workspace,自然是工作空间的意思啦。就是在问你,默认的工作空间在哪里,也就是默认去哪里找DSP工程,有点类似于MATLAB的路径。如果该默认目录下有DSP工程,那么打开就会显示出来,否则你就要自己去找到并打开。尽量在目录里面不要出现中文和奇奇怪怪的字符,貌似中文也可以,但毕竟是美帝国主义的玩意,编译错误就是找不到问题有可能就是这里出的。
设置好后点击OK,就进入了CCS6,先新建一个Project。点击project->New CCS Project 。会出现如下图所示的对话框。
![](https://img-blog.csdnimg.cn/20181210170948865.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2h1YWdlbmdwYWkxOTk0,size_16,color_FFFFFF,t_70)
Target 是选芯片,第一个空是芯片类型,选择2833x Delfino。第二个空是芯片型号,选择TMS302F28335。
Connection是仿真器,依据您仿真器的型号选择就好,我的是XDS100V3。
Project name,是您工程的名字。我这里可以写为Hello DSP。
Use default location 勾选后,就会默认该工程在在Workspace里。
然后在下面选择Empty Project(with main.c),点击Finish创建一个带main.c的空工程,如下图所示。
![](https://img-blog.csdnimg.cn/20181210171154437.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2h1YWdlbmdwYWkxOTk0,size_16,color_FFFFFF,t_70)
在Workspace目录下会自动新建一个名叫Hello DSP的文件夹,里面的文件如下。
![](https://img-blog.csdnimg.cn/20181210171424156.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2h1YWdlbmdwYWkxOTk0,size_16,color_FFFFFF,t_70)
把DSP2833x_headers和DSP2833x_common两个文件夹复制粘贴到Hello DSP文件夹下,如下图所示。(这就是2中说到的TI官方文件,controlSUITE的是在一个特定目录里面。没装controlSUITE的话,在您买的开发板的资料里面仔细找找,一般也都会有这两个文件夹。实在不行也可以用鄙人的,下载链接在2中,链接中还有TI官方的例程和文件。)
![](https://img-blog.csdnimg.cn/20181210171920472.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2h1YWdlbmdwYWkxOTk0,size_16,color_FFFFFF,t_70)
可以发现在CCS里面,自动显示了新来的两个文件夹,如下图所示。
![](https://img-blog.csdnimg.cn/20181210172136565.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2h1YWdlbmdwYWkxOTk0,size_16,color_FFFFFF,t_70)
如果这个时候Build Projec会出现很多Problems。这是因为我们只是把相关文件挪到了工程文件Hello DSP里面,并没有告诉CCS在编译的时候去哪里找相关的文件。下面进行设置,在CCS界面左边右键点击Hello DSP,选择Properties,点击Bulid——Include Options,如下图所示。
![](https://img-blog.csdnimg.cn/20181210172811244.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2h1YWdlbmdwYWkxOTk0,size_16,color_FFFFFF,t_70)
点击Add dir to #include search 那个框里面的绿色加号,出现一个小对话框,再点击workspace。然后选择DSP2833x_headers和DSP2833x_common中的Include,如图所示。
![](https://img-blog.csdnimg.cn/20181210173123945.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2h1YWdlbmdwYWkxOTk0,size_16,color_FFFFFF,t_70)
点击OK后,会变成下图所示样子。说明路径添加成功了,今后如果要用到TI官方的别人写好的文件,也要如此包含进来才能被编译器找到。
![](https://img-blog.csdnimg.cn/20181210173256629.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2h1YWdlbmdwYWkxOTk0,size_16,color_FFFFFF,t_70)
试Bulid一下,点击CCS界面上面的小铁锤(Bulid Project),或者也可以右键Hello DSP点击Build Project。会发现没有办法Build 成功,有很多的错误。
![](https://img-blog.csdnimg.cn/20181210173924904.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2h1YWdlbmdwYWkxOTk0,size_16,color_FFFFFF,t_70)
删除common下cmd里的所有文件 (在CCS界面中选中后右键,Delete)。删除common-source下的:DSP2833x_SWPrioritizedDefaultIsr.c、DSP2833x_SWPrioritizedPieVect.c、DSP2833x_Mcbsp1.c和DSP2833x_Sci1.c四个文件。删除headers-cmd下的:DSP2833x_Headers_BIOS.cmd文件,因为我们用的是无操作系统的所以该cmd下的文件只留nonBIOS。
再Build 一下,如果界面上的小锤子点不了了,那么可以右键Hello DSP点击Build Project。这次就是0个Problems了,建立成功。
下面再说说配置仿真器。右键Hello DSP——New——Target Configuration File,弹出如下图所示的对话框。
![](https://img-blog.csdnimg.cn/20181210185134578.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2h1YWdlbmdwYWkxOTk0,size_16,color_FFFFFF,t_70)
把File name 改为Hello DSP.ccxml。点击Finish后,CCS界面左侧会自动创建相应的仿真器文件。并且会自动进入该仿真器界面。
![](https://img-blog.csdnimg.cn/20181210185850497.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2h1YWdlbmdwYWkxOTk0,size_16,color_FFFFFF,t_70)
Connection 中选择自己的仿真器型号,我这里是XDS100V3,选好后在Board and Device里面就会出现该仿真器适用的设备,找到TMS320F28335,也可以在文本框中输入就可以搜索到,这样比较快一点。点击右边的save后,Test Connection会从不可点变为可点。这时候将板子通电,仿真器连接电脑。按一下Test Connection 就可以测试仿真器,这时候会自动弹出下图所示的Test Connection文本框,拉到最下面,如果出现红框中的内容说明仿真器没有问题。
![](https://img-blog.csdnimg.cn/20181210190409410.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2h1YWdlbmdwYWkxOTk0,size_16,color_FFFFFF,t_70)
4 结语
至此,整个最基本的工程模板创建好了。之所以叫模板,因为可以把这个Hello DSP文件夹保存下来,以后再编写DSP程序的时候,复制它一份。然后在Hello DSP的复制版上改动,就不用从头再创建工程了。
如果按照本例程的步骤还是有Problems,那么就要去看看Problems里面是哪个地方出了问题,然后百度一下一般都能解决。不要看到Problems有几十个就头疼,因为一个小问题就会引发很多Probles,但也许仅仅改动一下就同时解决了。可以在Prlblems里面看到问题都是一群一群指向某几个地方。在刚复制粘贴common和headers的时候,如果不删除任何文件立马就编译会出现上百个Problems,而我们仅仅删除了不到10个文件就好了。
如果不管怎么搞都搞不通,也有可能是你拿到手的common和headers本身就少东西。可以下载鄙人2中给的链接,里面有common和headers,还有鄙人的Hello DSP模板。