Ⅰ、寫在前面
本文主要講述的內容:基于Keil開發工具下,STM32內部RAM在線調試配置方法,以及每一項配置的詳細說明。如需要了解更多相關的文章,可以到我博客,或微信公眾號查看。
讓程序運行在RAM中調試代碼有兩優點:1.速度快;2.減少對芯片FLASH讀寫次數,增加芯片壽命。
本文牽涉的知識比較多,如果弄明白所有細節問題,對自己這方面的技能是一種很大的提升。
本文基于ST公司Cortex-M內核的STM32來講述其配置方法,其實也適用于其他公司(如:TI、NXP等)的Cortex-M芯片,原理都是一樣的。
本文PDF文章可以在我360云盤下載:
https://yunpan.cn/ckvUU7t8vuWbn訪問密碼 42b3
關于本文的更多詳情請往下看。
Ⅱ、本文要點
1.主要內容
由于本文牽涉的內容比較多,我會按章節來講述各項內容,大體分為:
l實現STM32內部RAM調試的配置方法
l每條配置的詳細說明
l網上配置方法說明及存在的不足
2.工程代碼下載
為了方便大家學習,我將配置前(一般常用)工程和配置后工程分別打包上傳至360云盤供大家下載參考學習。配置前和配置后工程實現的功能都是一樣的。
配置前工程代碼STM32F10x_Demo:
https://yunpan.cn/ckvVFJi5e9r26訪問密碼 8ffb
配置后工程代碼STM32F10x_Demo(RAM調試):
https://yunpan.cn/ckvVYAMWBqNjX訪問密碼 418b
3.代碼功能描述
上面提供下載的代碼實現的功能是一樣的,具體如下兩點:
l間隔500ms LED亮滅變化一次,串口打印數據“Demo..”一次。
l串口中斷接收數據,會將收到數據通過串口發送出去。
第一點是為了有一個狀態顯示,知道程序在運行。
第二點在本文中的作用也很大,就是使用了中斷功能。由于RAM調試會牽涉到向量表,中斷功能就會使用到向量表,如果沒有配置正確,這里就不會響應中斷,或者出錯。
4.驗證配置成功方法
本文提供的“STM32F10x_Demo”是斷電后重新上電會繼續運行代碼;而“STM32F10x_Demo(RAM調試)”是斷點之后程序丟掉了,也就是不能運行了【請更加LED及串口打印現象來判斷】。
注意:使用RAM調試之前請將FLASH里面的數據擦除掉,否則使用RAM調試斷電再上電,程序會從FLASH運行,會認為程序依然在運行,從而影響判斷。
Ⅲ、RAM調試配置方法
本節主要講述配置方法的過程,為什么這么配置,以及配置的原理將會在下一章節講述。
1.修改內存地址
打開目標配置:Project -> Options for Target -> Target 或“工程目標配置”點擊快捷按鈕。
將ROM和RAM地址映射到如下圖地址。 我們使用STM32F103ZE芯片,該芯片的RAM大小為0x10000 即64KB,我們這里平分RAM,即各自的大小為0x5000。
注意:配置的地址范圍不能超過芯片實際的大小。
2.配置向量表
同上,打開目標配置:Project -> Options for Target -> C/C++,使用宏定義VECT_TAB_SRAM。如下圖:
這里的宏定義是為了讓向量表指向RAM(我們默認是指向ROM),重要的一個目的就是讓中斷向量表指向RAM,上面“代碼功能”中斷的意義就是為了驗證向量表的正確性。
注意:這里的宏定義是在工具鏈中配置的,多個宏定義之間需要有“逗號”隔離開來。
其實這里的宏定義配置也可以在源代碼中實現,打開system_stm32f10x.c文件下第127行的“VECT_TAB_SRAM”宏定義,如下圖:
【個人建議:調試和非調試代碼最好一致,也就是源代碼不變】
3.調試配置
同上:Project -> Options for Target -> Debug,這里是關于調試的配置。
第一步:去掉“Load Application at Startup”前面的勾選項
第二步:導入RAM初始化文件。
RAM初始化文件里面內容如下:
FUNC void Setup (void) {
SP = _RDWORD(0x20000000);
PC = _RDWORD(0x20000004);
_WDWORD(0xE000ED08, 0x20000000);
}
LOADObjects\ExecutableFile.axfINCREMENTAL
Setup();
g, main
每一條語句具體意思請見源代碼注釋,這里提示的是Objects\ExecutableFile.axf
也就是輸出路徑和輸出文件名,它的路徑與文件名與你工程配置需對應。
4.調試不更新目標程序
同上:Project -> Options for Target -> Utilities,不勾選“更新”。意思就是在線調試時,不更新芯片(下載FLASH)程序。
至此,STM32內部RAM在線調試配置方法就完成了,連接開發板就可以使用RAM在線調試代碼了。
網上相關的問題還有其他無關的配置,我會在下面單獨說明一下為什么不用配置那些。
Ⅳ、配置說明
上面配置過程已經知道了,這一節講述一下為什么這樣配置,以及這么配置的意思。
1.修改內存地址說明
內存地址為什么ROM設置為0x20000000,RAM設置為0x20005000。原因在于芯片的RAM其實地址就是0x20000000(沒有猜錯的話Cortex-M那芯片RAM起止地址都是0x20000000)。
至于大小嘛,就是看芯片型號了,我們這里平分大小,也可以不用平分大小。
這里分配的地址會直接影響輸出的文件“ExecutableFile.sct”,也就是我們鏈接的時候需要使用到的“ExecutableFile.sct”文件。
查看“ExecutableFile.sct”文件的方法:Project -> Options for Target -> Linker,如下圖。【需要編譯之后才能輸出“ExecutableFile.sct”文件,即編譯后才能查看】
對比沒有配置RAM調試(也就是沒有修改地址)的工程如下圖:
網上配置教程說要修改Linker下的地址,其實是多余的,詳情請見下一章節。
2.配置向量表說明
愛思考(或者會尋到問題)的朋友可能會發現,我不宏定義VECT_TAB_SRAM這個參數,程序照常可以運行(LED變化、串口打印數據)。
其實這里的配置主要是針對“向量表”,比如中斷向量表。如果當我們不宏定義VECT_TAB_SRAM這個參數,測試串口中斷的時候,程序就會跑死,(暫停)程序會指向一個非法的地址,如下圖:
3.調試配置說明
這個地方的配置很好理解,就是我們要將程序指針指向我們特定的地址(RAM)區域,這樣好讓程序執行我們指定地址里面的程序。
我們加載文件“CpuRAM.ini”,因此不需要勾選“Load Application at Startup”這個選項。
加載文件的名稱“CpuRAM.ini”和網上一些教程命名一樣,可以自己命名,只要后綴名一樣就行。
4.調試不更新目標程序說明
這個地方其實就是在調試的時候更新(下載)芯片FLASH的代碼,由于我們沒有修改FLASH的燒寫算法,這里就不勾選次選項。
當我們修改了FLASH的燒寫算法(程序指向RAM),這里可以勾選上。
相比兩者,我們選擇不勾選該選項簡單一點,因此這里選擇不勾選。
Ⅴ、網上配置說明
筆者開始學習RAM調試的內容時,也是參考網上很多的教程,但是經過筆者親自,并且多次測試發現網上的有些教程存在不足之處。本節主要是提出網上某些教程存在的不足或者多余之處。【若有不對之處敬請諒解】
1.修改Linker地址
Project -> Optionsfor Target -> Linker
網上的配置,這里的地址基本上都是修改了的。
1.去掉勾選; 2.再次修改地址。
我剛開始學習配置時也是修改了的,但后面我再次配置時發現一個問題:地址前面為勾選。什么意思呢,就是沒有使用這個配置的地址。
于是我就不配置(不修改)這里的地址進行驗證,結果還是可以在RAM中調試,大量測試也沒發現什么問題。
我再次查看Scatter File文件ExecutableFile.sct,發現不修改地址也是一樣的。其實“ExecutableFile.sct”文件的地址是我上一章節里面說的,由Target里面的地址決定的。
因此,網上所配置的這里其實是多余的配置。
2.配置向量表
有很多教程使用了在main函數開始配置向量表,也就是在main函數開始出增加一條語句:NVIC_SetVectorTable(NVIC_VectTab_RAM, 0x0);
這條語句其實是system_stm32f10x.c文件里面第265行的:SCB -> VTOR = SRAM_BASE | VECT_TAB_OFFSET;一樣的意思。
因此,我個人覺得,項目中的調試代碼和真正運行的源代碼不能有差異。定義了VECT_TAB_SRAM這個宏定義,就沒必要還在main函數里面增加一條語句。
細心的朋友可能會發現,我在“Ⅲ、RAM調試配置方法”這一章節中沒有修改源代碼,只是修改了配置。這樣就保證了代碼的一致性。
3.修改編程地址
網上有很多教程是修改了下圖中編程的地址,也就是修改了編程算法。
作為調試,本來就是運行在RAM中,再在這里配置,我覺得是多次一舉。因此我們上面講述的是沒有勾選:Update Target Before Debugging.
Ⅵ、說明
STM32內部RAM調試代碼時,復位不起作用,需要復位請重新鏈接運行。關于RAM在線調試配置還有許多未講述完,請親自配置并測試驗證,你或許會明白更多有用知識。
以上總結僅供參考,若有不對之處,敬請諒解。
-
RAM
+關注
關注
8文章
1367瀏覽量
114536 -
STM32
+關注
關注
2266文章
10875瀏覽量
354878 -
keil
+關注
關注
68文章
1212瀏覽量
166695
發布評論請先 登錄
相關推薦
評論