1. 程式人生 > >TMS320F28335程式燒寫FLASH

TMS320F28335程式燒寫FLASH

DSP TMS320F28335 FLASH燒寫

1.檢查map檔案

在燒寫之前,首先檢查Debug目錄下的.map檔案,如果Debug檔案下沒有,檢查其他的資料夾,每個專案中都會有.map檔案。

開啟.map檔案,顯示內容如下所示(部分內容,並非map檔案所有內容):

...

MEMORY CONFIGURATION

         name            origin    length      used     unused   attr    fill
----------------------  --------  ---------  --------  --------  ----  --------
PAGE 0
: RAML0 00008000 00001000 00000000 00001000 RWIX RAML1 00009000 00001000 00000000 00001000 RWIX RAML2 0000a000 00001000 00000000 00001000 RWIX RAML3 0000b000 00001000 00000000 00001000 RWIX FLASHH 00300000 00008000 00000000 00008000 RWIX FLASHG 00308000 00008000 00000000 00008000 RWIX FLASHF 00310000 00008000 00000000 00008000 RWIX FLASHE 00318000
00008000 00000000 00008000 RWIX FLASHD 00320000 00008000 00000000 00008000 RWIX FLASHC 00328000 00008000 00000000 00008000 RWIX FLASHB 00330000 00008000 00000102 00007efe RWIX FLASHA 00338000 00007f80 00000000 00007f80 RWIX CSM_RSVD 0033ff80 00000076 00000000 00000076 RWIX BEGIN 0033fff6 00000002 00000000 00000002 RWIX CSM_PWL 0033f
ff8 00000008 00000000 00000008 RWIX ADC_CAL 00380080 00000009 00000000 00000009 RWIX OTP 00380400 00000400 00000000 00000400 RWIX IQTABLES 003fe000 00000b50 00000000 00000b50 RWIX IQTABLES2 003feb50 0000008c 00000000 0000008c RWIX FPUTABLES 003febdc 000006a0 00000000 000006a0 RWIX ROM 003ff27c 00000d44 00000000 00000d44 RWIX RESET 003fffc0 00000002 00000000 00000002 RWIX VECTORS 003fffc2 0000003e 00000000 0000003e RWIX ....

檢查CSM_PWL項:

         name            origin    length      used     unused   attr    fill
----------------------  --------  ---------  --------  --------  ----  --------
...
  CSM_PWL               0033fff8   00000008  00000000  00000008  RWIX
...

如果used和unused對應的值分別為00和08,如上,則標識密碼區域尚未使用,否則密碼區域可能已經被使用,不可以進行燒寫,若強行燒寫將導致DSP鎖死,此時可以自己重新新建工程進行編譯。

檢查密碼區域無誤之後可以進行下一步操作。

2.編寫CMD檔案

專案建立之後,會自動生成一個28335_RAM_lnk.cmd檔案,該檔案是我們進行模擬除錯的時候,將程式放入RAM中執行的CMD檔案,如果需要燒寫到Flash中,則需要修改對應的地址,因此,可以更改cmd中對應的地址位置或者我們重新建立一個燒寫Flash對應的cmd檔案。

我們可以從其他專案例程中拷貝一個往Flash中燒寫的cmd檔案,同一晶片往flash中燒寫的cmd檔案都相同,因此直接拷貝一個過來(一般名稱為F28335.cmd),名稱可以自己進行修改,或者自己建立一個xxx.cmd檔案,將如下內容拷貝進去:

注意:以下內容只試用於TMS320F28335!



