寫在前面 Ⅰ
對于在STM32F2或F4開發的朋友而言,有部分數據需要在內部FLASH編程,程序(代碼)又比較大,資源空間又有限的情況下,代碼默認的存儲地址就可能需要搬移。
為什么是F2或F4系列的芯片呢?因為Main memory扇區(或塊)分布不均勻,看下面FLASH模塊構成:
當然,像STM32F0、F1它們的FLASH數據塊分布均勻,這類芯片就沒必要改變程序存儲地址。
為什么要改變代碼存儲地址 Ⅱ
假如芯片的FALSH大小為512KB,RAM大小為128KB。而代碼大小為400KB(甚至更大),又需要在內部FLASH編程,那么代碼的存儲地址就不能從默認的起始地址(Sector 0)開始存儲。
原因很簡單:最后一扇區有代碼,不能被用戶編程。
還有一種原因:用戶RAM大小有限(假如只剩15K未用,RAM用于緩存FLASH數據),而用戶編程FLASH的數據有20K,這樣就需要分多塊(扇區)來操作,這樣就需要將小的扇區拿出來給用戶編程(即前面16K大小的扇區)。
上面舉例的總結就是:需要將代碼的存儲起始地址從Sector 0搬移至Sector 3或者Sector 4,把前面小扇區(Sector 1 --- 3)用于數據編程。(注意:Sector 0扇區存儲啟動的部分代碼,不能用于編程)。
改變代碼存儲地址的方法 Ⅲ
代碼存儲的地址是由編譯器決定的,因此這里簡單講述一下Keil和IAR如何配置改變代碼存儲起始地址。下面以起始地址從0x08010000 (Sector 4)舉例說明。
1.Keil配置方法
打開工程目標選項:Project -> Options for Target -> Target。修改目標ROM起始地址。如下圖:
2.IAR配置方法
配置步驟分如下幾步:
A.進入配置界面:Pooject -> Options -> Linker -> Config;
B.勾選上“Override default”;
C.點擊“Edit”,修改ROM起始地址為;
D.點擊“Save”保存(第一次修改后,xxx.icf文件名和路徑都選擇默認)。
具體如下圖:
驗證代碼存儲地址 Ⅳ
對于STM32芯片來說,可以直接使用STM32 ST-LINK Utility工具讀取FLASH數據驗證代碼是否存儲在相應地址位置,其他芯片也可以使用對應可以讀取FLASH數據的工具來驗證。如下圖:
從上圖可以看見,代碼是從0x08010000 (Sector 4)起始存儲的。查看Sector 1-3扇區,可以發現數據全是0xFFFF,也就是說沒有被代碼占用這些扇區。
-
FlaSh
+關注
關注
10文章
1622瀏覽量
147761 -
編譯器
+關注
關注
1文章
1618瀏覽量
49054 -
STM32F0
+關注
關注
0文章
61瀏覽量
17092
發布評論請先 登錄
相關推薦
評論