[STM32F4xx 學習] 如何在RAM中調試程序


 

在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××××××××××××××××××××××××××××××××××××××××××××/


免責聲明!

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



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