CCS 6新建TMS320F2812工程


准備材料

  1. CCS6

    下載地址:http://www.ti.com/tool/ccstudio

  2. F2812的C語言頭文件

    下載地址:http://www.ti.com/lit/zip/sprc097

    安裝后的文件結構樣式如下:

新建空的工程

  1. 點擊"Project"->"New CCS Project"。

  1. 在New CCS Project窗口中,按需要填寫以下內容后按"Finish"完成新建空的工程。

新建完成后的工程,結構如下:

  1. 點擊左上方的編譯按鈕,應該能夠順利的編譯通過,但是會出現一個警告。

工程配置

添加系統的頭文件

  1. 在工程名上右擊,添加兩個文件夾,分別名為source和include。

  1. 打開"tidcs\c28\DSP281x\v120"文件夾,將"DSP281x_headers\include"中的所有頭文件復制到剛剛新建的include目錄。
  2. 打開"tidcs\c28\DSP281x\v120"文件夾,將"DSP281x_common\include"中的所有頭文件復制到剛剛新建的include目錄(會提示文件已存在,覆蓋即可)。

    此時,工程文件夾的結構如圖所示:

配置工程

右擊工程文件名,選擇"Properties"

  • 更改include的選項:

    在新彈出的窗口中選擇"Workspace":

    然后選擇對應工程的"include"目錄:

  • 更改鏈接選項中的"Base option":

    將Stack中填充合適的數值,默認為空(也就是上文中編譯的時候出現的警告):

    完成以上的設置后,編譯應該沒有任何的錯誤和警告:

  • 額外的設置——添加C99支持:

可板上執行的工程配置

根據上文的配置過程,雖然代碼能夠正常的通過編譯,但是卻沒有任何的實際功能。這里,以點亮運行燈(即主循環執行過程中,固定間隔點亮的燈)為例,介紹可用的代碼的配置過程。

添加必須的頭文件代碼

在main函數中,添加以下的頭文件:

#include "DSP281x_Device.h"

#include "DSP281x_Examples.h"

其中,DSP281x_Device.h提供了對應的CPU寄存器的結構體信息,DSP281x_Examples.h主要提供了一個納秒級的延時函數DELAY_US(A)。不過,為了使用此函數,還需要將一個匯編代碼文件添加到工程中:

在項目文件名稱上右擊,選擇"Add Files",打開的窗口中選擇"DSP281x_common\source"文件夾中的"DSP281x_usDelay.asm"。然后手動將asm文件拖動到source目錄下。

此時,項目文件夾的組織結構如圖。

添加必要的源文件

    一個能夠正常在開發板上運行的工程,應該具備一下的必要的源文件。

  • 添加"DSP281x_headers\source"目錄下的"DSP281x_GlobalVariableDefs.c"以指定所有系統結構體的存儲位置。
  • 添加"DSP281x_common\source"目錄下的"DSP281x_SysCtrl.c"以初始化系統的控制選項,包括PLL,看門狗,預分頻。
  • 添加"DSP281x_common\source"目錄下的"DSP281x_Gpio.c"以初始化系統的GPIO口。
  • 添加"DSP281x_common\source"目錄下的"DSP281x_PieCtrl.c以初始化PIE控制器。
  • 添加"DSP281x_common\source"目錄下的 "DSP281x_PieVect.c"以初始化PIE向量表。
  • 添加"DSP281x_common\source"目錄下的"DSP281x_InitPeripherals.c"以初始化其他外設。
  • 添加"DSP281x_common\source"目錄下的"DSP281x_DefaultIsr.c"以使用默認的中斷函數。

添加cmd文件

    本程序非TI的BIOS系統應用,所以需要添加"DSP281x_headers\cmd"目錄下的"DSP281x_Headers_nonBIOS.cmd"。

 

到此,可以嘗試編譯工程,應該能夠正常的編譯通過,且沒有任何的警告。目錄結構應該如下所示(分別是頭文件,源文件和鏈接文件):

第一個可執行程序——點亮LED燈

  1. 編輯main函數,將main函數修改成如下的內容:

#include "DSP281x_Device.h"        // 添加必要的頭文件

#include "DSP281x_Examples.h"    // 添加必要的頭文件

 

int main(void) {

        // 1. 初始化系統控制,PLL,看門狗,預分頻

        InitSysCtrl();

        // 2. 初始化GPIO

        InitGpio();

        // 3. 關閉中斷,然后初始化PIE向量表

        DINT;            // INTM 置一,關中斷

        InitPieCtrl();    // 初始化 PIE 控制寄存器到默認狀態

//(所有PIE中斷禁用,標志清空)

                            // DSP281x_PieCtrl.c 中定義

        IER = 0x0000;    // 禁用 CPU 中斷

        IFR = 0x0000;    // 清空 CPU 中斷標志

        InitPieVectTable();    // 初始化 PIE 向量表

                                // DSP281x_PieVect.c 中定義

 

        // 4. 初始化所有的外設

        // InitPeripherals();    // DSP281x_InitPeripherals.c 中定義

                                    // 需要啟用哪些硬件,在此函數中設置

 

        // 5. 用戶指定的代碼后啟用中斷

        // 用戶指定的其他函數

        EINT;

        ERTM;

        for(;;)

        {

        

        }

}

main函數雖然是int類型的,但是這里不需要結尾的"return 0;",否則在編譯時會提示一個警告。

  1. 編輯"DSP281x_Gpio.c",修改InitGpio()函數:

void InitGpio(void)

