引言
在前文中已經(jīng)實(shí)現(xiàn)了一個(gè)能夠在 MDK 平臺(tái)進(jìn)行下載代碼到 QSPI Flash 中的下載算法,以及一個(gè)能跳轉(zhuǎn)執(zhí)行應(yīng)用程序的 2nd Bootloader,但若想將代碼下載到 QSPI Flash上并運(yùn)行,仍需對(duì)所需執(zhí)行的代碼文件進(jìn)行少量的修改,使其能夠在 QSPI Flash 上運(yùn)行。
修改Linker文件
本文將 MindSDK 的 PLUS-F5270 hello_world 樣例工程作為所需執(zhí)行的文件,可通過(guò) MindSDK 官網(wǎng) 獲取該樣例,如圖 1 所示。
圖1 通過(guò)官網(wǎng)獲取 MindSDK PLUS-F5270 hello_world樣例工程
打開 hello_world 樣例工程,在Options for Target選項(xiàng)的Linker頁(yè)面下,找到 Scatter File 選項(xiàng),該選項(xiàng)中內(nèi)容為 Linker 所使用的 Scatter File 文件路徑,點(diǎn)擊該選項(xiàng)右側(cè)的 Edit ,此時(shí)樣例工程中會(huì)彈出對(duì)應(yīng)的 Scatter File 文件界面,如圖 2 所示。
圖2 打開scatter file文件界面
在彈出的 mm32f5277e_flash.scf 文件中,需要根據(jù) QSPI 的存儲(chǔ)器映像配置 __ROM_BASE 的數(shù)值,QSPI 外設(shè)的基礎(chǔ)地址為 0x90000000,這個(gè)地址值來(lái)自于微控制器的用戶手冊(cè)的 “地址映射” 章節(jié),如圖 3 所示。因此,__ROM_BASE的數(shù)值應(yīng)該為 0x90000000。
圖3 QSPI 外設(shè)的存儲(chǔ)器映像編址范圍
QSPI Flash 的大小為8MB,其中 8MB = 8 * 1024 *1024 = 8388608,換算為 16 進(jìn)制是 0x00800000,因此,__ROM_SIZE 的數(shù)值應(yīng)該為 0x00800000。
Scatter File文件的內(nèi)容修改如下:
... /*---------------------FlashConfiguration---------------------------------- ;FlashConfiguration ;FlashBaseAddress<0x0-0xFFFFFFFF:8> ;FlashSize(inBytes)<0x0-0xFFFFFFFF:8> ; *----------------------------------------------------------------------------*/ #define__ROM_BASE0x90000000 #define__ROM_SIZE0x00800000 ...
修改源代碼
在配置好 Linker 所需的 Scatter File 文件后,需要對(duì)將要執(zhí)行的文件進(jìn)行檢查,去除可能會(huì)影響到 QSPI Flash 運(yùn)行的代碼,需要檢查的點(diǎn)如下:
檢查時(shí)鐘初始化部分:
是否存在復(fù)位 QSPI 模塊的時(shí)鐘或復(fù)位 QSPI 所使用的 GPIO 引腳時(shí)鐘的情況
若存在復(fù)位 QSPI 模塊,則處理器將無(wú)法從 QSPI Flash 中讀取下一個(gè)要執(zhí)行的指令。
若存在復(fù)位 QSPI 使用引腳的時(shí)鐘,則運(yùn)行到引腳時(shí)鐘復(fù)位后,GPIO 復(fù)位,引腳不再作為 QSPI 的接口,因此將會(huì)影響到 QSPI 與 QSPI Flash 之間的通信。
在 “hello_world” 工程中,以上代碼可能會(huì)出現(xiàn)在 board 目錄下的 “clock_init.c” 中。
檢查引腳初始化部分:
是否占用 QSPI 所使用的引腳
若引腳初始化時(shí),占用 QSPI 所需引腳,將會(huì)影響與 QSPI Flash 的通信
在 “hello_world” 工程中,以上代碼可能會(huì)出現(xiàn)在 board 目錄下的 “pin_init.c” 中。
不能出現(xiàn)以間接模式操作 QSPI Flash 的代碼
若執(zhí)行間接模式操作 QSPI Flash 的代碼,會(huì)中斷直接讀模式,而直接讀模式是執(zhí)行存儲(chǔ)在 QSPI Flash 的應(yīng)用程序的基礎(chǔ),因此,執(zhí)行間接模式操作 QSPI Flash 的代碼會(huì)使應(yīng)用程序跑飛。
在 “hello_world” 工程中,沒有執(zhí)行間接模式操作 QSPI Flash 的代碼。
添加下載算法到可執(zhí)行文件
該可執(zhí)行樣例最終將在 QSPI Flash 中存儲(chǔ)并運(yùn)行,因此,需要添加根據(jù)實(shí)際所使用的 QSPI Flash芯片而配置的下載算法到樣例工程中,以幫助調(diào)試器將指定位置的數(shù)據(jù)寫入 Flash。
以配置完成的 PLUS-F5270 hello_world 樣例工程為例,打開 Options for Target 的 Debug 頁(yè)面,選擇 Settings 選項(xiàng)進(jìn)入 Cortex Jlink/JTrace Target Driver Setup 頁(yè)面的 Flash Download ,選擇 Add 選項(xiàng),進(jìn)入下載算法選擇列表,選擇前文中設(shè)置好的 MM32F5270 QSPI FlashLoader 下載算法,點(diǎn)擊 Add 進(jìn)行添加,如圖 4 所示。
圖4 添加下載算法到可執(zhí)行文件中
此處需注意,若下載算法的大小大于Flash Download中RAM for Algorithm的Size選項(xiàng)中的大小,會(huì)導(dǎo)致在下載時(shí)出現(xiàn) "Cannot Load Flash Programming Algorithm" 的問題,此時(shí)需適當(dāng)將Size的大小調(diào)大一些,本文中設(shè)置Size為 0x2000。
驗(yàn)證
配置完成在 QSPI Flash 上運(yùn)行的可執(zhí)行文件后,可嘗試使用下載算法將整個(gè)工程下載到 QSPI Flash 中并使用 2nd Bootloader 執(zhí)行這個(gè)工程。
先將前文中實(shí)現(xiàn)運(yùn)行在片內(nèi) Flash 的 2nd Bootloader 下載到 PLUS-F5270 開發(fā)板中,再將已經(jīng)配置好的添加了下載算法的 hello_world 樣例工程下載到開發(fā)板中的 QSPI Flash 中。下載成功后復(fù)位微控制器,通過(guò)串口調(diào)試器可看到輸出字符 "hello_world"。
圖5 使用QSPI Flash的hello_world樣例工程運(yùn)行結(jié)果
在調(diào)試模式下,可以從 Disassemby 窗口觀察到進(jìn)入main函數(shù)后地址處于 0x90000950,屬于 QSPI Flash 的范圍內(nèi),由此可見,整個(gè) hello_world 下載到 QSPI Flash中并且正確運(yùn)行。
圖6 通過(guò)調(diào)試查看樣例起始地址
至此,已經(jīng)驗(yàn)證了下載算法可用, 2nd Bootloader 可用,修改后的樣例工程也可用。
但仍需驗(yàn)證下中斷是否可用,本文修改 hello_world 工程,驗(yàn)證 SysTick_Handler() 能否正確執(zhí)行。
volatileuint32_tsystime=0u; intmain(void) { uint8_tch; BOARD_Init(); printf("hello,world "); SysTick_Config(CLOCK_SYSTICK_FREQ/1000u); while(1) { if(systime>1000) { systime=0; putchar('*'); } } } voidSysTick_Handler() { systime++; }
將修改后的樣例工程下載并運(yùn)行在 QSPI Flash 上,其結(jié)果如圖 7 所示。
圖7 驗(yàn)證SysTick中斷可用的樣例結(jié)果
至此,也驗(yàn)證了中斷也可正確執(zhí)行。
總結(jié)
為了編譯可在QSPI Flash上運(yùn)行的可執(zhí)行文件,需要作出以下兩件事:
修改 Linker 文件,將 ROM 的位置和大小修改為 QSPI Flash 的映射地址和大小
修改源代碼中所有可能會(huì)影響訪問QSPI Flash的代碼,例如 GPIO 的配置,時(shí)鐘的配置等
可以發(fā)現(xiàn)編譯可在 QSPI Flash上運(yùn)行的可執(zhí)行文件并不難,因此可以輕松將應(yīng)用程序遷移到 QSPI Flash 里。
審核編輯:湯梓紅
-
FlaSh
+關(guān)注
關(guān)注
10文章
1642瀏覽量
148683 -
程序
+關(guān)注
關(guān)注
117文章
3796瀏覽量
81419 -
MDK
+關(guān)注
關(guān)注
4文章
209瀏覽量
32154 -
編譯
+關(guān)注
關(guān)注
0文章
661瀏覽量
33046 -
QSPI
+關(guān)注
關(guān)注
0文章
42瀏覽量
12248
原文標(biāo)題:靈動(dòng)微課堂 (第249講)|mm32-2nd-bootloader技術(shù)白皮書(5)——編譯可在QSPI Flash上運(yùn)行的程序
文章出處:【微信號(hào):MindMotion-MMCU,微信公眾號(hào):靈動(dòng)MM32MCU】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論