日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 综合教程 >内容正文

综合教程

【STM32H7教程】第82章 STM32H7的QSPI总线应用之QSPI Flash执行程序(BOOT+APP方式)

發布時間:2023/12/13 综合教程 27 生活家
生活随笔 收集整理的這篇文章主要介紹了 【STM32H7教程】第82章 STM32H7的QSPI总线应用之QSPI Flash执行程序(BOOT+APP方式) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

完整教程下載地址:http://www.armbbs.cn/forum.php?mod=viewthread&tid=86980

第82章 STM32H7的QSPI總線應用之QSPI Flash執行程序(BOOT+APP方式)

本章節為大家講解QSPI Flash執行程序。

82.1 初學者重要提示

82.2 下載算法存放位置

82.3 QSPI Flash的Bootloader說明

82.4 QSPI Flash的APP應用程序說明

82.5 QSPI Flash的APP應用程序調試下載配置

82.6 實驗例程說明

82.7 總結

82.1 初學者重要提示

QSPI Flash的相關知識點可以看第78章和79章。
操作本章配套例子前務必先將QSPI Flash的下載算法放到MDK安裝目錄。
QSPI Flash執行程序的BOOT和APP作用:

BOOT程序需要下載到內部Flash。主要用于跳轉到外部QSPI Flash執行程序。那么問題來了,我們可不可以不使用BOOT,上電就直接執行QSPI Flash的程序?不行,因為QSPI Flash不像內部Flash,無需初始化,上電就可以使用,而QSPI Flash不行。
APP應用程序要下載到QSPI Flash里面。APP應用程序可以在QSPI Flash里面執行主要是因為W25Q256支持XIP(Execution In Place),并且STM32H7的QSPI Flash支持內存映射。

82.2 下載算法存放位置

編譯例子:V7-060_QSPI Flash的MDK下載算法制作,生成的算法文件位于此路徑下:

生成算法文件后,需要大家將其存到到MDK安裝目錄,有兩個位置可以存放,任選其一,推薦第2種:

第1種:存放到MDK的STM32H7軟包安裝目錄里面:KeilSTM32H7xx_DFP2.6.0CMSISFlash(軟包版本不同,數值2.6.0不同)。
第2種:MDK的安裝目錄 ARMFlash里面。

82.3 QSPI Flash的Bootloader說明

Bootloader的實現比較簡單,需要大家將其下載到內部Flash。程序實現上主要注意以下兩點即可。

82.3.1 初始化QSPI Flash并設置內存映射模式

在bsp.c文件中初始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();
}

82.3.2 程序跳轉的實現

從內部Flash跳轉到外部QSPI Flash的實現代碼如下

1.    /*
2.    ******************************************************************************************************
3.    *    函 數 名: JumpToApp
4.    *    功能說明: 跳轉到應用JumpToApp
5.    *    形    參: 無
6.    *    返 回 值: 無
7.    ******************************************************************************************************
8.    */
9.    static void JumpToApp(void)
10.    {
11.        uint32_t i=0;
12.        void (*AppJump)(void);         /* 聲明一個函數指針 */
13.        __IO uint32_t AppAddr = 0x90000000;  /* APP 地址 */
14.        
15.    
16.        /* 關閉全局中斷 */
17.        DISABLE_INT(); 
18.        
19.        /* 設置所有時鐘到默認狀態,使用HSI時鐘 */
20.        HAL_RCC_DeInit();
21.        
22.        /* 關閉滴答定時器,復位到默認值 */
23.        SysTick->CTRL = 0;
24.        SysTick->LOAD = 0;
25.        SysTick->VAL = 0;
26.    
27.        /* 關閉所有中斷,清除所有中斷掛起標志 */
28.        for (i = 0; i < 8; i++)
29.        {
30.            NVIC->ICER[i]=0xFFFFFFFF;
31.            NVIC->ICPR[i]=0xFFFFFFFF;
32.        }    
33.    
34.        /* 使能全局中斷 */
35.        ENABLE_INT();
36.    
37.        /* 跳轉到應用程序,首地址是MSP,地址+4是復位中斷服務程序地址 */
38.        AppJump = (void (*)(void)) (*((uint32_t *) (AppAddr + 4)));
39.    
40.        /* 設置主堆棧指針 */
41.        __set_MSP(*(uint32_t *)AppAddr);
42.        
43.        /* 在RTOS工程,這條語句很重要,設置為特權級模式,使用MSP指針 */
44.        __set_CONTROL(0);
45.    
46.        /* 跳轉到系統BootLoader */
47.        AppJump(); 
48.    
49.        /* 跳轉成功的話,不會執行到這里,用戶可以在這里添加代碼 */
50.        while (1)
51.        {
52.    
53.        }
54.    }