MEMORY
{
PAGE 0:    /* Program Memory */
           /* Memory (RAM/FLASH/OTP) blocks can be moved to PAGE1 for data allocation */

   RAML0       : origin = 0x008000, length = 0x001000     /* on-chip RAM block L0 */
   RAML1       : origin = 0x009000, length = 0x001000     /* on-chip RAM block L1 */
   RAML2       : origin = 0x00A000, length = 0x001000     /* on-chip RAM block L2 */
   RAML3       : origin = 0x00B000, length = 0x001000     /* on-chip RAM block L3 */
   FLASHH      : origin = 0x300000, length = 0x008000     /* on-chip FLASH */
   FLASHG      : origin = 0x308000, length = 0x008000     /* on-chip FLASH */
   FLASHF      : origin = 0x310000, length = 0x008000     /* on-chip FLASH */
   FLASHE      : origin = 0x318000, length = 0x008000     /* on-chip FLASH */
   FLASHD      : origin = 0x320000, length = 0x008000     /* on-chip FLASH */
   FLASHC      : origin = 0x328000, length = 0x008000     /* on-chip FLASH */
   FLASHB      : origin = 0x330000, length = 0x008000     /* on-chip FLASH */
   FLASHA      : origin = 0x338000, length = 0x007F80     /* on-chip FLASH */
   CSM_RSVD    : origin = 0x33FF80, length = 0x000076     /* Part of FLASHA.  Program with all 0x0000 when CSM is in use. */
   BEGIN       : origin = 0x33FFF6, length = 0x000002     /* Part of FLASHA.  Used for "boot to Flash" bootloader mode. */
   CSM_PWL     : origin = 0x33FFF8, length = 0x000008     /* Part of FLASHA.  CSM password locations in FLASHA */
   OTP         : origin = 0x380400, length = 0x000400     /* on-chip OTP */
   ADC_CAL     : origin = 0x380080, length = 0x000009     /* ADC_cal function in Reserved memory */

   IQTABLES    : origin = 0x3FE000, length = 0x000b50     /* IQ Math Tables in Boot ROM */
   IQTABLES2   : origin = 0x3FEB50, length = 0x00008c     /* IQ Math Tables in Boot ROM */  
   FPUTABLES   : origin = 0x3FEBDC, length = 0x0006A0     /* FPU Tables in Boot ROM */
   ROM         : origin = 0x3FF27C, length = 0x000D44     /* Boot ROM */        
   RESET       : origin = 0x3FFFC0, length = 0x000002     /* part of boot ROM  */
   VECTORS     : origin = 0x3FFFC2, length = 0x00003E     /* part of boot ROM  */

PAGE 1 :   /* Data Memory */
           /* Memory (RAM/FLASH/OTP) blocks can be moved to PAGE0 for program allocation */
           /* Registers remain on PAGE1                                                  */

   BOOT_RSVD   : origin = 0x000000, length = 0x000050     /* Part of M0, BOOT rom will use this for stack */
   RAMM0       : origin = 0x000050, length = 0x0003B0     /* on-chip RAM block M0 */
   RAMM1       : origin = 0x000400, length = 0x000400     /* on-chip RAM block M1 */
   RAML4       : origin = 0x00C000, length = 0x001000     /* on-chip RAM block L1 */
   RAML5       : origin = 0x00D000, length = 0x001000     /* on-chip RAM block L1 */
   RAML6       : origin = 0x00E000, length = 0x001000     /* on-chip RAM block L1 */
   RAML7       : origin = 0x00F000, length = 0x001000     /* on-chip RAM block L1 */
}

/* Allocate sections to memory blocks.
   Note:
         codestart user defined section in DSP28_CodeStartBranch.asm used to redirect code 
                   execution when booting to flash
         ramfuncs  user defined section to store functions that will be copied from Flash into RAM
*/ 

SECTIONS
{

   /* Allocate program areas: */
   .cinit              : > FLASHB      PAGE = 0
   .pinit              : > FLASHB      PAGE = 0
   .text               : > FLASHB      PAGE = 0
   codestart           : > BEGIN       PAGE = 0
   ramfuncs            : > FLASHB      PAGE = 0 

   csmpasswds          : > CSM_PWL     PAGE = 0
   csm_rsvd            : > CSM_RSVD    PAGE = 0

   /* Allocate uninitalized data sections: */
   .stack              : > RAMM1       PAGE = 1
   .ebss               : > RAML5       PAGE = 1
   .esysmem            : > RAMM1       PAGE = 1

   /* Initalized sections go in Flash */
   /* For SDFlash to program these, they must be allocated to page 0 */
   .econst             : > FLASHB      PAGE = 0
   .switch             : > FLASHB      PAGE = 0      

   /* Allocate IQ math areas: */
   IQmathTables     : > IQTABLES,  PAGE = 0, TYPE = NOLOAD 
   IQmathTables2    : > IQTABLES2, PAGE = 0, TYPE = NOLOAD 
   FPUmathTables    : > FPUTABLES, PAGE = 0, TYPE = NOLOAD 

   .reset              : > RESET,      PAGE = 0, TYPE = DSECT
   vectors             : > VECTORS     PAGE = 0, TYPE = DSECT

   /* Allocate ADC_cal function (pre-programmed by factory into TI reserved memory) */
   .adc_cal     : load = ADC_CAL,   PAGE = 0, TYPE = NOLOAD

}

/*
//===========================================================================
// End of file.
//===========================================================================
*/

建立完成cmd檔案之後,在CCS6.0中(或之後的版本)右鍵點選之前的28335_RAM_lnk.cmd檔案,選擇Exculde from Build命令,則該檔案不參與編譯,檢查燒寫所用的cmd檔案,如果沒有參與編譯,則取消勾選Exculde from Build命令,使該檔案參與編譯。

兩個cmd檔案只能選擇其中一個參與編譯,否則編譯器有可能無法識別具體的操作空間而出錯。

3.增加程式碼跳轉檔案

同時我們還需要在原有的除錯程式專案中新增跳轉程式碼檔案DSP2833x_CodeStartBranch.asm,在處理器完成引導後跳轉到使用者應用過程入口。

同一晶片對應的DSP2833x_CodeStartBranch.asm檔案也相同,因此我們可以從其他例程中拷貝或者自己新增該檔案,檔案內容如下:

注意:以下內容只試用於TMS320F28335!

