Bootloader
Function Implementation:在 ArtPi 的環(huán)境下,實(shí)現(xiàn)一個(gè)簡單的 BootLoader,該 BootLoader 實(shí)現(xiàn)了 QSPI 和 SDRAM 功能的初始化,使 App 可以運(yùn)行在 QSPI 中,并且可以將 SDRAM 當(dāng)做普通的內(nèi)部 RAM 使用(但需要注意,仍需要添加 SCB_InvalidateDCache 和 SCB_CleanDCache 等函數(shù)來更新緩存,類似于對 AXI SRAM 的操作)。
BootLoader和App實(shí)現(xiàn)教程:安富萊_STM32-V7開發(fā)板_用戶手冊,含BSP驅(qū)動包設(shè)計(jì)(V3.5)
注意事項(xiàng)
在 BootLoader 中進(jìn)行了 MPU 的配置,在 App 中,就無需重復(fù)配置;
在 BootLoader 中,最好禁用 I-Cache 和 D-Cache(實(shí)際上,我看了一下硬漢的部分代碼,實(shí)際上,并不強(qiáng)求一定要禁用 I-Cache 和 D-Cache,應(yīng)該還是根據(jù)自己的需求來決定是開啟還是關(guān)閉);
在 BootLoader 中,配置了 FMC,在 App 中,需要注釋以下這段代碼:
/*
Disable the FMC bank1 (enabled after reset).
This, prevents CPU speculation access on this bank which blocks the use of FMC during
24us. During this time the others FMC master (such as LTDC) cannot use it!
*/
// FMC_Bank1_R->BTCR[0] = 0x000030D2;

此段代碼位于 system_stm32h7xx.h 中,在進(jìn)入 main 函數(shù)前執(zhí)行,因此在 main 函數(shù)中進(jìn)行 Debug 可能無法發(fā)現(xiàn)此問題。(群友發(fā)現(xiàn)的問題)
此寄存器地址為 0x52004000,對應(yīng) SRAM/NOR-Flash 片選控制寄存器 1(FMC_BCR1)。
#define PERIPH_BASE (0x40000000UL) /*!< Base address of : AHB/APB Peripherals */
#define D1_AHB1PERIPH_BASE (PERIPH_BASE + 0x12000000UL)
#define FMC_R_BASE (D1_AHB1PERIPH_BASE + 0x4000UL)
/* !< FMC Banks registers base address */
#define FMC_Bank1_R_BASE (FMC_R_BASE + 0x0000UL)
#define FMC_Bank1_R ((FMC_Bank1_TypeDef *) FMC_Bank1_R_BASE)

FMC_BCR1 = 0x000030D2; 的作用可以參考 RM0433 22.7.6 節(jié),我們主要關(guān)注以下內(nèi)容:
FMCEN = 0:禁止 FMC 控制器,F(xiàn)MC_BCR2..4 寄存器的 FMCEN 位為“無關(guān)”位,只能通過 FMC_BCR1 寄存器使能 ;
在未注釋此行代碼時(shí),F(xiàn)MC Bank1會被關(guān)閉(復(fù)位后啟用),阻止 24 \\mu s24μs 內(nèi)的 FMC 的使用,這會導(dǎo)致 MemMange 錯誤,導(dǎo)致程序進(jìn)入 MemMange_Handler(可能會被誤認(rèn)為是 BootLoader 未成功跳轉(zhuǎn),但其實(shí)是跳轉(zhuǎn)了,然后立即產(chǎn)生總線錯誤)。有趣的是,如果在 BootLoader 內(nèi),對 SDRAM 進(jìn)行一次讀或?qū)懖僮鳎瑒t不會產(chǎn)生該報(bào)警錯誤。
未進(jìn)行讀寫操作,App 進(jìn)入 MemMange_Handler

進(jìn)行讀寫操作,App 不進(jìn)入MemMange_Handler

在完成以上配置后,就可以在 App 中,像內(nèi)置 RAM 一樣使用 SDRAM。
先在 LinkerScript 內(nèi)添加以下內(nèi)容(UNINIT 確保該內(nèi)存區(qū)域不會被初始化為 0):
RW_IRAM7 0xC0000000 UNINIT 0x02000000 { ; RW data - 32MB SDRAM(0xC0000000)
*(.RAM_SDRAM)
}
使用如下:
uint32_t testValue attribute ((section(".RAM_SDRAM")));
-
FMC
+關(guān)注
關(guān)注
0文章
115瀏覽量
20767 -
SDRAM控制器
+關(guān)注
關(guān)注
0文章
29瀏覽量
10090 -
控制寄存器
+關(guān)注
關(guān)注
0文章
34瀏覽量
11851 -
QSPI接口
+關(guān)注
關(guān)注
0文章
14瀏覽量
3664 -
stm32h7
+關(guān)注
關(guān)注
0文章
37瀏覽量
1753
發(fā)布評論請先 登錄
介紹STM32H7內(nèi)置的系統(tǒng)bootloader的基礎(chǔ)知識
STM32H7系列芯片及bootloader引導(dǎo)程序
Stm32的bootloader和App的編寫注意事項(xiàng)有哪些?
【STM32H7教程】第19章 STM32H7的GPIO應(yīng)用之按鍵FIFO
STM32H7學(xué)習(xí)之路繼續(xù)(stm32H7系列3) GPIO
【STM32H7教程】第21章 STM32H7的NVIC中斷分組和配置(重要)
"STM32H7學(xué)習(xí)繼續(xù)(STM32H7系列5)第十七章比較實(shí)用,以后寫程序的時(shí)候會用到"
【STM32H7教程】第8章 STM32H7的終極調(diào)試組件Event Recorder
【STM32H7教程】第14章 STM32H7的電源,復(fù)位和時(shí)鐘系統(tǒng)
STM32H750_FMC_SDRAM 初始化流程總結(jié)
STM32H7雙核CM4作為Master初始化系統(tǒng)
STM32H7實(shí)現(xiàn)BootLoader內(nèi)SDRAM的初始化注意事項(xiàng)
評論