應用筆記AN12077 解釋了如何通過應用程序啟動代碼中的軟件重新分配FlexRAM。下面將進一步詳細說明進行這些修改的方法。
RT | Internal SRAM | FlexRAM |
---|---|---|
RT1010 | Up to128KB | Up to128KB |
RT1015 | Up to128KB | Up to128KB |
RT1020 | Up to256KB | Up to256KB |
RT1050 | Up to 512 KB | Up to 512 KB |
RT1060 | Up to 1MB | Up to 512 KB |
RT1064 | Up to 1MB | Up to 512 KB |
對于RT106x系列,1MB的內部SRAM中只有512 KB可以通過FlexRAM重新分配為DTCM、ITCM和OCRAM。剩余的512 KB來自OCRAM,無法重新分配。對于所有其他RT10xx,可以將整個內部SRAM重新分配為DTCM、ITCM和OCRAM。應用筆記AN12077 第3.1.3.1節解釋了重新分配FlexRAM時的大小限制。值得一提的是,所有RT10xx部件中的ROM引導加載程序都使用OCRAM,因此在重新分配FlexRAM時,應該保留一些OCRAM,這不適用于RT106x,因為將始終擁有512 KB的OCRAM,無法重新分配。
MCUXpresso IDE中的實現
首先,需要將SDK示例導入MCUXpresso IDE工作區。為RT1050-EVKB導入了igpio_led_output示例。如果編譯此項目,將看到RT1050-EVKB上FlexRAM的默認配置如下:
SRAM_DTC:128 KB,SRAM_ITC:128 KB,SRAM_OC:256 KB
現在需要轉到文件startup_mimxrt1052.c中的復位處理程序。重新分配FlexRAM必須在配置FlexRAM之前完成,這就是為什么要在復位處理程序中完成的原因。需要修改以重新分配FlexRAM的寄存器是IOMUX _GPR_GPR16和IOMUX _GPR _GPR17。
Register | Address |
---|---|
IOMUXC_GPR_GPR16 | 0x400AC040 |
IOMUXC_GPR_GPR17 | 0x400AC044 |
需要確定如何重新分配FlexRAM,以查看需要加載到寄存器IOMUXC_GPR_GPR17中的值。如果希望具有以下配置:
SRAM_DTC | 256 KB |
SRAM_ITC | 128 KB |
SRAM_OC | 128KB |
以下對IOMUXC_GPR_GPR17寄存器的解釋:
需要加載到寄存器的值是0xAAAAFF55。其中,前4個存儲塊對應于128KB的SRAM_OC,接下來的4個存儲塊對應于128 KB的SRAM_ITC,最后8個存儲塊是256KB的SRAM-DTC。現在就可以開始在ResetISR處理程序中編寫代碼了。首先要做的是將新值加載到寄存器IOMUXC_GPR_GPR17中。之后,需要配置寄存器IOMUXC_GPR_GPR16,以指定FlexRAM存儲體配置應取自寄存器IOMUX _GPR_GPR 17,而不是熔絲Fuse。然后,如果在FlexRAM的新配置中,SRAM_DTC或SRAM_ITC的大小為0,則需要禁用寄存器IOMUXC_GPR_GPR16中的這些存儲器。代碼如下所示:
void ResetISR(void) { // Disable interrupts __asm volatile ("cpsid i"); /* Reallocating the FlexRAM */ __asm (".syntax unified " "LDR R0, =0x400ac044 "http://Address of register IOMUXC_GPR_GPR17 "LDR R1, =0xaaaaff55 "http://FlexRAM configuration DTC = 265KB, ITC = 128KB, OC = 128KB "STR R1,[R0] " "LDR R0,=0x400ac040 "http://Address of register IOMUXC_GPR_GPR16 "LDR R1,[R0] " "ORR R1,R1,#4 "http://The 4 corresponds to setting the FLEXRAM_BANK_CFG_SEL bit in register IOMUXC_GPR_GPR16 "STR R1,[R0] " #ifdef FLEXRAM_ITCM_ZERO_SIZE "LDR R0,=0x400ac040 "http://Address of register IOMUXC_GPR_GPR16 "LDR R1,[R0] " "AND R1,R1,#0xfffffffe "http://Disabling SRAM_ITC in register IOMUXC_GPR_GPR16 "STR R1,[R0] " #endif #ifdef FLEXRAM_DTCM_ZERO_SIZE "LDR R0,=0x400ac040 "http://Address of register IOMUXC_GPR_GPR16 "LDR R1,[R0] " "AND R1,R1,#0xfffffffd "http://Disabling SRAM_DTC in register IOMUXC_GPR_GPR16 "STR R1,[R0] " #endif ".syntax divided "); #if defined (__USE_CMSIS) // If __USE_CMSIS defined, then call CMSIS SystemInit code SystemInit();
如果編譯項目,將看到控制臺上顯示的內存分布仍然是默認配置。這是因為修改了Reset處理程序以重新分配FlexRAM,但沒有修改鏈接器文件以匹配這些新大小。為此,需要轉到項目的屬性。進入屬性后,需要轉到C/C++構建->MCU設置。一旦進入MCU設置,需要修改SRAM內存的大小以匹配新配置。
在進行這些更改后,如果編譯項目,將看到控制臺中顯示的內存分布與現在新大小相匹配。
需要修改內存保護單元(MPU)以匹配這些新的內存大小。為此,需要轉到文件板中的函數BOARD_ConfigMPU.c。在該函數中,需要找到分別對應于SRAM_ITC、SRAM_DTC和SRAM_OC的區域5、6和7。與寄存器IOMUXC_GPR_GPR14相同,如果內存的新大小不是32、64、128、256或512,則需要選擇下一個更大的數字。配置應如下所示:
/* Region 5 setting: Memory with Normal type, not shareable, outer/inner write back */ MPU->RBAR = ARM_MPU_RBAR(5, 0x00000000U); MPU->RASR = ARM_MPU_RASR(0, ARM_MPU_AP_FULL, 0, 0, 1, 1, 0, ARM_MPU_REGION_SIZE_128KB); /* Region 6 setting: Memory with Normal type, not shareable, outer/inner write back */ MPU->RBAR = ARM_MPU_RBAR(6, 0x20000000U); MPU->RASR = ARM_MPU_RASR(0, ARM_MPU_AP_FULL, 0, 0, 1, 1, 0, ARM_MPU_REGION_SIZE_256KB); /* Region 7 setting: Memory with Normal type, not shareable, outer/inner write back */ MPU->RBAR = ARM_MPU_RBAR(7, 0x20200000U); MPU->RASR = ARM_MPU_RASR(0, ARM_MPU_AP_FULL, 0, 0, 1, 1, 0, ARM_MPU_REGION_SIZE_128KB);
最后,需要將堆棧放在DTCM內存的開頭。為此,需要轉到項目的屬性。從那里,必須用C/C++構建和管理Linker腳本。
然后,需要在ResetISR函數中再添加兩條匯編指令。我們必須在匯編代碼的開頭添加以下兩條指令:
這些就是在啟動期間重新分配FlexRAM所需的所有更改。
調試會話: 為了驗證剛才所做的所有修改是否正確,將啟動調試會話。一旦到達main,在運行應用程序之前,將轉到外設視圖查看寄存器IOMUX _GPR_GPR16和IOMUX _GPR _GPR17,并驗證值是否正確。如下圖所示,在寄存器IOMUXC_GPR_GPR16中,將FLEXRAM_BANK_CFG_SEL配置為1,以使用寄存器IOMUX _GPR_GPRS17配置FLEXRAM。
最后,在寄存器IOMUXC_GPR_GPR17中,我們可以看到對應于新配置的值0xAAAAFF55。
通過熔絲重新分配FlexRAM
上述操作是如何通過在復位處理程序中編寫一些代碼來通過軟件重新分配FlexRAM。此過程工作正常,使用此方法測試可以配置不同大小RAM,但一旦找到應用程序的正確配置,建議通過熔絲配置這些新大小,而不是使用寄存器IOMUX _GPR_GPR17。在代碼中重新配置FlexRAM有很多危險區域。這幾乎都歸結為這樣一個事實:寫入RAM的任何代碼/數據/堆棧信息都可能在重新分配期間改變位置。這就是為什么一旦找到正確的配置,就應該通過熔絲進行應用。如果使用Fuse來配置FlexRAM,那么就不必擔心代碼和數據的移動,因為Fuse 設置被應用為硬件默認設置。記住,一旦燒了熔絲,就沒有退路了!這就是為什么首先通過軟件方法嘗試配置很重要。燒完熔絲后,無需修改復位處理程序,只需修改MPU以更改我們之前看到的區域大小和項目的MCU設置,以匹配通過熔絲配置的新內存大小。
負責FlexRAM配置的熔絲為Default_FlexRAM_Part,此熔絲的地址為0x6D0[15:13]。可以在參考手冊的Fusemap一章中找到有關此保險絲和不同配置的更多信息。要燒熔絲,建議使用blhost或MCUBootUtility。兩個工具的下載鏈接如下:
https://www.nxp.com/webapp/sps/download/license.jsp?colCode=blhost_2.6.2&appType=file1&location=null&DOWNLOAD_ID=null
https://github.com/JayHeng/NXP-MCUBootUtility
ResetISR.c參考代碼:
審核編輯:湯梓紅
-
寄存器
+關注
關注
31文章
5363瀏覽量
121177 -
sram
+關注
關注
6文章
768瀏覽量
114888 -
mcuxpresso
+關注
關注
1文章
41瀏覽量
4236
原文標題:重新分配 FlexRAM
文章出處:【微信號:嵌入式 MCU,微信公眾號:嵌入式 MCU】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論