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