相關閱讀:
mm32-2nd-bootloader技術白皮書(1)——配置軟硬件環境
mm32-2nd-bootloader技術白皮書(2)——QSPI外設簡介
mm32-2nd-bootloader技術白皮書(3)——設計實現QSPI Flash的下載算法
mm32-2nd-bootloader技術白皮書(4)——設計實現簡單的2nd bootloader
引言
在前文中已經實現了一個能夠在 MDK 平臺進行下載代碼到 QSPI Flash 中的下載算法,以及一個能跳轉執行應用程序的 2nd Bootloader,但若想將代碼下載到 QSPI Flash上并運行,仍需對所需執行的代碼文件進行少量的修改,使其能夠在 QSPI Flash 上運行。
修改Linker文件
本文將 MindSDK 的 PLUS-F5270 hello_world 樣例工程作為所需執行的文件,可通過 MindSDK 官網 (https://mindsdk.mindmotion.com.cn/) 獲取該樣例,如圖 1 所示。
圖1 通過官網獲取 MindSDK PLUS-F5270 hello_world樣例工程
打開 hello_world 樣例工程,在Options for Target選項的Linker頁面下,找到Scatter File選項,該選項中內容為 Linker 所使用的 Scatter File 文件路徑,點擊該選項右側的Edit,此時樣例工程中會彈出對應的 Scatter File 文件界面,如圖 2 所示。
圖2 打開scatter file文件界面
在彈出的 mm32f5277e_flash.scf 文件中,需要根據 QSPI 的存儲器映像配置__ROM_BASE的數值,QSPI 外設的基礎地址為 0x90000000,這個地址值來自于微控制器的用戶手冊的 “地址映射” 章節,如圖 3 所示。因此,__ROM_BASE的數值應該為 0x90000000。
圖3 QSPI 外設的存儲器映像編址范圍
QSPI Flash 的大小為8MB,其中 8MB = 8 * 1024 *1024 = 8388608,換算為 16 進制是 0x00800000,因此,__ROM_SIZE的數值應該為 0x00800000。
Scatter File文件的內容修改如下:
... /*---------------------FlashConfiguration---------------------------------- ;FlashConfiguration ;FlashBaseAddress<0x0-0xFFFFFFFF:8> ;FlashSize(inBytes)<0x0-0xFFFFFFFF:8> ; *----------------------------------------------------------------------------*/ #define__ROM_BASE0x90000000 #define__ROM_SIZE0x00800000 ...
修改源代碼
在配置好 Linker 所需的 Scatter File 文件后,需要對將要執行的文件進行檢查,去除可能會影響到 QSPI Flash 運行的代碼,需要檢查的點如下:
檢查時鐘初始化部分:
是否存在復位 QSPI 模塊的時鐘或復位 QSPI 所使用的 GPIO 引腳時鐘的情況
若存在復位 QSPI 模塊,則處理器將無法從 QSPI Flash 中讀取下一個要執行的指令。
若存在復位 QSPI 使用引腳的時鐘,則運行到引腳時鐘復位后,GPIO 復位,引腳不再作為 QSPI 的接口,因此將會影響到 QSPI 與 QSPI Flash 之間的通信。
在 “hello_world” 工程中,以上代碼可能會出現在 board 目錄下的 “clock_init.c” 中。
檢查引腳初始化部分:
是否占用 QSPI 所使用的引腳
若引腳初始化時,占用 QSPI 所需引腳,將會影響與 QSPI Flash 的通信
在 “hello_world” 工程中,以上代碼可能會出現在 board 目錄下的 “pin_init.c” 中。
不能出現以間接模式操作 QSPI Flash 的代碼
若執行間接模式操作 QSPI Flash 的代碼,會中斷直接讀模式,而直接讀模式是執行存儲在 QSPI Flash 的應用程序的基礎,因此,執行間接模式操作 QSPI Flash 的代碼會使應用程序跑飛。
在 “hello_world” 工程中,沒有執行間接模式操作 QSPI Flash 的代碼。
添加下載算法到可執行文件
該可執行樣例最終將在 QSPI Flash 中存儲并運行,因此,需要添加根據實際所使用的 QSPI Flash芯片而配置的下載算法到樣例工程中,以幫助調試器將指定位置的數據寫入 Flash。
以配置完成的 PLUS-F5270 hello_world 樣例工程為例,打開Options for Target的Debug頁面,選擇Settings選項進入Cortex Jlink/JTrace Target Driver Setup頁面的Flash Download,選擇Add選項,進入下載算法選擇列表,選擇前文中設置好的MM32F5270 QSPI FlashLoader下載算法,點擊Add進行添加,如圖 4 所示。
圖4 添加下載算法到可執行文件中
此處需注意,若下載算法的大小大于Flash Download中RAM for Algorithm的Size選項中的大小,會導致在下載時出現 "Cannot Load Flash Programming Algorithm" 的問題,此時需適當將Size的大小調大一些,本文中設置Size為 0x2000。
驗證
配置完成在 QSPI Flash 上運行的可執行文件后,可嘗試使用下載算法將整個工程下載到 QSPI Flash 中并使用 2nd Bootloader 執行這個工程。
先將前文中實現運行在片內 Flash 的 2nd Bootloader 下載到 PLUS-F5270 開發板中,再將已經配置好的添加了下載算法的 hello_world 樣例工程下載到開發板中的 QSPI Flash 中。下載成功后復位微控制器,通過串口調試器可看到輸出字符 "hello_world"。
圖5 使用QSPI Flash的hello_world樣例工程運行結果
在調試模式下,可以從 Disassemby 窗口觀察到進入main函數后地址處于 0x90000950,屬于 QSPI Flash 的范圍內,由此可見,整個 hello_world 下載到 QSPI Flash中并且正確運行。
圖6 通過調試查看樣例起始地址
至此,已經驗證了下載算法可用, 2nd Bootloader 可用,修改后的樣例工程也可用。
但仍需驗證下中斷是否可用,本文修改 hello_world 工程,驗證 SysTick_Handler() 能否正確執行。
volatileuint32_tsystime=0u; intmain(void) { uint8_tch; BOARD_Init(); printf("hello,worldrn"); SysTick_Config(CLOCK_SYSTICK_FREQ/1000u); while(1) { if(systime>1000) { systime=0; putchar('*'); } } } voidSysTick_Handler() { systime++; }
將修改后的樣例工程下載并運行在 QSPI Flash 上,其結果如圖 7 所示。
圖7 驗證SysTick中斷可用的樣例結果
至此,也驗證了中斷也可正確執行。
總結
為了編譯可在QSPI Flash上運行的可執行文件,需要作出以下兩件事:
修改 Linker 文件,將 ROM 的位置和大小修改為 QSPI Flash 的映射地址和大小
修改源代碼中所有可能會影響訪問QSPI Flash的代碼,例如 GPIO 的配置,時鐘的配置等
可以發現編譯可在 QSPI Flash上運行的可執行文件并不難,因此可以輕松將應用程序遷移到 QSPI Flash 里。
來源:靈動MM32MCU
免責聲明:本文為轉載文章,轉載此文目的在于傳遞更多信息,版權歸原作者所有。本文所用視頻、圖片、文字如涉及作品版權問題,請聯系小編進行處理
審核編輯 黃宇
-
FlaSh
+關注
關注
10文章
1640瀏覽量
148293 -
bootloader
+關注
關注
2文章
235瀏覽量
45660 -
SDK
+關注
關注
3文章
1041瀏覽量
46063 -
QSPI
+關注
關注
0文章
41瀏覽量
12227
發布評論請先 登錄
相關推薦
評論