完整教程下載地址:http://www.armbbs.cn/forum.php?mod=viewthread&tid=86980
第83章 STM32H7的內部Flash和QSPI Flash都運行程序的混合方式(強烈推薦)
本章節為大家講解內部Flash和外部QSPI Flash都運行程序的混合方式。
83.1 初學者重要提示
83.2 內部Fkash和QSPI Flash混合執行程序的優勢
83.3 下載算法存儲存放位置
83.4 內部Flash和QSPI Flash混合執行程序說明
83.5 內部Flash和QSPI Flash程序調試下載配置
83.6 實驗例程說明
83.7 總結
83.1 初學者重要提示
- QSPI Flash的相關知識點可以看第78章和79章。
- 操作本章配套例子前務必先將QSPI Flash的下載算法放到MDK安裝目錄。
- 本章節與第28章的時間關鍵代碼在ITCM執行的設置思路是一樣的,可以讓大家對本章節的方法有個更全面的認識。
83.2 內部Flash和QSPI Flash混合執行程序的優勢
現在大家使用H750或H743在外置QSPI Flash執行程序,都傾向於制作個BOOT,再制作一個運行在外置QSPI Flash的APP程序。即本教程第82章講解的內容。
本章要實現的這種方式對於我們想外置QSPI Flash運行程序,在調試測試階段更加方便,甚至是項目使用,可以性能最大化。
83.3 下載算法存放位置
編譯例子:V7-060_QSPI Flash的MDK下載算法制作,生成的算法文件位於此路徑下:
生成算法文件后,需要大家將其存到到MDK安裝目錄,有兩個位置可以存放,任選其一,推薦第2種:
- 第1種:存放到MDK的STM32H7軟包安裝目錄里面:\Keil\STM32H7xx_DFP\2.6.0\CMSIS\Flash(軟包版本不同,數值2.6.0不同)。
- 第2種:MDK的安裝目錄 \ARM\Flash里面。
83.4 內部Flash和QSPI Flash混合執行程序說明
混合程序的設置注意以下兩點即可。
83.4.1 初始化QSPI Flash並設置內存映射模式
在bsp.c文件中初始在bsp.c文件中初始QSPI Flash並設置為內存映射模式。注意,配置好時鍾后,優先初始化QSPI Flash並設置為內存映射模式:
/* ********************************************************************************************************* * 函 數 名: bsp_Init * 功能說明: 初始化所有的硬件設備。該函數配置CPU寄存器和外設的寄存器並初始化一些全局變量。只需要調用一次 * 形 參:無 * 返 回 值: 無 ********************************************************************************************************* */ void bsp_Init(void) { /* 配置MPU */ MPU_Config(); /* 使能L1 Cache */ CPU_CACHE_Enable(); /* STM32H7xx HAL 庫初始化,此時系統用的還是H7自帶的64MHz,HSI時鍾: - 調用函數HAL_InitTick,初始化滴答時鍾中斷1ms。 - 設置NVIV優先級分組為4。 */ HAL_Init(); /* 配置系統時鍾到400MHz - 切換使用HSE。 - 此函數會更新全局變量SystemCoreClock,並重新配置HAL_InitTick。 */ SystemClock_Config(); /* Event Recorder: - 可用於代碼執行時間測量,MDK5.25及其以上版本才支持,IAR不支持。 - 默認不開啟,如果要使能此選項,務必看V7開發板用戶手冊第8章 */ #if Enable_EventRecorder == 1 /* 初始化EventRecorder並開啟 */ EventRecorderInitialize(EventRecordAll, 1U); EventRecorderStart(); #endif /* 針對不同的應用程序,添加需要的底層驅動模塊初始化函數 */ bsp_InitQSPI_W25Q256(); /* 配置SPI總線 */ QSPI_MemoryMapped(); bsp_InitDWT(); /* 初始化DWT時鍾周期計數器 */ bsp_InitKey(); /* 按鍵初始化,要放在滴答定時器之前,因為按鈕檢測是通過滴答定時器掃描 */ bsp_InitTimer(); /* 初始化滴答定時器 */ bsp_InitUart(); /* 初始化串口 */ bsp_InitExtIO(); /* 初始化FMC總線74HC574擴展IO. 必須在 bsp_InitLed()前執行 */ bsp_InitLed(); /* 初始化LED */ bsp_InitExtSDRAM(); /* 初始化SDRAM */ bsp_InitI2C(); /* 初始化I2C總線 */ TOUCH_InitHard(); /* 初始化觸摸芯片,LCD面板型號的檢查也在此函數,所以要在函數LCD_InitHard前調用 */ LCD_InitHard(); /* 初始化LCD */ }
83.4.2 設置運行在內部Flash和QSPI Flash的程序
由於我們要把QSPI Flash初始化並設置為內存映射模式后才可以使用QSPI Flash運行程序,所以要在QSPI Flash運行程序之前的所有操作都在內部Flash里面實現,主要是滴答定時器,RCC,QSPI和HAL庫等相關配置。其它所有程序都可以在外部QSPI Flash執行:
83.5 內部Flash和QSPI Flash程序調試下載配置
將下面兩個地方配置后,就可以像使用內部Flash一樣使用QSPI Flash進行調試了。並且這種方式可以方便的調試程序,內部Flash和外部Flash都做調試。
83.5.1 下載配置
注意這里一定要夠大,否則會提示算法文件無法加載:
我們這里是將其加到DTCM中,即首地址為0x20000000,大家也可以存儲到任意其它RAM地址,只要空間還夠加載算法文件即可。推薦使用AXI SRAM(地址0x24000000),因為這塊RAM空間足夠大。
如果要下載程序到內部Flash和外部QSPI Flash里面,需要做如下配置,兩個下載算法都要添加進來:
83.5.2 調試配置
注意這里一定要夠大,否則會提示算法文件無法加載:
我們這里是將其加到DTCM中,即首地址為0x20000000,大家也可以存儲到任意其它RAM地址,只要空間還夠加載算法文件即可。
如果要做調試下載,需要做如下配置:
83.5.3 程序調試效果
調試效果如下:
83.6 實驗例程說明
本章節配套例子:V7-064_內部Flash和QSPI Flash都運行程序的混合方式,無需單獨制作BOOT和APP(強烈推薦)
編譯此程序彈出的警告不用管,可以選擇屏蔽此警告:
83.7 總結
本章節就為大家講解這么,為了熟練掌握,大家可以嘗試自己實現一個內部Flash和外部Flash混合運行的程序。