設(shè)計(jì)秘笈—在 STM32F7x0 超值系列和 STM32H750 超值系列微控制器上執(zhí)行外部存儲(chǔ)器代碼
引言?
因?yàn)閷?duì)能夠支持新功能和復(fù)雜功能的應(yīng)用需求不斷上升,對(duì)配備更大閃存區(qū)的設(shè)備的需求也在增加。?
使用外部閃存可以提供具有近似性能水平的更高存儲(chǔ)能力,同時(shí)為增加閃存區(qū)的需求提供一種經(jīng)濟(jì)劃算的解決方案。?
這樣,基于STM32F7x0 超值系列和 STM32H750 超值系列開(kāi)發(fā)的設(shè)備能夠以更小的內(nèi)部閃存區(qū)來(lái)應(yīng)對(duì)市場(chǎng)需求。?
本文詳細(xì)描述了在基于STM32超值系列開(kāi)發(fā)的設(shè)備上,從外部存儲(chǔ)器執(zhí)行代碼構(gòu)建應(yīng)用程序所需的步驟,并講解了如何從內(nèi)部閃存啟動(dòng),然后跳轉(zhuǎn)到片外存儲(chǔ)器的用戶程序去執(zhí)行。?
1、概述
本文檔適用于基于 Arm?的器件。?
提示:Arm 是 Arm Limited(或其子公司)在美國(guó)和/或其他地區(qū)的注冊(cè)商標(biāo)。
2、外部存儲(chǔ)器代碼執(zhí)行概述?
2.1 外部存儲(chǔ)器代碼執(zhí)行原則?
STM32CubeF7 v1.12.0和STM32CubeH7 v1.3.0固件包提供多個(gè)應(yīng)用程序,用于演示如何從內(nèi)部閃存啟動(dòng)以及如何配置外部存儲(chǔ)器并跳轉(zhuǎn)到用戶應(yīng)用程序(位于外部存儲(chǔ)器上)。其中有兩個(gè)用例,XiP和BootROM,可用于外部存儲(chǔ)器代碼執(zhí)行。?
XiP 用例旨在從外部閃存(QSPI 或 FMC-NOR 閃存)“芯片內(nèi)執(zhí)行”。用戶應(yīng)用程序代碼應(yīng)鏈接到目標(biāo)執(zhí)行存儲(chǔ)器地址(外部 QSPI 或 FMC-NOR 閃存)。
BootROM用例旨在演示如何從內(nèi)部閃存啟動(dòng),配置外部RAM存儲(chǔ)器(SDRAM 或 SRAM),將用戶應(yīng)用程序二進(jìn)制文件從代碼存儲(chǔ)區(qū)域(SDCARD 或 SPI-Flash 存儲(chǔ)器)復(fù)制到外部 SDRAM 或外部SRAM,然后跳轉(zhuǎn)到用戶應(yīng)用程序。用戶應(yīng)用程序代碼應(yīng)鏈接到目標(biāo)執(zhí)行存儲(chǔ)器地址(外部 SDRAM 或 SRAM)。?
下表中所述的應(yīng)用程序可在固件包中的\Applications\ExtMem_CodeExecution 路徑下獲得,供下列板使用:?
STM32F723E-Discovery板針對(duì)STM32F730 器件?
STM32F756G_EVAL板針對(duì)STM32F750 器件?
STM32H743I_EVAL板針對(duì)STM32H750 器件

外部存儲(chǔ)器啟動(dòng)應(yīng)用程序負(fù)責(zé)初始化所需資源,以使外部存儲(chǔ)器隨時(shí)可用。該應(yīng)用程序根據(jù)用戶配置初始化所需資源(參見(jiàn) 第 3.3 節(jié)配置)。
外部存儲(chǔ)器啟動(dòng)應(yīng)用程序必須設(shè)置主堆棧指針,并將應(yīng)用程序配置為在外部存儲(chǔ)器上執(zhí)行。該類(lèi)型啟動(dòng)方案支持大小可調(diào)的用戶應(yīng)用程序。
外部存儲(chǔ)器啟動(dòng)應(yīng)用程序確保在跳到用戶應(yīng)用程序之前重置或釋放安裝階段之后不再需要的任何資源。下圖展示了該啟動(dòng)方案:

2.2 外部存儲(chǔ)器啟動(dòng)應(yīng)用程序描述?
外部存儲(chǔ)器啟動(dòng)應(yīng)用程序包含STM32CubeF7/H7包上的一組源文件,這些定制的源文件可以匹配每個(gè)硬件平臺(tái)支持的配置。
下圖顯示了所有受支持配置的所有文件超集示例。

