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")
說明:
-
symbol 是符號。可以是函數名字。也可以是全局變量。Section name 是用戶自己定義的段名。
-
CODE_SECTION 用來定義代碼段,DATA_SECTION 用來定義數據段。熟悉匯編的人很清楚,起始二者在匯編層次上分別是由偽指令.sect 和.usect實現的。
.sect 意思是用戶定義的已初始化的段。
解釋 在DSP2833X_CodeStartBranch.asm 用匯編指令中定義了codestart 的段
Codestart : > BEGIN PAGE=0
上面的語句表示 codestart 段 被裝載到前面通過memory指令定義的BEGIN 存儲空間中去。
-
重要
例如 在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 如下圖