;// TI File $Revision: /main/1 $
;// Checkin $Date: August 18, 2006   13:45:55 $
;//###########################################################################
;//
;// FILE:  DSP2833x_CodeStartBranch.asm 
;//
;// TITLE: Branch for redirecting code execution after boot. 
;//
;// For these examples, code_start is the first code that is executed after
;// exiting the boot ROM code. 
;//
;// The codestart section in the linker cmd file is used to physically place
;// this code at the correct memory location.  This section should be placed 
;// at the location the BOOT ROM will re-direct the code to.  For example, 
;// for boot to FLASH this code will be located at 0x3f7ff6. 
;//
;// In addition, the example DSP2833x projects are setup such that the codegen
;// entry point is also set to the code_start label.  This is done by linker 
;// option -e in the project build options.  When the debugger loads the code,
;// it will automatically set the PC to the "entry point" address indicated by
;// the -e linker option.  In this case the debugger is simply assigning the PC, 
;// it is not the same as a full reset of the device. 
;// 
;// The compiler may warn that the entry point for the project is other then
;//  _c_init00.  _c_init00 is the C environment setup and is run before 
;// main() is entered. The code_start code will re-direct the execution 
;// to _c_init00 and thus there is no worry and this warning can be ignored. 
;// 
;//###########################################################################
;// $TI Release: DSP2833x/DSP2823x C/C++ Header Files V1.31 $
;// $Release Date: August 4, 2009 $
;//###########################################################################


***********************************************************************

WD_DISABLE  .set    1       ;set to 1 to disable WD, else set to 0

    .ref _c_int00
    .global code_start

***********************************************************************
* Function: codestart section
*
* Description: Branch to code starting point
***********************************************************************

    .sect "codestart"

code_start:
    .if WD_DISABLE == 1
         LB wd_disable       ;Branch to watchdog disable code
    .else
        LB _c_int00         ;Branch to start of boot.asm in RTS library
    .endif

;end codestart section


***********************************************************************
* Function: wd_disable
*
* Description: Disables the watchdog timer
***********************************************************************
    .if WD_DISABLE == 1

    .text
wd_disable:
    SETC OBJMODE        ;Set OBJMODE for 28x object code
    EALLOW              ;Enable EALLOW protected register access
    MOVZ DP, #7029h>>6  ;Set data page for WDCR register
    MOV @7029h, #0068h  ;Set WDDIS bit in WDCR to disable WD
    EDIS                ;Disable EALLOW protected register access
    LB _c_int00         ;Branch to start of boot.asm in RTS library

    .endif

;end wd_disable



    .end

;//===========================================================================
;// End of file.
;//===========================================================================

4.生成可執行檔案

點選Build Project進行編譯(Ctrl+B),編譯沒有錯誤之後會在Debug目錄下生成.out檔案,該檔案就是我們往Flash中燒寫的檔案。

5.燒寫(或模擬)可執行檔案

之後的過程與模擬時候Debug的過程相同。

以下內容可忽略:

配置TargetConfiguration檔案,如果沒有,可以右鍵x專案,選擇new->Target Configuration File生成一個,檔名可以自己選取。

點選TargetConfiguration檔案,設定connection和Board or Device項分別為我們使用的模擬器,例如XDS100V3和28335,然後右側點選Save進行儲存,同時可以點選Test Connection按鈕進行測試是否能夠成功連線。

如果我們專案中有另一個該配置檔案,且該檔案不是我們需要的,與硬體不匹配,在Debug的時候發現使用的模擬器與我們配置的不相同,可以點選View->Target Configurations,在開啟的視窗中找到我們的專案,展開可能看到多個xxxconfig.ccxml檔案,選擇我們需要的檔案右擊,點選Set As Default,將其設定為預設的配置檔案。

同時也可以在專案的config.ccxml檔案上直接右鍵選擇Set As Default Target Configuration。

點選Run->Debug選項,程式會直接連線模擬器並下載內容,如果使用的ram的cmd檔案,則直接模擬執行,如果使用的是flash的cmd檔案,則會先擦除flash中的資料並下載可執行檔案到flash中。

如果程式沒有自動下載或者連線模擬器,則在Debug視窗中手動進行連線,在Run選項下或者Debug視窗中選擇Connect Target,連線模擬器,如果沒有自動下載,則在連線模擬器之後,選擇Run->Load->Load Program進行程式的下載。

在RAM中執行程式和在Flash中執行程式下載的過程是相同的。

注意:在程式的下載過程中不要進行斷電或者拔掉模擬器,否則有可能造成晶片鎖死。

6.驗證程式是否燒寫到FLash中

程式燒寫完成之後,給板子斷電。通過撥碼開關或者其他方式設定GPIO84/85/86/87四個引腳為高電平,則為設定Boot Mod模式為Flash啟動,然後重新上電,看程式是否執行。

斷電上電如果程式自動執行,則表明往Flash中燒寫成功。