3、支持的啟動(dòng)模型?
該應(yīng)用程序支持兩種執(zhí)行方式:
支持芯片內(nèi)執(zhí)行(支持 XiP)?
支持 BootROM
用戶必須通過(guò)修改 memory.h 頭文件來(lái)選擇匹配需求的配置。
3.1 支持芯片內(nèi)執(zhí)行(XiP)?
XiP 模型基于直接從用于代碼存儲(chǔ)的外部非易失性存儲(chǔ)器執(zhí)行代碼。該執(zhí)行模型需要內(nèi)存映射支持,以允許 CPU 直接訪問(wèn)代碼以執(zhí)行用戶應(yīng)用程序。XiP 模型可通過(guò) FMC/QSPI 接口在外部 NOR/QSPI 閃存上使用。?
外部存儲(chǔ)器啟動(dòng)應(yīng)用程序基于 memory.h 文件中的用戶配置對(duì)下列易失存儲(chǔ)器之一進(jìn)行配置:SDRAM、SRAM、 PSRAM 或內(nèi)部 SRAM。在該模型中,易失性存儲(chǔ)器僅用于數(shù)據(jù)訪問(wèn)。
下面的流程圖說(shuō)明了 XiP 模型的操作流程。

3.2 支持 BootROM BootROM?
模型基于從選定的易失性存儲(chǔ)器中執(zhí)行代碼。當(dāng)二進(jìn)制數(shù)據(jù)存儲(chǔ)在非內(nèi)存映射模式的存儲(chǔ)器(比如 SDCARD)中時(shí),該執(zhí)行模型非常適合。當(dāng)二進(jìn)制數(shù)據(jù)存儲(chǔ)在低吞吐量的存儲(chǔ)器(比如 SPI-NOR(使用單線 QSPI 進(jìn)行仿真))中時(shí),此模型也適用。?
外部存儲(chǔ)器啟動(dòng)應(yīng)用程序基于 memory.h 文件中的用戶配置對(duì)下列其中兩個(gè)易失存儲(chǔ)器進(jìn)行配置:SDRAM、 SRAM、PSRAM 或內(nèi)部 SRAM。在該模型中,二進(jìn)制數(shù)據(jù)從一個(gè)非易失性存儲(chǔ)器復(fù)制到一個(gè)易失性存儲(chǔ)器,然后 由外部存儲(chǔ)器啟動(dòng)應(yīng)用程序執(zhí)行。第二個(gè)易失性存儲(chǔ)器用于數(shù)據(jù)。?
下面的流程圖說(shuō)明了 BootROM 模型的操作流程。

3.3 配置?
用戶配置由以下定義確定:?
DATA_AREA:用于指定用于數(shù)據(jù)存儲(chǔ)的易失性存儲(chǔ)器。支持的存儲(chǔ)器(取決于所用的板)有:
USE_EXTERNAL_SDRAM:外部SDRAM用于數(shù)據(jù)存儲(chǔ)
USE_EXTERNAL_SRAM:外部SRAM用于數(shù)據(jù)存儲(chǔ)?
USE_EXTERNAL_PSRAM:外部PSRAM用于數(shù)據(jù)存儲(chǔ)?
USE_INTERNAL_SRAM:內(nèi)部SRAM用于數(shù)據(jù)存儲(chǔ)?
CODE_AREA:用于指定用戶應(yīng)用程序的執(zhí)行位置。該區(qū)域可以是用于BootROM 方案的易失性存儲(chǔ)器,也可以是用于XiP方案的非易失性存儲(chǔ)器。支持的存儲(chǔ)器(取決于所用的硬件)有:?
XiP 模型:BINARY_AREA 必須是未定義的:?
USE_QSPI:QSPI Flash 用于代碼執(zhí)行?
USE_NOR:FMC-NOR Flash 用于代碼執(zhí)行?
BootROM 模型:BINARY_AREA 必須已定義?
USE_EXTERNAL_SDRAM:外部SDRAM 用于代碼執(zhí)行?
USE_EXTERNAL_SRAM:外部SRAM 用于代碼執(zhí)行?
USE_EXTERNAL_PSRAM:外部PSRAM 用于代碼執(zhí)行?
USE_INTERNAL_SRAM:內(nèi)部SRAM 用于代碼執(zhí)行?
BINARY_AREA:僅在 BootROM模型中定義。它用于指定包含用戶應(yīng)用程序的二進(jìn)制文件位置。根據(jù)所選配置,需要附加定義。支持的存儲(chǔ)器(取決于所用的硬件)有:
USE_SPI_NOR:SPI NOR Flash 用于二進(jìn)制存儲(chǔ)?
BINARY_BASE_OFFSET:SPI NOR Flash中的二進(jìn)制偏移?
BINARY_SIZE:二進(jìn)制圖像大小?
USE_SDCARD:SDCard 用于二進(jìn)制存儲(chǔ)?
BINARY_FILENAME:要執(zhí)行的二進(jìn)制文件名稱(chēng)?
用戶應(yīng)確保所選存儲(chǔ)器包含代碼和數(shù)據(jù),以至少覆蓋一個(gè)適當(dāng)?shù)挠脩魬?yīng)用程序啟動(dòng)。然后,用戶應(yīng)用程序可以初始化所需的任何其他存儲(chǔ)器。
3.4 外部存儲(chǔ)器部件總結(jié)?
下表總結(jié)了與所用板和啟動(dòng)模型對(duì)應(yīng)的外部存儲(chǔ)器部件編號(hào)。由于 STM32F7x0 超值系列和 STM32H750 超值系列器件沒(méi)有專(zhuān)用板,使用的板(與兼容器件)為:
STM32F723E-Discovery 用于模擬 STM32F730 器件。?
STM32F756G_EVAL 用于模擬 STM32F750 器件。?
STM32H743I_EVAL 用于模擬 STM32H750 器件。

