應(yīng)用筆記AN12077 解釋了如何通過(guò)應(yīng)用程序啟動(dòng)代碼中的軟件重新分配FlexRAM。下面將進(jìn)一步詳細(xì)說(shuō)明進(jìn)行這些修改的方法。
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 |
對(duì)于RT106x系列,1MB的內(nèi)部SRAM中只有512 KB可以通過(guò)FlexRAM重新分配為DTCM、ITCM和OCRAM。剩余的512 KB來(lái)自O(shè)CRAM,無(wú)法重新分配。對(duì)于所有其他RT10xx,可以將整個(gè)內(nèi)部SRAM重新分配為DTCM、ITCM和OCRAM。應(yīng)用筆記AN12077 第3.1.3.1節(jié)解釋了重新分配FlexRAM時(shí)的大小限制。值得一提的是,所有RT10xx部件中的ROM引導(dǎo)加載程序都使用OCRAM,因此在重新分配FlexRAM時(shí),應(yīng)該保留一些OCRAM,這不適用于RT106x,因?yàn)閷⑹冀K擁有512 KB的OCRAM,無(wú)法重新分配。
MCUXpresso IDE中的實(shí)現(xiàn)
首先,需要將SDK示例導(dǎo)入MCUXpresso IDE工作區(qū)。為RT1050-EVKB導(dǎo)入了igpio_led_output示例。如果編譯此項(xiàng)目,將看到RT1050-EVKB上FlexRAM的默認(rèn)配置如下:
SRAM_DTC:128 KB,SRAM_ITC:128 KB,SRAM_OC:256 KB
現(xiàn)在需要轉(zhuǎn)到文件startup_mimxrt1052.c中的復(fù)位處理程序。重新分配FlexRAM必須在配置FlexRAM之前完成,這就是為什么要在復(fù)位處理程序中完成的原因。需要修改以重新分配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 |
以下對(duì)IOMUXC_GPR_GPR17寄存器的解釋:
需要加載到寄存器的值是0xAAAAFF55。其中,前4個(gè)存儲(chǔ)塊對(duì)應(yīng)于128KB的SRAM_OC,接下來(lái)的4個(gè)存儲(chǔ)塊對(duì)應(yīng)于128 KB的SRAM_ITC,最后8個(gè)存儲(chǔ)塊是256KB的SRAM-DTC。現(xiàn)在就可以開(kāi)始在ResetISR處理程序中編寫(xiě)代碼了。首先要做的是將新值加載到寄存器IOMUXC_GPR_GPR17中。之后,需要配置寄存器IOMUXC_GPR_GPR16,以指定FlexRAM存儲(chǔ)體配置應(yīng)取自寄存器IOMUX _GPR_GPR 17,而不是熔絲Fuse。然后,如果在FlexRAM的新配置中,SRAM_DTC或SRAM_ITC的大小為0,則需要禁用寄存器IOMUXC_GPR_GPR16中的這些存儲(chǔ)器。代碼如下所示:
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();
如果編譯項(xiàng)目,將看到控制臺(tái)上顯示的內(nèi)存分布仍然是默認(rèn)配置。這是因?yàn)樾薷牧薘eset處理程序以重新分配FlexRAM,但沒(méi)有修改鏈接器文件以匹配這些新大小。為此,需要轉(zhuǎn)到項(xiàng)目的屬性。進(jìn)入屬性后,需要轉(zhuǎn)到C/C++構(gòu)建->MCU設(shè)置。一旦進(jìn)入MCU設(shè)置,需要修改SRAM內(nèi)存的大小以匹配新配置。
在進(jìn)行這些更改后,如果編譯項(xiàng)目,將看到控制臺(tái)中顯示的內(nèi)存分布與現(xiàn)在新大小相匹配。
需要修改內(nèi)存保護(hù)單元(MPU)以匹配這些新的內(nèi)存大小。為此,需要轉(zhuǎn)到文件板中的函數(shù)BOARD_ConfigMPU.c。在該函數(shù)中,需要找到分別對(duì)應(yīng)于SRAM_ITC、SRAM_DTC和SRAM_OC的區(qū)域5、6和7。與寄存器IOMUXC_GPR_GPR14相同,如果內(nèi)存的新大小不是32、64、128、256或512,則需要選擇下一個(gè)更大的數(shù)字。配置應(yīng)如下所示:
/* 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內(nèi)存的開(kāi)頭。為此,需要轉(zhuǎn)到項(xiàng)目的屬性。從那里,必須用C/C++構(gòu)建和管理Linker腳本。
然后,需要在ResetISR函數(shù)中再添加兩條匯編指令。我們必須在匯編代碼的開(kāi)頭添加以下兩條指令:
這些就是在啟動(dòng)期間重新分配FlexRAM所需的所有更改。
調(diào)試會(huì)話: 為了驗(yàn)證剛才所做的所有修改是否正確,將啟動(dòng)調(diào)試會(huì)話。一旦到達(dá)main,在運(yùn)行應(yīng)用程序之前,將轉(zhuǎn)到外設(shè)視圖查看寄存器IOMUX _GPR_GPR16和IOMUX _GPR _GPR17,并驗(yàn)證值是否正確。如下圖所示,在寄存器IOMUXC_GPR_GPR16中,將FLEXRAM_BANK_CFG_SEL配置為1,以使用寄存器IOMUX _GPR_GPRS17配置FLEXRAM。
最后,在寄存器IOMUXC_GPR_GPR17中,我們可以看到對(duì)應(yīng)于新配置的值0xAAAAFF55。
通過(guò)熔絲重新分配FlexRAM
上述操作是如何通過(guò)在復(fù)位處理程序中編寫(xiě)一些代碼來(lái)通過(guò)軟件重新分配FlexRAM。此過(guò)程工作正常,使用此方法測(cè)試可以配置不同大小RAM,但一旦找到應(yīng)用程序的正確配置,建議通過(guò)熔絲配置這些新大小,而不是使用寄存器IOMUX _GPR_GPR17。在代碼中重新配置FlexRAM有很多危險(xiǎn)區(qū)域。這幾乎都?xì)w結(jié)為這樣一個(gè)事實(shí):寫(xiě)入RAM的任何代碼/數(shù)據(jù)/堆棧信息都可能在重新分配期間改變位置。這就是為什么一旦找到正確的配置,就應(yīng)該通過(guò)熔絲進(jìn)行應(yīng)用。如果使用Fuse來(lái)配置FlexRAM,那么就不必?fù)?dān)心代碼和數(shù)據(jù)的移動(dòng),因?yàn)镕use 設(shè)置被應(yīng)用為硬件默認(rèn)設(shè)置。記住,一旦燒了熔絲,就沒(méi)有退路了!這就是為什么首先通過(guò)軟件方法嘗試配置很重要。燒完熔絲后,無(wú)需修改復(fù)位處理程序,只需修改MPU以更改我們之前看到的區(qū)域大小和項(xiàng)目的MCU設(shè)置,以匹配通過(guò)熔絲配置的新內(nèi)存大小。
負(fù)責(zé)FlexRAM配置的熔絲為Default_FlexRAM_Part,此熔絲的地址為0x6D0[15:13]。可以在參考手冊(cè)的Fusemap一章中找到有關(guān)此保險(xiǎn)絲和不同配置的更多信息。要燒熔絲,建議使用blhost或MCUBootUtility。兩個(gè)工具的下載鏈接如下:
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參考代碼:
審核編輯:湯梓紅
-
寄存器
+關(guān)注
關(guān)注
31文章
5363瀏覽量
121158 -
sram
+關(guān)注
關(guān)注
6文章
768瀏覽量
114884 -
mcuxpresso
+關(guān)注
關(guān)注
1文章
41瀏覽量
4235
原文標(biāo)題:重新分配 FlexRAM
文章出處:【微信號(hào):嵌入式 MCU,微信公眾號(hào):嵌入式 MCU】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
xilinx,ddrmig文件中管腳分配
6678工程如何分配存儲(chǔ)器地址范圍
無(wú)法修改許可證以允許重新分配產(chǎn)品
Linux的磁盤(pán)空間重新分配方法
如何在實(shí)時(shí)邊緣yocto項(xiàng)目中為監(jiān)獄牢房重新分配資源?
S32K314在CS自動(dòng)控制的情況下,可以在運(yùn)行程序時(shí)重新分配CS引腳嗎?
如何為MIMXRT1062重新分配FlexRAM?
電荷重新分配DAC,電荷重新分配DAC原理是什么?
沃達(dá)豐及其競(jìng)爭(zhēng)對(duì)手正在向政府施壓要求重新分配無(wú)線頻譜
澳大利亞政府計(jì)劃在2021年初對(duì)26GHz頻段的頻譜進(jìn)行重新分配
FCC將重新分配大部分5.9GHz頻段,為了非授權(quán)頻譜技術(shù)和C-V2X
重新分配pod節(jié)點(diǎn)
![<b class='flag-5'>重新分配</b>pod節(jié)點(diǎn)](https://file1.elecfans.com/web3/M00/04/89/wKgZO2d16vSAHYzHAAArOpmXTxg637.png)
評(píng)論