本文以i.MXRT1050為例來做說明,其它i.MX RT10xx系列在FlexRAM的使用上是一樣的,只是容量大小有差別。
一、文檔說明
i.MX RT1050一共有512KB內部FlexRAM,默認的情況是128KB ITCM,128KB DTCM,256KB的OCRAM。在實際的使用中,有些客戶需要重新分配各個存儲區(qū)的大小,來均衡自己應用所需要的ITCM, DTCM以及OCRAM容量。
通過官方應用筆記Using the i.MX RT FlexRAM,我們可以知道一些關于FlexRAM的知識以及配置的限制等。
重新配置FlexRAM的分區(qū)情況,主要可以通過FUSE或者IOMUXC_GPR_GPR17寄存器去配置,具體關系如下:
如果修改fuse,那么以后就難以重新修改,因為fuse的位只能從0到1,不能從1到0,所以,在實際的調試過程中,可以通過修改內部寄存器方式臨時修改FlexRAM的分區(qū)配置。
最近發(fā)現(xiàn)有部分網(wǎng)友在使用寄存器重新分區(qū)FlexRAM的過程中,出現(xiàn)了各種各樣的問題,比如不能debug,debug問題解決之后,又出現(xiàn)debug可以運行,但是下載進去,重新復位代碼不能起來的問題。
本篇文章針對需要配置FlexRAM功能的網(wǎng)友,總結了在MCUXPresso IDE下具體的重新配置i.MX RT1050 FlexRAM ITCM、DTCM以及OCRAM大小的步驟, 其他i.MX RT芯片系列方法也是類似,只是具體的寄存器分區(qū)大小,按照實際的芯片寄存器去配置。
二、FlexRAM配置分析
i.MXRT1050 默認的FlexRAM配置為:128KB ITCM、128KB DTCM和256KB的OCRAM。那么如果需要配置FlexRAM為:128KB ITCM、256KB DTCM和128KB的OCRAM,應該怎么做呢?
從上面的表格,我們可以看出,可以將IOMUXC_GPR_GPR17配置為下表的黃色行數(shù)據(jù):
IOMUXC_GPR_GPR17寄存器中每2位表示一個Bank,定義如下:
00b—bank is not used.
01b—bank is configured for OCRAM.
10b—bank is configured for DTCM.
11b—bank is configured for ITCM.
i.MX RT1050共有512KB FlexRAM, 做16等分,則每個bank 為512KB/16=32KB。
所以需要128KB ITCM, 256KB DTCM, 128KB的OCRAM時,分配如下:
ITCM:4個bank,共4個11b
DTCM: 8個bank, 共8個10b
OCRAM: 4個bank, 共4個01b
FlexRAM分區(qū)地址關系如下:
相關的寄存器配置如下: IOMUXC_GPR->GPR17 = 0x5AAFFAA5; IOMUXC_GPR->GPR16 |= 0x7; IOMUXC_GPR->GPR14 = (9<<20) | (8<<16);
三、MCUXPresso IDE的配置步驟
下面在MIMXRT1050-EVKB開發(fā)板上以SDK 的led_blinky MCUXpresso工程為例,給出具體操作步驟。
首先下載最新的SDK并且在MCUXpresso IDE中導入led_blinky工程。
修改MCU Settings的memory配置
將DTCM, ITCM, OCRAM改為實際需要的大小后,點擊apply。
在startup文件里的Reset代碼部分添加FlexRAM的代碼:
FLEXRAM->TCM_CTRL = 4;
IOMUXC_GPR->GPR17 = 0x5AAFFAA5;
IOMUXC_GPR->GPR16 |= 0x7;
IOMUXC_GPR->GPR14 = (9<<20) | (8<<16) ;
準備IDE的調試腳本.scp文件
RT1050_connect_128Kocram_128Kitcm_256Kdtcm.scp 內容為:
100REM=============================== 110REMRT1050_connect.scp 120REM 130REMCopyright2019NXP 140REMAllrightsreserved. 150REM=============================== 160print"RT1050ConnectScript" 170REMprobelist 180p%=probefirstfound 190remprobeopenbyindexp% 200wireswdconnectp% 210selectprobecorep%0 220cminitapdpthis 230cmhaltthis 235goto320 240remtrapinbootrom 250cmwatchsetthis00x400F8004RW 260cmresetvectorcatchclearthis 270print"Resettingandtrapping" 280cmsysresetreqthis 290print"Backfromreset" 300cmresetvectorcatchsetthis 310cmwatchclearthis0 320print"DisablingMPU" 330s%=Peek32this0xE000ED94 340s%=s% 0xFFFFFFFE 350Poke32this0xE000ED94s% 360REM======ConfigureFlexRAM====== 370print"ConfigureFlexRAMfor128KBOCRAM,128KBI-TCM,256KBD-TCM" 380REMTCMCTRLPoke0x400B0000-toforceRAMclockingandsetwaitstates=b100 390Poke32this0x400B00000x4 400REMIOMUXC_GPR170x400AC044-thissetsbitfieldallocationofFlexRAM32KBbankstoOC256KBb01,I128KBb11,D128KBb10 410Poke32this0x400AC0440x5AAFFAA5 420REMIOMUXC_GPR160x400AC040-thissetsenablesforIandDTCMandthesourceoftheTCMconfig=0x200007 430Poke32this0x400AC0400x200007 440print"Finished" 450REM=============================== 460end
將這個超長文件名的文件,RT1050_connect_128Kocram_128Kitcm_256Kdtcm.scp拷貝到IDE安裝目錄下:
C:nxpMCUXpressoIDE_11.1.0_3209idebinariesScripts
拷貝完之后,在debug configuration界面的script connect 中添加這個腳本文件:
修改stack的起始位置
將STACK的位置由end改為start,這樣可以解決燒錄之后,重新上電不運行的問題。
下面就可以編譯代碼,并且運行,測試結果如下:
可以發(fā)現(xiàn),寄存器的FlexRAM情況確實是需要的配置情況,燒錄之后,退出debug重新上電,可以發(fā)現(xiàn)led還是可以閃爍,說明功能已經正常工作。
本文最初發(fā)表在“恩智浦中文社區(qū)”,可以在原帖那里下載到代碼。
來源:恩智浦MCU加油站
免責聲明:本文為轉載文章,轉載此文目的在于傳遞更多信息,版權歸原作者所有。本文所用視頻、圖片、文字如涉及作品版權問題,請聯(lián)系小編進行處理
審核編輯 黃宇
-
寄存器
+關注
關注
31文章
5250瀏覽量
119197 -
i.MX
+關注
關注
1文章
44瀏覽量
35484
發(fā)布評論請先 登錄
相關推薦
評論