4、需要考慮的資源約束?
初始化后,不再需要的任何資源(中斷、正在進(jìn)行的傳輸、未使用的引腳)都應(yīng)在跳到用戶應(yīng)用程序之前釋放。必須這樣做以避免額外的功耗,并限制對(duì)用戶應(yīng)用程序的任何干擾。特別是對(duì)于BootROM 模型,由于不再需要用于二進(jìn)制存儲(chǔ)的外設(shè),因此應(yīng)將其重置。?
用戶應(yīng)考慮外部存儲(chǔ)器啟動(dòng)應(yīng)用程序使用的資源數(shù)量,以確保外部存儲(chǔ)器接口保持正常運(yùn)行。資源約束與以下因素有關(guān):?
引腳分配和配置?
接口配置(不應(yīng)修改 QSPI IP 寄存器,F(xiàn)MC IP 寄存器即使是部分更新)?
配置 RCC,以避免 IP 重置時(shí)鐘,禁用和以有害的方式更新時(shí)鐘頻率/源。?
下面的引腳分配表作為參考,實(shí)際中根據(jù)使用的板進(jìn)行引腳選擇是必須的??筛鶕?jù)可用的替代功能選擇使用其他引腳。

下表總結(jié)了應(yīng)保持不變的資源。它列出了不應(yīng)修改的外設(shè)(或外設(shè)的一部分),以避免外部存儲(chǔ)不可用。不應(yīng)重置 上述外設(shè)或禁用時(shí)鐘,也不應(yīng)以可能改變其行為的方式進(jìn)行重新配置。?
提示?部分要素可能會(huì)根據(jù)為所選板選擇的外部存儲(chǔ)器啟動(dòng)應(yīng)用程序配置和平臺(tái)硬件而更改。

