F28335 存儲器 以及CMD文件操作


F28335的存儲器結構

 

28335 包括SARAM存儲器FLASH存儲器

其中SARAM存儲器的空間是34K x 16位 包括M0 ,M1 L0~L7

L4—L7用於DMA控制器訪問。

其中FLASH存儲器的空間是256K X16

 

 

 

FLASH的地址范圍 0X30 0000~0x33 FFF7

注意下圖 中的0x33 FFF8 是128 bit password 塊的首地址。

FLASH的范圍是0X30 0000~0x33 FFF7

 

 

FLASH的范圍是0X30 0000~0x33 FFF7 實際上有0X3FFF8個16位內存單元

 

0X3FFF8 對應十進制是 262136 262136/1024=256

故 是256K X 16 位 的 FLASH

 

關鍵字128

注意在FLASH A 的底部 有128個單元是比較特殊 的 如下圖所示 。

 

 

 

 

 

F28335 的片內FLASH 共 8 個 32K x 16位 的單元 總共256K x 16位單元

名稱

起始地址

結束地址

Sector H (32k X 16)

0X30 0000

0X30 7FFF

Sector G (32k X 16)

0X30 8000

0X30 FFFF

Sector F (32k X 16)

0X31 0000

0X31 7FFF

Sector E (32k X 16)

0X31 8000

0X31 FFFF

Sector D (32k X 16)

0X32 0000

0X32 7FFF

Sector C (32k X 16)

0X32 8000

0X32 FFFF

Sector B (32k X 16)

0X33 0000

0X33 7FFF

Sector A(32k X 16)

0X33 8000

0X33 FFFF

 

 

 

 

 

CMD 文件中memory 指令

 

通過MEMORY 偽指令來指示存儲空間

頁0 來指示程序空間

頁1 來指示數據空間

 

ZONE0 是外部擴展接口 起始地址是0x4000 終止地址是0x4FFF 總長度是0x1000

2的12次方 是4x 1024 是4K X16 位

 

ZONE6 必須定義 因為 我DSP 程序中PORT_AD 輸出電流和輸出電壓的采樣利用的外部AD 外部AD通過ZONE6 進行訪問的 。如下圖所示

 

 

 

 

 

 

 

 

FLASH 的起始地是0x30 0000 長度應該是0x3 FF80 上圖誤寫成 0x ff80

應該是包括了 Sector A 的一部分 ;sector B ; Sector C; Sector D ; Sector E ; Sector F ;

Sector G ; Sector H

 

 

BEGIN 段2個16bit 單元是FLASH 引導程序入口。

 

BOOT ROM 也稱為引導ROM

地址范圍是 共8K X 16位

地址是0x3FE00 ~0X3FFFF 空間的分配如下圖所示

 

 

上圖中紅色的地址區域 在地址0x3Ffc00 開始處存有上電引導程序,該程序由初始化引導函數Init-Boot 引導模式選擇函數SelcetBoot Mode 退出引導函數 EXITbOOT 及幾種加載引導函數組成。 是CAN加載 還是SCI加載。

 

地址03F FFC0~0X3F FFC1 內容是復位向量。 DSP在復位以后會讀取該向量。並使程序的執行轉向Boot ROM 中的引導程序(0x3f fc 00-----0x3f ffbf) 進而完成用戶程序的加載。

 

 

 

 

 

 

 

現在回到CMD文件

以上的PAGE0是程序存儲空間 。

 

現在講PAGE1 PAGE1 是數據存儲空間 主要定義的是片上RAM的存儲空間

 

 

 

 

 

 

 

至此CMD 文件中的memory 指令 分為page0 (程序存儲空間) page1 (數據存儲空間)

現在已經講解完了。

 

 

 

現在開始說SECTION 指令

 

SECTION 指令主要是分配段到存儲空間中去, 存儲空間前面已經用MEMORY指令完成。

另外還有一些段 代碼段 與數據段 是通過在 C的偽指令中定義的

例如 #pragma 是標准C中保留的預處理命令

# pragma 的語法是:

 

#pragma CODE_SECTION (symbol,"section name")

#pragma DATA_SECTION (symbol,"section name")

說明:

  1. symbol 是符號。可以是函數名字。也可以是全局變量。Section name 是用戶自己定義的段名。
  2. CODE_SECTION 用來定義代碼段,DATA_SECTION 用來定義數據段。熟悉匯編的人很清楚,起始二者在匯編層次上分別是由偽指令.sect 和.usect實現的。

.sect 意思是用戶定義的已初始化的段。

 

 

 

 

 

 

 

 

解釋 在DSP2833X_CodeStartBranch.asm 用匯編指令中定義了codestart 的段

 

