Bootloader
Function Implementation:在 ArtPi 的環境下,實現一個簡單的 BootLoader,該 BootLoader 實現了 QSPI 和 SDRAM 功能的初始化,使 App 可以運行在 QSPI 中,并且可以將 SDRAM 當做普通的內部 RAM 使用(但需要注意,仍需要添加 SCB_InvalidateDCache 和 SCB_CleanDCache 等函數來更新緩存,類似于對 AXI SRAM 的操作)。
BootLoader和App實現教程:安富萊_STM32-V7開發板_用戶手冊,含BSP驅動包設計(V3.5)
注意事項
在 BootLoader 中進行了 MPU 的配置,在 App 中,就無需重復配置;
在 BootLoader 中,最好禁用 I-Cache 和 D-Cache(實際上,我看了一下硬漢的部分代碼,實際上,并不強求一定要禁用 I-Cache 和 D-Cache,應該還是根據自己的需求來決定是開啟還是關閉);
在 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 中,在進入 main 函數前執行,因此在 main 函數中進行 Debug 可能無法發現此問題。(群友發現的問題)
此寄存器地址為 0x52004000,對應 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 節,我們主要關注以下內容:
FMCEN = 0:禁止 FMC 控制器,FMC_BCR2..4 寄存器的 FMCEN 位為“無關”位,只能通過 FMC_BCR1 寄存器使能 ;
在未注釋此行代碼時,FMC Bank1會被關閉(復位后啟用),阻止 24 \\mu s24μs 內的 FMC 的使用,這會導致 MemMange 錯誤,導致程序進入 MemMange_Handler(可能會被誤認為是 BootLoader 未成功跳轉,但其實是跳轉了,然后立即產生總線錯誤)。有趣的是,如果在 BootLoader 內,對 SDRAM 進行一次讀或寫操作,則不會產生該報警錯誤。
未進行讀寫操作,App 進入 MemMange_Handler
進行讀寫操作,App 不進入MemMange_Handler
在完成以上配置后,就可以在 App 中,像內置 RAM 一樣使用 SDRAM。
先在 LinkerScript 內添加以下內容(UNINIT 確保該內存區域不會被初始化為 0):
RW_IRAM7 0xC0000000 UNINIT 0x02000000 { ; RW data - 32MB SDRAM(0xC0000000)
*(.RAM_SDRAM)
}
使用如下:
uint32_t testValue attribute ((section(".RAM_SDRAM")));
-
FMC
+關注
關注
0文章
96瀏覽量
19741 -
SDRAM控制器
+關注
關注
0文章
28瀏覽量
8177 -
控制寄存器
+關注
關注
0文章
34瀏覽量
11511 -
QSPI接口
+關注
關注
0文章
14瀏覽量
3389 -
stm32h7
+關注
關注
0文章
37瀏覽量
1753
發布評論請先 登錄
相關推薦
評論