5、外部存儲(chǔ)器用戶應(yīng)用程序描述
5.1 需要的更新?
外部存儲(chǔ)器應(yīng)用程序基于特定的啟動(dòng)方案,該方案與標(biāo)準(zhǔn)的啟動(dòng)方案不同,支持從片上應(yīng)用到片外應(yīng)用的平穩(wěn)過(guò)渡。
當(dāng)應(yīng)用程序的位置發(fā)生變化時(shí),用戶必須進(jìn)行兩項(xiàng)更新:?
確保使用所需的鏈接器文件,并提供與所選啟動(dòng)選項(xiàng)相對(duì)應(yīng)的內(nèi)存映射。?
更新 VTOR 設(shè)置,以使用正確的地址。
5.2 加載和調(diào)試?
STM32F723E-Discovery、STM32756G_EVAL和STM32H743I_EVAL這三種板都有面向外部非易失性內(nèi)存的加載器。這些加載器在STM32CubeF7/H7中以如下形式提供:?
EWARM IDE 的補(bǔ)丁?
MDK-ARM IDE 的專(zhuān)用包?
XiP 模型提供了類(lèi)似于內(nèi)部 Flash 調(diào)試的無(wú)縫加載和調(diào)試體驗(yàn)。對(duì)于 SW4STM32 IDE,應(yīng)使用 STM32CubeProgrammer 在外部閃存上加載應(yīng)用程序。
在 BootROM 模型中,應(yīng)用程序被編譯和鏈接,以便從外部易失性內(nèi)存執(zhí)行:?
External SDRAM:鏈接器地址 0xD0000000 用于 STM32H750 超值系列,而 0xC0000000 用于 STM32F7x0 超值系列?
External SRAM:鏈接器地址 0x68000000 用于 STM32H750 超值系列和 STM32F7x0 超值系列?
然后將應(yīng)用程序二進(jìn)制文件存儲(chǔ)到 SPI_NOR 閃存或 SDCARD 中。由啟動(dòng)應(yīng)用程序?qū)⒂脩魬?yīng)用程序從存儲(chǔ)區(qū)域復(fù) 制到執(zhí)行 RAM 區(qū)域。?
因此,應(yīng)用程序的加載模式不能由 IDE(MDK-ARM 或 EWARM)外部存儲(chǔ) Flash 加載器處理(因?yàn)閼?yīng)用程序的鏈 接地址和存儲(chǔ)地址不同)。?
根據(jù) BINARY_AREA 定義(在啟動(dòng)應(yīng)用程序的 “memory.h” 文件中指定),該模型需要使用以下兩種不同的加載模式:?
SPI_NOR?
用戶應(yīng)用程序應(yīng)存儲(chǔ)在地址為0x90000000的SPI-NOR閃存中。必須使用 STM32CubeProgrammer 來(lái)完成。應(yīng)用程序的輸出應(yīng)為二進(jìn)制格式,以便能夠指定一個(gè)不同的加載地址,即 SPI-Flash 地址。詳細(xì)信息請(qǐng)參見(jiàn)下圖。
SDCARD?
用戶應(yīng)手動(dòng)將二進(jìn)制文件(構(gòu)建的輸出)復(fù)制到用于存儲(chǔ)用戶應(yīng)用程序的 SDCARD 中,然后將 SDCARD 插入評(píng)估板。
下圖顯示了加載和調(diào)試的步驟:

5.3 使用 EWARM IDE 進(jìn)行調(diào)試?
在調(diào)試從外部存儲(chǔ)器運(yùn)行的用戶應(yīng)用程序時(shí),需要特別注意EWARM IDE。EWARM 將 PC(程序計(jì)數(shù)器)的默認(rèn)CPU 重置值覆蓋為用戶應(yīng)用程序中給定的值(外部執(zhí)行存儲(chǔ)器中的地址值)。?
在該啟動(dòng)方案中,在執(zhí)行外部存儲(chǔ)器啟動(dòng)應(yīng)用程序之前,用戶應(yīng)用程序 PC 地址保持不可訪問(wèn)(因此外部存儲(chǔ)器已經(jīng)準(zhǔn)備好,并通過(guò)FMC 或 QSPI 映射內(nèi)存)。如果 EWARM 直接跳到用戶應(yīng)用程序的起始點(diǎn),就會(huì)生成hardfault。為了避免 hardfault,用戶應(yīng)在調(diào)試器選項(xiàng)中添加“--drv_reset_to_cpu_start”命令行,如下圖所示。此設(shè)置防止EWARM強(qiáng)制PC,并讓外部存儲(chǔ)器啟動(dòng)應(yīng)用程序在跳到用戶應(yīng)用程序之前配置外部存儲(chǔ)器。

6、性能特性
當(dāng)從外部存儲(chǔ)器執(zhí)行時(shí),由于外部閃存延遲和較長(zhǎng)的指令/數(shù)據(jù)路徑,性能會(huì)受到影響。如果使用STM32F7x0超值系列和STM32H750超值系列設(shè)備,Cortex-M7 L1-cache可以減少這種影響。?
下表總結(jié)了每個(gè) ROM / RAM 組合取得的 EEMBC? CoreMark?分?jǐn)?shù)。當(dāng)從內(nèi)部閃存執(zhí)行時(shí),可以獲得最佳性能。然而,當(dāng)從外部存儲(chǔ)器執(zhí)行時(shí),損失會(huì)顯著減少。?
這些數(shù)字說(shuō)明了從外部存儲(chǔ)器進(jìn)行操作時(shí)對(duì)CPU性能的影響。提供內(nèi)部 Flash 配置分?jǐn)?shù)作為參考。

