第一个DSP程序 Hello DSP !(一步一步建立CCS6.0 工程)
2017年快要过去了,总感觉并不十分充实。在这个年末,我也开始进入学习DSP的阶段了,我将在接下来的一年时间里,在博客园记录自己学习DSP的经历。所用到的DSP型号为TMS320F28335,当然,有时也会跟TMS320F2812进行对比。
一、第一个DSP程序 Hello DSP
就像第一个C语言程序输出 “Hello World !”一样,采用DSP输出“Hello DSP !”也是那么的富有开始意义。开始吧,不管有什么困难,都会一个个的得到解决。
本次实验平台:PC: Windows7 64bit
软件: CCS6.0
DSP型号:TMS320F2812
二、一步一步建立程序
2.1 打开CCS6.0后,Project->New CCS Project 按照下图设置好。Connection项根据自己的仿真器型号选择,我的是XDS100v2。设置好后,点击finish。
2.2 编写main.c函数
点击finish后得到下图。
于是这里需要添加各种头文件。在程序所在的文件夹内建立两个文件header和source。将各个头文件和源文件加入到其中。
并且添加头文件的路径:
2.3 编写mian.c程序
1 #include "DSP28_Device.h" 2 #include <stdio.h> 3 void main(void) 4 { 5 6 /*初始化系统*/ 7 InitSysCtrl(); 8 9 /*关中断*/ 10 DINT; 11 IER = 0x0000; 12 IFR = 0x0000; 13 14 /*初始化PIE*/ 15 InitPieCtrl(); 16 17 /*初始化PIE中断矢量表*/ 18 InitPieVectTable(); 19 20 printf("Hello DSP !") 21 for(;;); 22 23 }
2.4 编译程序
编译以后发现有很多的警告,还有错误。别急我们一个一个来解决。
通过阅读,发现,这里的问题都是CMD文件中存储空间的分配导致的问题。
其中一个解决办法是调节2812_RAM_Ink.cmd文件中的memory和section。但是我调节了一下,可能是自己对CMD文件认识还不够,发现错误并没有消除,于是只能请教度娘了。最后功夫不负有心人,终于找到了解决方法。谢谢这位大大。
https://www.cnblogs.com/bg8ly/archive/2015/11/20/4981065.html 在Project-Properties-Build-Advanced Options-Library Function Assumptions下,Level of printf/scanf support required(--printf_support)选择minimal。这是由于标准的printf()/sprintf()提供了非常多的特性支持,造成了在DSP上实现时,产生的代码尺寸非常大,使得原来2812上的存储空间不够,所以有报错和警告。
这时再进行编译,错误时没有了,但是还有警告
这里警告的意思是外设没有分配SECTION,这里需要在CMD文件中给这些外设的分配SECTION就可以了。这里我按照《手把手教你学DSP-基于TMS320X281X》中P148页中进行修改。
1 MEMORY 2 { 3 PAGE 0 : 4 PRAMH0 : origin = 0x3f8000, length = 0x001000 5 6 PAGE 1 : 7 /* SARAM */ 8 RAMM0 : origin = 0x000000, length = 0x000400 9 RAMM1 : origin = 0x000400, length = 0x000400 10 11 /* Peripheral Frame 0: */ 12 DEV_EMU : origin = 0x000880, length = 0x000180 13 FLASH_REGS : origin = 0x000A80, length = 0x000060 14 CSM : origin = 0x000AE0, length = 0x000010 15 XINTF : origin = 0x000B20, length = 0x000020 16 CPU_TIMER0 : origin = 0x000C00, length = 0x000008 17 CPU_TIMER1 : origin = 0x000C08, length = 0x000008 18 CPU_TIMER2 : origin = 0x000C10, length = 0x000008 19 PIE_CTRL : origin = 0x000CE0, length = 0x000020 20 PIE_VECT : origin = 0x000D00, length = 0x000100 21 22 /* Peripheral Frame 1: */ 23 ECAN_A : origin = 0x006000, length = 0x000100 24 ECAN_AMBOX : origin = 0x006100, length = 0x000100 25 26 /* Peripheral Frame 2: */ 27 SYSTEM : origin = 0x007010, length = 0x000020 28 SPI_A : origin = 0x007040, length = 0x000010 29 SCI_A : origin = 0x007050, length = 0x000010 30 XINTRUPT : origin = 0x007070, length = 0x000010 31 GPIOMUX : origin = 0x0070C0, length = 0x000020 32 GPIODAT : origin = 0x0070E0, length = 0x000020 33 ADC : origin = 0x007100, length = 0x000020 34 EV_A : origin = 0x007400, length = 0x000040 35 EV_B : origin = 0x007500, length = 0x000040 36 SPI_B : origin = 0x007740, length = 0x000010 37 SCI_B : origin = 0x007750, length = 0x000010 38 MCBSP_A : origin = 0x007800, length = 0x000040 39 40 /* CSM Password Locations */ 41 CSM_PWL : origin = 0x3F7FF8, length = 0x000008 42 43 /* SARAM */ 44 DRAMH0 : origin = 0x3f9000, length = 0x001000 45 } 46 47 48 SECTIONS 49 { 50 /* Allocate program areas: */ 51 .reset : > PRAMH0, PAGE = 0 52 .text : > PRAMH0, PAGE = 0 53 .cinit : > PRAMH0, PAGE = 0 54 55 /* Allocate data areas: */ 56 .stack : > RAMM1, PAGE = 1 57 .bss : > DRAMH0, PAGE = 1 58 .ebss : > DRAMH0, PAGE = 1 59 .const : > DRAMH0, PAGE = 1 60 .econst : > DRAMH0, PAGE = 1 61 .sysmem : > DRAMH0, PAGE = 1 62 .cio : > DRAMH0, PAGE = 1 63 64 /* Allocate Peripheral Frame 0 Register Structures: */ 65 DevEmuRegsFile : > DEV_EMU, PAGE = 1 66 FlashRegsFile : > FLASH_REGS, PAGE = 1 67 CsmRegsFile : > CSM, PAGE = 1 68 XintfRegsFile : > XINTF, PAGE = 1 69 CpuTimer0RegsFile : > CPU_TIMER0, PAGE = 1 70 CpuTimer1RegsFile : > CPU_TIMER1, PAGE = 1 71 CpuTimer2RegsFile : > CPU_TIMER2, PAGE = 1 72 PieCtrlRegsFile : > PIE_CTRL, PAGE = 1 73 PieVectTable : > PIE_VECT, PAGE = 1 74 75 /* Allocate Peripheral Frame 2 Register Structures: */ 76 ECanaRegsFile : > ECAN_A, PAGE = 1 77 ECanaMboxesFile : > ECAN_AMBOX PAGE = 1 78 79 /* Allocate Peripheral Frame 1 Register Structures: */ 80 SysCtrlRegsFile : > SYSTEM, PAGE = 1 81 SpiaRegsFile : > SPI_A, PAGE = 1 82 SciaRegsFile : > SCI_A, PAGE = 1 83 XIntruptRegsFile : > XINTRUPT, PAGE = 1 84 GpioMuxRegsFile : > GPIOMUX, PAGE = 1 85 GpioDataRegsFile : > GPIODAT PAGE = 1 86 AdcRegsFile : > ADC, PAGE = 1 87 EvaRegsFile : > EV_A, PAGE = 1 88 EvbRegsFile : > EV_B, PAGE = 1 89 ScibRegsFile : > SCI_B, PAGE = 1 90 McbspaRegsFile : > MCBSP_A, PAGE = 1 91 92 /* CSM Password Locations */ 93 CsmPwlFile : > CSM_PWL, PAGE = 1 94 95 }
此时,再编译后,没有错误和警告。
三、硬件试验
这里将硬件连接好,进行调试。结果如下
四、总结
这次试验总体来说还是比较顺利的,其中遇到了一下问题,也一一都解决了。其中CMD文件非常重要,需要深入的理解。
今后应该一星期会有一篇记录出来。希望自己能够不断进步。
2017-12-27