Codestart : > BEGIN PAGE=0

上面的語句表示 codestart 段 被裝載到前面通過memory指令定義的BEGIN 存儲空間中去。

 

  1. 重要

    例如 在DC_CONTROL.H 頭文件中定義了 ramfuncs 段

    通過code_section 偽指令

     

     

    上圖中的

    SECTION

    {

    Ramfuncs : LOAD=FLASH ,

    RUN=RAML0,

    LOAD_START(_RamfuncsLoadStart),

    LOAD_END(_RamfuncsLoadEnd),

    RUN_START(_RamfuncsRunStart),

    PAGE=0

    }

     

上面的語句 通過了SECTION偽指令規定了段(段ramfuncs)將被裝載在存儲器內的何處以及在存儲器內如何運行:

 

其中 LOAD和RUN 是段的兩個屬性, LOAD_START LOAD_END RUN_START

這幾個並非是參數而是能夠生成全局符號的指令

在DigitalControl.map 里面能夠找到 全部變量符號 RamfuncsLoadStart

如下圖

 

這個的RamLoadStart RamLoadEnd RamRunStart 分別決定了裝載的首位地址和運行地址。

 

代碼段的含義指的是

存放在FLASH 中的段ramfuncs 須調入RAML0運行。

 

其裝載在FLASH 的首地址為RamLoadStart,RamLoadEnd ,在RAM中的運行首地址為RamRunStart

 

完成將FLASH中的段ramfuncs 拷貝進入RANML0中運行 還需要以下步驟

 

第一步

將DSP2833x_Memory.c 函數加入到工程中,

Void MemCopy (UINT16 *SourceAddr ,UINT16 *SourceEndAddr , UINT16 *DestAddr)

{

While(SourceAddr<SourceEndAddr)

{

*DestAddr ++ = * SourceAddr++ ;

 

}

 

return

}

 

第二步

由於RamfuncsLoadStart , RamfuncsLoadEnd ,RamfuncsRunStart 是cmd文件定義的,為了能夠在C語言中被MemCopy() 調用。需要按照如下格式聲明

 

extern Uint16 RamfuncsLoadStart

extern Uint16 RamfuncsLoadEnd

extern Uint16 RamfuncsRunStart

 

/***********************************************************************/

注意:實際上下面的紅色 就是定義全局符號的指令

SECTION

{

Ramfuncs : LOAD=FLASH ,

RUN=RAML0,

LOAD_START(_RamfuncsLoadStart),

LOAD_END(_RamfuncsLoadEnd),

RUN_START(_RamfuncsRunStart),

PAGE=0

}

/************************************************************************/

 

 

第三步 需要在主函數中 調用 MemCopy() 函數實現 ramfuncs 段從FLASH 往RAML0

中的復制

 

程序的代碼段如下:

 

Memcopy(&RamfuncsLoadStart ,&RamfuncsLoadEnd, &RamfuncsRunStart)

如下圖中的拷貝程序

 

C語言中有7個定義好的段

已初始化的段

(1).text 編譯C語言中的語句時候,生成的匯編指令代碼存放於此。

(2).cinit 存放用來對全局和靜態變量初始化的常數

(3).switch 存放switch語句產生的常數表格

 

未初始化的段

(1).bss 存放全局和靜態變量 。

(2).stack 存放C語言的棧。

(3) .sysmen 存放c語言的堆。

(4).const 稍微有些復雜的段,簡單而言 是存放一些特殊的常數和字符 。

 

在本CMD文件中 將.text .cinit .switch .const .pinit (已經初始化的段)

放在FLASH 中 page 0 頁中

將.stack .ebss .sysmem (沒有初始化的段)

放在RAM中去 放在page 1 中。

 

如下圖

 

 

 

IQmathTables 是編譯程序以后產生的段

他存放在 前面memory 指定的空間 IQTABLES 中去 在PAGE 0 中

 

IQmath 是頭文件中包含 IQmathlib.h 以后 編譯 產生的的段

該段 存放在MEMORY 指定的FLASH 空間中

需要拷貝到RAML0中去運行 。

 

其裝載在FLASH 中的首地址是 IQmathLoadStart IQmathLoadEnd

RAML0 中運行的首地址是 IQmathRunStart

 

 

 

 

在BOOTROM中 除CPU復位向量 以外的其他向量 為CPU中斷向量 這些向量用於TI公司芯片自己測試 用戶無需關心

第2 因為 不用 bootloader 所以復位向量用暫時不用管

類型均為 DSECT 如下圖

 

 

 

百度網盤源文件鏈接

 


免責聲明!

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



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