{

        // GpioMuxRegs 受到保護,需要EALLOW后才能配置

        EALLOW;

        // 設置為GPIO

        GpioMuxRegs.GPAMUX.bit.T1PWM_GPIOA6 = 0;

        // 配置為輸出引腳

        GpioMuxRegs.GPADIR.bit.GPIOA6 = 1;

        EDIS;

}

  1. 在main函數中定義一個變量(Uint32)main_counter,然后修改for循環,添加如下語句:

    for(;;)

    {

        main_counter++;

        if(main_counter > 5000000)

        {

            main_counter = 0;

            GpioDataRegs.GPATOGGLE.bit.GPIOA6 = 1;

        }

    }

    

    到此,編譯后點擊Debug,可以觀察到開發板上對應於102引腳上的LED燈能夠規律性的閃爍。

將程序固化到Flash中

將程序固化到flash中非常的"簡單"。

  1. 添加"DSP281x_common\cmd"目錄下的"F2812.cmd"。
  2. 添加"DSP281x_common\source"目錄下的"DSP281x_CodeStartBranch.asm"。
  3. 禁用"2812_RAM_lnk.cmd"。

    重新編譯工程后點擊Debug,程序就會自動下載到Flash中,下載完成后,將開發板重新上電,就能夠看到對應的LED燈離線運行。

    但是,你也許會奇怪,為什么燈運行的明顯比仿真的時候要慢。那是因為,Flash實在是太慢了。為了能夠讓程序跑的快些,那只有讓系統上電時,讓程序跑在RAM中。

讓程序跑在RAM中

Ti官方提供了2種讓程序固化在Flash中而能夠運行於RAM中的方法。

  1. 將需要高效執行的函數加載到RAM中運行;

    spra958l - Running an Application from Internal Flash Memory on the TMS320F28xxx DSP

  2. 將整個代碼本身加載到RAM中運行。

    spraau8 - Copying Compiler Sections From Flash to RAM on the TMS320F28xxx DSCs

    第一種方案,需要設置cmd文件的同時,還需要兼顧代碼本身,稍顯麻煩。

方法一:部分代碼加載到RAM

    再議……

方法二:所有代碼加載到RAM

  1. 下載spraau8代碼示例:

    http://www-s.ti.com/sc/techlit/spraau8.zip

  2. 將上面工程中的"DSP281x_CodeStartBranch.asm"替換為代碼示例中的"DSP281x_CodeStartBranch"。
  3. 將代碼示例中的"DSP28xxx_SectionCopy_nonBIOS.asm"添加到source中。
  4. 使用代碼示例中的cmd文件替換示例代碼中的cmd文件。

不過,示例代碼中的cmd文件對內存結構相比於ti提供的默認頭文件,有較大的更改,假如不想使用示例代碼中的cmd,那就看看都做了哪些更改吧。

spraau8的cmd文件中的主要變化

    對比spraau8提供的cmd文件,可以看到,最大的變化是,諸如下圖所示的初始化方法:

    其中標注1的地方,表示將".text"存儲在"FLASH_AB"區;標注2的地方,表示此存儲區的代碼將會在"RAM_L0L1"中運行;標注3的地方,表示此部分代碼的起始位置為"_text_loadstart";標注4的地方,表示此部分代碼的結束位置為"_text_runstart";最后一行也即第5行,表示此部分代碼的長度為"_text_size"。那么,值得好奇的是,這些最前面是下划線的字段都是哪里來的呢。其實,它們都在文件"DSP28xxx_SectionCopy_BIOS.asm"中定義了。

    其次,就是初始化的段中多了一個".cinit"。這個東西又是哪里來的呢。它的定義,在"DSP28xxx_SectionCopy_nonBIOS.asm"中,具體的含義,可以看spraau8的pdf文檔。

    最后,示例代碼中,將需要移動的段都放在了FLASHAB中,而啟動后復制到的位置,都在"RAM_H0"和"RAML0L1"中。

到這里我們差不多就可以自己修改cmd文件了。

  1. 將上面工程中的"DSP281x_CodeStartBranch.asm"替換為代碼示例中的"DSP281x_CodeStartBranch"。
  2. 將代碼示例中的"DSP28xxx_SectionCopy_nonBIOS.asm"添加到source中。
  3. 修改"DSP281x_Headers_nonBIOS.cmd"

     

  4. 修改"F2812.cmd"
    1. 將RAML1從PAGE1中移動到PAGE0,且和RAML0合並

      RAML0L1 : origin = 0x008000, length = 0x002000 /* on-chip RAM block L0 L1 */

    2. 將RAMH0從PAGE1中移動到PAGE0。
    3. 原始的FLASH是嚴格A、B……分段的,這里可以直接復制cmd文件中的內容,將其合並為AB、CD……。
    4. SECTIONS部分,直接復制示例代碼中的".cinit"、".const"、".econst"、".pinit"、".switch    "和".text"。
    5. 為了防止在代碼中,可能存在將某些函數放在"ramfuncs"部分,這一部分予以保留(示例代碼中,沒有這一部分)。但是要稍作修改:

    6. IQmath部分,也要將其存儲段修改,比如改成FLASH_CD

 

作者:東風唯笑

聯系方式:dongfengweixiao@hotmail.com

關於版權:


CCS 6新建TMS320F2812工程 由 東風唯笑 創作,采用 知識共享 署名-非商業性使用 4.0 國際 許可協議進行許可。
基於http://www.cnblogs.com/dongfengweixiao/上的作品創作。
本許可協議授權之外的使用權限可以從 http://www.cnblogs.com/dongfengweixiao/ 處獲得。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM