Bootloader
Function Implementation:在 ArtPi 的環(huán)境下,實(shí)現(xiàn)一個(gè)簡(jiǎn)單的 BootLoader,該 BootLoader 實(shí)現(xiàn)了 QSPI 和 SDRAM 功能的初始化,使 App 可以運(yùn)行在 QSPI 中,并且可以將 SDRAM 當(dāng)做普通的內(nèi)部 RAM 使用(但需要注意,仍需要添加 SCB_InvalidateDCache 和 SCB_CleanDCache 等函數(shù)來(lái)更新緩存,類(lèi)似于對(duì) AXI SRAM 的操作)。
BootLoader和App實(shí)現(xiàn)教程:安富萊_STM32-V7開(kāi)發(fā)板_用戶手冊(cè),含BSP驅(qū)動(dòng)包設(shè)計(jì)(V3.5)
注意事項(xiàng)
在 BootLoader 中進(jìn)行了 MPU 的配置,在 App 中,就無(wú)需重復(fù)配置;
在 BootLoader 中,最好禁用 I-Cache 和 D-Cache(實(shí)際上,我看了一下硬漢的部分代碼,實(shí)際上,并不強(qiáng)求一定要禁用 I-Cache 和 D-Cache,應(yīng)該還是根據(jù)自己的需求來(lái)決定是開(kāi)啟還是關(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 可能無(wú)法發(fā)現(xiàn)此問(wèn)題。(群友發(fā)現(xiàn)的問(wèn)題)
此寄存器地址為 0x52004000,對(duì)應(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 位為“無(wú)關(guān)”位,只能通過(guò) FMC_BCR1 寄存器使能 ;
在未注釋此行代碼時(shí),F(xiàn)MC Bank1會(huì)被關(guān)閉(復(fù)位后啟用),阻止 24 \\mu s24μs 內(nèi)的 FMC 的使用,這會(huì)導(dǎo)致 MemMange 錯(cuò)誤,導(dǎo)致程序進(jìn)入 MemMange_Handler(可能會(huì)被誤認(rèn)為是 BootLoader 未成功跳轉(zhuǎn),但其實(shí)是跳轉(zhuǎn)了,然后立即產(chǎn)生總線錯(cuò)誤)。有趣的是,如果在 BootLoader 內(nèi),對(duì) SDRAM 進(jìn)行一次讀或?qū)懖僮鳎瑒t不會(huì)產(chǎn)生該報(bào)警錯(cuò)誤。
未進(jìn)行讀寫(xiě)操作,App 進(jìn)入 MemMange_Handler
進(jìn)行讀寫(xiě)操作,App 不進(jìn)入MemMange_Handler
在完成以上配置后,就可以在 App 中,像內(nèi)置 RAM 一樣使用 SDRAM。
先在 LinkerScript 內(nèi)添加以下內(nèi)容(UNINIT 確保該內(nèi)存區(qū)域不會(huì)被初始化為 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文章
96瀏覽量
19758 -
SDRAM控制器
+關(guān)注
關(guān)注
0文章
28瀏覽量
8188 -
控制寄存器
+關(guān)注
關(guān)注
0文章
34瀏覽量
11523 -
QSPI接口
+關(guān)注
關(guān)注
0文章
14瀏覽量
3408 -
stm32h7
+關(guān)注
關(guān)注
0文章
37瀏覽量
1753
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論