完整教程下載地址: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軟包安裝目錄里面:\Keil\STM32H7xx_DFP\2.6.0\CMSIS\Flash(軟包版本不同,數值2.6.0不同)。
- 第2種:MDK的安裝目錄 \ARM\Flash里面。
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 總結
本章節就為大家講解這么,為了熟練掌握,建議大家是操作練習下。