這里把程序設計中的幾個關鍵地方做個說明:

第12行,聲明一個函數指針。
第13行,QSPI Flash地址在0x90000000。
第20行,此函數比較省事,可以方便的設置H7所有時鐘到復位值,內部時鐘使用HSI。
第23到25行,設置滴答定時器到復位值。
第28到32行,清除所有中斷掛起標志并關閉中斷,這里是直接通過一個for循環設置了NVIC所有配置位,共8組。

第38行,將系統bootLoader的中斷復位服務程序的入口地址賦給第12行聲明的函數,用戶執行這個函數時,就會直接跳轉過去。
第41行,設置主堆棧指針位置,即QSPI Flash應用程序首地址存儲的就是棧地址。
第44行,這個設置在RTOS應用程序中比較重要,因為基于Cortex-M內核的RTOS任務堆?;径际鞘褂镁€程堆棧指針PSP。但系統bootLoader使用的是主堆棧指針MSP,所以務必要設置下,同時讓M內核工作于特權級。此寄存器的作用如下:

第47行,跳轉到系統bootLoader。

82.4 QSPI Flash的APP應用程序說明

APP應用程序是由第53章配套例子:V7-033_LCD的漢字小字庫和全字庫制作 簡單修改而來,主要修改如下兩個地方:

82.4.1 設置Flash地址

設置Flash地址為QSPI Flash首地址0x90000000:

82.4.2 設置中斷向量表

在main函數最開始就設置中斷向量表到QSPI Flash首地址0x90000000,也可以按照本教程第28章的說明,將中斷向量表設置到DTCM里面。

int main(void)
{
    uint16_t ucBright;           /* 背光亮度(0-255) */
    uint8_t ucKeyCode;        /* 按鍵代碼 */
    uint8_t ucStatus;        /* 主程序狀態字 */
    uint8_t fRefresh;        /* 刷屏請求標志,1表示需要刷新 */
    
    SCB->VTOR = 0x90000000; /* 設置中斷向量表地址 */
    
    bsp_Init();    /* 硬件初始化 */
    PrintfLogo();    /* 打印例程名稱和版本等信息 */
    PrintfHelp();    /* 打印操作提示 */

省略未寫

}

82.5 QSPI Flash的APP應用程序調試下載配置

將下面兩個地方配置后,就可以像使用內部Flash一樣使用QSPI Flash進行調試了。

82.5.1 下載配置

注意這里一定要夠大,否則會提示算法文件無法加載:

我們這里是將其加到DTCM中,即首地址為0x20000000,大家也可以存儲到任意其它RAM地址,只要空間還夠加載算法文件即可。推薦使用AXI SRAM(地址0x24000000),因為這塊RAM空間足夠大。

如果要下載程序到QSPI Flash里面,需要做如下配置:

82.5.2 調試配置

注意這里一定要夠大,否則會提示算法文件無法加載:

我們這里是將其加到DTCM中,即首地址為0x20000000,大家也可以存儲到任意其它RAM地址,只要空間還夠加載算法文件即可。

如果要做調試下載,需要做如下配置:


82.5.3 程序調試效果

APP應用程序調試效果如下:

82.6 實驗例程說明

本章配套了兩個例子:

V7-062_QSPI Flash運行程序(Bootloader)。
V7-063_QSPI Flash運行程序(用戶APP)。

Bootloader例子需要大家先下載到內部Flash里面,然后按照本章第5小節的說明配置后,就可以像使用內部Flash一樣調試下載QSPI Flash了。

82.7 總結

本章節就為大家講解這么,為了熟練掌握,建議大家是操作練習下。

總結

以上是生活随笔為你收集整理的【STM32H7教程】第82章 STM32H7的QSPI总线应用之QSPI Flash执行程序(BOOT+APP方式)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。