在RAM中調試程序指的是將程序下載到RAM里面(而不是Flash里面),然后在RAM中執行程序、調試。
為什么要在RAM中調試程序?總結起來有以下兩點原因:
1. Flash 擦寫次數有限,STM32F4xx的Flash擦寫次數只有上萬次,見圖1 Flash規格描述
圖1. STM32F4xx Flash 壽命與保存時間
2. 程序下載到RAM里面要比下載到Flash里面快很多,在需要反復調試的時候,能省下不少時間(像調試GUI的時候)。
當然,在RAM調試也有一些不足的,比如:
1. 需要占用部分RAM用來存放程序
2. 不能使用軟件復位功能,即每次運行程序前都要重新下載程序
3. 程序在RAM中調試成功,在Flash中不保證100%成功
4. 斷電后程序會丟失
設置過程如下:
Step 1. 在uVision 中新建一種配置,命名為“RAM”
Step 1. 新建配置
Step 2. 選中新建的“RAM” 配置,配置新建的"RAM"配置
Step 2. 配置“RAM”
Step 3. 根據STM32F4xx RAM地址范圍,在Target中配置代碼段地址(IROM),數據段地址(IRAM)
Step 3. 配置地址范圍
STM32F4xx的RAM大小為192KB(112+16+64):
- 112KB和16KB的起始地址為0x2000 0000,通過AHB總線訪問
- 64KB的起始地址為0x1000 0000,只能通過CPU直接訪問,關於這64KB RAM有何用途,請參考以下博文:
http://blog.sina.com.cn/s/blog_61332ec601016hj6.html
圖2. STM32F4xx RAM 地址映射
Step 4. 在Linker中確保使用的是Target中設置的映射方式
Step 4. 地址映射選擇
Step 5. 添加初始化文件(如果沒有,復制以下代碼到文本編輯器中,保存為.ini,並保存到工程所在目錄中)
1 FUNC void Setup (void) { 2 SP = _RDWORD(0x20000000); // 堆棧指針 3 PC = _RDWORD(0x20000004); // PC 4 _WDWORD(0xE000ED08, 0x20000000); // 中斷向量偏移地址 5 } 6 7 LOAD %L INCREMENTAL // 載入axf文件 8 9 Setup(); // 調用Setup(); 10 11 g, main //跳轉到main
清單1. 初始化代碼
Step 5. 添加初始化文件
Step 6. 仿真器下載地址的配置
Step 6. 仿真器下載地址配置
方框②中的起始地址和大小就是Step 3中配置的代碼存放范圍(IROM),方框③中的起始地址和Step 3中的數據存放地址(IRAM)的起始地址相同,大小默認為0x0800。最后把方框④選上,這樣每次進入仿真狀態前,都會重新下載代碼到RAM里面。
現在重新編譯源文件,編譯完成后,打開.map文件,是不是發現ROM和RAM已從新分配了?現在,享受Debug帶來的樂趣吧!
More~
1. STM32F4xx Datasheet中描述,若要從RAM中啟動,Boot0, Boot1引腳必須置高電平,如圖3所示。實際測試,不管Boot0, Boot1為何值,都能從RAM中啟動代 碼。
圖3. 啟動模式選擇
2. 若需要使用中斷,也要將NVIC中斷向量表重新映射到RAM里面。具體操作是在system_stm32f4xx.c源文件中,去掉#define VECT_TAB_SRAM前面的注釋,如
圖4所示
圖4.
/×××××××××××××××××××××××××××××××××××××××× THE END××××××××××××××××××××××××××××××××××××××××××××/