1. 程式人生 > 實用技巧 >【STM32H7教程】第83章 STM32H7的內部Flash和QSPI Flash都執行程式的混合方式(強烈推薦)

【STM32H7教程】第83章 STM32H7的內部Flash和QSPI Flash都執行程式的混合方式(強烈推薦)

完整教程下載地址: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 初學者重要提示

  1. QSPI Flash的相關知識點可以看第78章和79章。
  2. 操作本章配套例子前務必先將QSPI Flash的下載演算法放到MDK安裝目錄。
  3. 本章節與第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混合執行的程式。