趁著我們NB的號(hào)稱跨界處理器的i.MXRT系列的推出一睹為快吧(想起當(dāng)年也是Kinetis剛出來(lái),我在學(xué)校正好開始寫它的那一系列技術(shù)文檔,這是啥,緣分吶)。其實(shí)在發(fā)表到AET之前,我先把此文發(fā)到阿莫論壇上了試了試水,收到的一句話挺讓我心情激蕩的,就是“FSL又活了”,my answer is “靈魂依在。。?!?,哎,啥也不說(shuō)了,下面開整吧。
在此文正式成型之前,歷經(jīng)了3個(gè)版本的修改和優(yōu)化,最終fixed掉了已知的bug和穩(wěn)定性才敢拿出來(lái)獻(xiàn)丑,希望讓廣大AET的博友們繼續(xù)能有所收獲有所體會(huì),也算為了RT1050的未來(lái)發(fā)展貢獻(xiàn)點(diǎn)力量吧,貌似不少人在觀望RT系列,也有很多第三方設(shè)計(jì)公司和開源項(xiàng)目在蠢蠢欲動(dòng),所以也希望我拋的這塊磚能在RT的廣泛市場(chǎng)激起一點(diǎn)漣漪多引出幾塊好玉來(lái)。。。
2018新年伊始,I.MXRT105x已經(jīng)推向市場(chǎng)有一段兒時(shí)間了,以其極高的性價(jià)比引起了不少工業(yè)和消費(fèi)領(lǐng)域客戶的興趣,畢竟相比于目前市場(chǎng)上已有的多數(shù)“高價(jià)低配”的高端ARM Cortex-M7產(chǎn)品,RT105x最高600MHz主頻、極豐富的外設(shè)和3美金起步的定位著實(shí)算是業(yè)界良心了(還有馬上要面世的LQFP封裝I.MXRT1020更是讓人期待),只是當(dāng)然這種“低價(jià)高配”是有代價(jià)的,其內(nèi)部不自帶Flash需要外掛串行SPI Nand/Nor Flash或者并行的Nand/Nor Flash(貌似一下子給不少心動(dòng)的人潑了涼水,呵呵),不過(guò)這一消息倒是有人歡喜有人憂,對(duì)歡喜的客戶來(lái)說(shuō),他們的應(yīng)用代碼本身內(nèi)部Flash就裝不下需要外擴(kuò),這一下反倒好了,省的內(nèi)心糾結(jié)了再也不用擔(dān)心老板整天催自己優(yōu)化代碼精簡(jiǎn)應(yīng)用看看能不能只用內(nèi)部Flash搞定了,哈哈,而且動(dòng)則幾Mb或者幾十Mb的外部SPI Flash價(jià)格便宜以后升級(jí)也是綽綽有余,而對(duì)憂的客戶來(lái)說(shuō),外部Flash啟動(dòng)方式帶來(lái)的啟動(dòng)配置復(fù)雜、代碼安全性問(wèn)題和對(duì)系統(tǒng)性能的影響等都是潛在的棘手問(wèn)題。
關(guān)于外部Flash的代碼安全問(wèn)題和代碼在外部執(zhí)行對(duì)整個(gè)系統(tǒng)性能的影響,RT105x的加密啟動(dòng)(HAB)功能和32KB的L1 ICache/DCache是可以解決的,只是本文先從RT105x的啟動(dòng)配置問(wèn)題著手,畢竟系統(tǒng)如果都Boot不起來(lái),其他的問(wèn)題都是空談了,呵呵。另外,如上面所說(shuō),RT105x支持的啟動(dòng)方式有不少,不過(guò)個(gè)人覺(jué)著外部串行SPI Flash啟動(dòng)會(huì)是大多數(shù)人的折中選擇。由于RT105x的官方EVK板上是帶有兩塊串行SPI Nor Flash(一個(gè)是Cypress高性能8線高速的Hyper Flash
S26KS512SDPBHI02,一個(gè)是ISSI物美價(jià)廉的4線QSPI Flash IS25WP064AJBLE),所以咱就手上有啥來(lái)啥,以板載的Hyper Flash和QSPI Flash為例詳細(xì)說(shuō)明下串行SPI Nor Flash的啟動(dòng)流程和具體使用方法。
串行SPI Nor Flash啟動(dòng)流程1
當(dāng)RT105x EVK板載的Boot模式選擇開關(guān)SW7設(shè)定為如下Table1-1所示的前兩者時(shí)(其他BOOT_CFG 管腳默認(rèn)被下拉到地,即OFF狀態(tài)),系統(tǒng)會(huì)通過(guò)片上的FlexSPI接口執(zhí)行外部串行SPI Nor Flash的啟動(dòng),其啟動(dòng)地址為Table1-2所示的0x6000_0000(如果是從并行的Nor Flash啟動(dòng)則啟動(dòng)地址為0x8000_0000),關(guān)于其他Boot pin對(duì)啟動(dòng)模式的配置影響,見(jiàn)RT105x的RM手冊(cè)8.6章節(jié),這里就不細(xì)說(shuō)了。
Table1-1 典型的啟動(dòng)模式設(shè)定
SW7-1 | SW7-2 | SW7-3 | SW7-4 | 啟動(dòng)模式 |
OFF | ON | ON | OFF | Hyper Flash啟動(dòng) |
OFF | OFF | ON | OFF | QSPI Flash啟動(dòng) |
ON | OFF | ON | OFF | SD卡啟動(dòng) |
Table1-2 啟動(dòng)相關(guān)地址
Start Address | End Address | Size | Description |
0x80000000 | 0xDFFFFFFF | 1.5GB |
SEMC 外部存儲(chǔ)器接口 (SDRAM, 并行NOR Flash, PSRAM, 并行NAND Flash) |
0x60000000 | 0x7F7FFFFF | 504MB | FlexSPI |
0x20200000 | 0x2027FFFF | 512KB | OCRAM |
0x20000000 | 0x2007FFFF | 512KB | DTCM |
0x00000000 | 0x0007FFFF | 512KB | ITCM |
如圖1所示為完整的SPI Nor Flash啟動(dòng)流程圖,當(dāng)RT105x的片上ROM在檢測(cè)到啟動(dòng)模式為FlexSPI接口后,會(huì)根據(jù)Boot Pin的配置信息配置該模式下需要使用的FlexSPI接口管腳的復(fù)用模式并將FlexSPI的時(shí)鐘配置成默認(rèn)的低速30MHz,然后會(huì)以0x6000_0000為首地址讀取前512個(gè)字節(jié)作為外部Flash的配置信息(即Flash Configuration Parameters,包括幾線制的SPI Flash,SPI的時(shí)鐘頻率,LUT查找表,DDR/SDR模式以及片選CS管腳的Hold/Setup Time等信息,見(jiàn)RM8.6.3章節(jié))并以此來(lái)配置FlexSPI模塊以滿足外部Flash的特性,待配置完畢后,RT105x CPU以后即會(huì)以AHB總線讀取數(shù)據(jù)和指令的方式(雖然從外部來(lái)看仍然是FlexSPI接口,但是由于LUT查找表讀取數(shù)據(jù)的指令已經(jīng)配置好,CPU只是通過(guò)AHB總線發(fā)送讀取指令即可觸發(fā)LUT以操作外部Flash,也就是說(shuō)在內(nèi)部對(duì)CPU來(lái)講已經(jīng)屏蔽掉了FlexSPI的底層)來(lái)讀取接下來(lái)的跟用戶Image相關(guān)的幾個(gè)關(guān)鍵信息,即IVT(Image Vector Table),Boot Data和DCD(Device configuration data)如圖2,其中IVT需要放在外部Flash的固定偏移地址(如圖3,對(duì)Nor Flash來(lái)說(shuō)其需要存儲(chǔ)在基地址 + 4KB的偏移地址,比如0x60000000+4*1024)供ROM讀取以便讓系統(tǒng)知道用戶Image的第一條可執(zhí)行指令放在了哪里以及BootData和DCD的存放地址,BootData則保存了完整Image的首地址和整個(gè)image所占的空間大小,而DCD則包含了一些配置命令以便在跳到用戶程序入口之前供ROM調(diào)用配置內(nèi)部外設(shè)以更好的匹配外部IC,一般如果系統(tǒng)外掛了SDRAM的情況則需要配置好DCD(因?yàn)橛袝r(shí)需要主程序在跑起來(lái)之前,外部SDRAM就得處在ready狀態(tài),以供CPU把data或者code copy到SDRAM里時(shí)不會(huì)出錯(cuò))。
圖1 SPI Nor Flash啟動(dòng)流程
圖2 完整Image組成元素
圖3 IVT針對(duì)不同存儲(chǔ)介質(zhì)的存放地址
綜上所述,我們實(shí)際上就可以得出結(jié)論來(lái),如果要讓系統(tǒng)能正常Boot起來(lái),則燒寫到外部串行SPI Flash里面的完整image必須要包括五個(gè)重要元素,即Flash Configuration Parameters,IVT,Boot Data,DCD和用戶image,而其中Flash Configuration Parameters和IVT是存放在固定的地址的,而后三者則由IVT的內(nèi)容來(lái)決定,無(wú)論是直接編譯生成或者通過(guò)輔助工具手動(dòng)添加,只要我們最后形成的image里面包含了這幾個(gè)元素,CPU就會(huì)認(rèn)可這個(gè)image并執(zhí)行(先不談安全加密的事)。所以我們只要搞清楚這個(gè)基本原理了,無(wú)論是什么方法,最后都是殊途同歸,下面就可以放心大膽地去解決RT105x的FlesSPI啟動(dòng)問(wèn)題了。
SPI Nor Flash啟動(dòng)配置方法2
前面提到如果想要RT105x能正常從外部串行SPI Nor Flash啟動(dòng)的話,待燒寫的image是必須要集成五個(gè)元素的(Flash Configuration Parameters, IVT, Boot Data, DCD and User Image, 重要事情要多說(shuō)幾遍 呵呵),那具體的實(shí)現(xiàn)方法我目前想到的無(wú)非兩種,一種是在編譯鏈接過(guò)程中直接把這幾個(gè)元素和應(yīng)用代碼鏈接到一塊,并將這幾個(gè)元素指定好鏈接地址,最后通過(guò)IDE的Flashloader下載到SPI Flash里,第二種則是通過(guò)輔助工具在編譯鏈接好的裸應(yīng)用代碼前面手動(dòng)的添加一個(gè)信息頭(頭里面包含這幾個(gè)元素),然后通過(guò)單獨(dú)的下載工具或者MCU內(nèi)部的ROM Bootloader ISP下載進(jìn)去。這兩種各有優(yōu)劣勢(shì),前者比較適合在前期調(diào)試的時(shí)候使用,這樣在IDE里面編輯修改應(yīng)用代碼后做印證測(cè)試的時(shí)候可以直接在線download和debug(比如單步,斷點(diǎn),查看寄存器和Memory等等),我相信這也是目前大家比較迫切需要的,但是缺點(diǎn)的話則是前期配置過(guò)程稍微復(fù)雜些且需要對(duì)Boot過(guò)程和外部SPI Flash的Spec有一定了解(當(dāng)然這些配置是一勞永逸的,配置一次即可),而后者則是客戶不需要關(guān)心其他幾個(gè)元素的配置只專注用戶應(yīng)用的開發(fā),待開發(fā)完畢后通過(guò)輔助工具生成最終的Image用于小批測(cè)試或者量產(chǎn),缺點(diǎn)是前期調(diào)試的話會(huì)比較麻煩,每次修改完重新編譯生成用戶image還需要用輔助工具手動(dòng)添加信息頭然后再通過(guò)Bootloader下載進(jìn)去驗(yàn)證(我想想都有點(diǎn)累的慌。。。這種情況workaround只能是前期先在RAM里調(diào)試,待成熟了之后再走這個(gè)流程)。
第二種使用輔助工具的方法,官方已經(jīng)提供了一整套工具鏈(可以從RT105x官方主頁(yè)的”Flashloader i.MX-RT1050”軟件包里找到)且有了相應(yīng)的AN應(yīng)用筆記介紹其具體操作步驟,這里就不再贅述了。本次我們重點(diǎn)介紹第一種方法,即在IDE環(huán)境里通過(guò)對(duì)工程的配置達(dá)到生成并下載調(diào)試完整image的目的,說(shuō)到這里我再啰嗦幾句,實(shí)際上這種方法做下來(lái)不只方便了在線download和debug,好處也不少,一是所有的這幾個(gè)元素配置信息都以C語(yǔ)言的常量形式體現(xiàn)在應(yīng)用工程文件里面,會(huì)加深我們對(duì)Boot的理解程度不說(shuō),這樣的話如果更換外部SPI Flash也可以很方便的更改適配信息,第二呢則是這種方式形成的image文件會(huì)是通用的image格式(比如.bin, .hex和.S19),也會(huì)兼容市面上大多數(shù)可以直接燒寫SPI Flash的量產(chǎn)工具的批量燒寫。好了,不再多說(shuō)了,再說(shuō)就有點(diǎn)話癆了,呵呵,因?yàn)榘遢d有Hyper Flash和QSPI Flash兩種,下面就分別詳細(xì)說(shuō)明下這兩種Flash在IDE環(huán)境下的配置方法(我使用的IAR,Keil的可以參考第四章節(jié)自行配置,需要添加的幾個(gè)文件是IAR,Keil和GCC三個(gè)環(huán)境兼容的)。
開發(fā)測(cè)試環(huán)境:
Hardware Platform: MIMRT1050-EVK (SCH-29538 REV A1)
Software Package: SDK_2.3.0_EVK-MIMXRT1050(mcuxpresso.nxp.com)
IDE: IAR_v8.20.1
Debugger: On-Board CMSIS-DAP
2.1 Cypress 1.8v Hyper Flash啟動(dòng)
RT105x的EVK板子默認(rèn)是使用Hyper Flash啟動(dòng)的,所以硬件不需要改動(dòng),只需要將SW7啟動(dòng)模式修改成Table1-1第一行配置使能Hyper Flash啟動(dòng)即可,如下圖4,然后我們以SDK2.3中的hello world為例介紹具體配置方法。實(shí)際上在最新的SDK2.3里面Keil和MCUXpresso版本已經(jīng)有針對(duì)Hyper Flash啟動(dòng)的hello_world_xip的樣例了,只是IAR反倒是沒(méi)有,不過(guò)這下正好我們來(lái)走一遍完整的配置過(guò)程,這樣也可以為下一小節(jié)的QSPI啟動(dòng)打下基礎(chǔ)(官方例程里是沒(méi)有QSPI XIP例程的),畢竟大多數(shù)客戶估計(jì)還是會(huì)傾向于選擇QSPI的。
圖4 Hyper Flash啟動(dòng)模式
(1)打開SDK2.3的hello world例程\boards\evkmimxrt1050\demo_apps\hello_world\iar,在Workspace下可以看到默認(rèn)是有8種配置的,包括在SDRAM調(diào)試,OCRAM調(diào)試和spi nor Flash調(diào)試,原始的flexspi_nor_debug配置是沒(méi)有其他幾種元素的,所以這種配置下當(dāng)把代碼下進(jìn)去外部Hyper Flash上的時(shí)候可以在線debug但是當(dāng)重新上電或者外部復(fù)位后系統(tǒng)是Boot不起來(lái)的,因?yàn)闆](méi)有其他元素信息RT1050啟動(dòng)的時(shí)候識(shí)別不了它的。接下來(lái)我們?cè)诖伺渲没A(chǔ)上新建一個(gè)配置出來(lái)然后在新的工程配置上添加文件和修改配置,點(diǎn)擊IAR菜單欄Project->Edit Configurations,然后在打開的窗口下選擇New,在新的工程配置下起一個(gè)新的名字“HyperFlash_bootok”,Base on Configuration則選擇原有的flexspi_nor_debug以最大限度的保留原有的配置,改好之后點(diǎn)擊Ok即當(dāng)前工程會(huì)進(jìn)入新添加的HyperFlash_bootok配置狀態(tài);
(2)在此工程配置下,新添加一個(gè)Group(右鍵工程->Add->Add Group)并命名為“xip”,然后右鍵該Group->Add->Add Files,找到根目錄\devices\MIMXRT1052\xip路徑下的四個(gè)文件,將該四個(gè)文件都添加到當(dāng)前工程上來(lái),如下所示,我們可以打開這兩個(gè).c文件即可看到除了User Image之外的其他四個(gè)元素信息都以常量的方式被定義在指定的段地址內(nèi),以便在編譯鏈接之后將這幾個(gè)元素配置信息分配到指定的地址上以保存在最終的Image上,且這四個(gè)文件是可以兼容IAR,Keil和GCC三大編譯器的所以可以隨意Porting,當(dāng)然不要忘了在工程配置中頭文件搜索路徑上添加那兩個(gè)頭文件的路徑,另外如果沒(méi)有XIP_EXTERNAL_FLASH這個(gè)宏的話也要加上;
(3)由于四個(gè)元素被分別定義到指定的段內(nèi),但是默認(rèn)的原始工程里面的鏈接文件是沒(méi)有這幾個(gè)段的定義的(Keil和MCUXpresso由于有xip的樣例,它們是定義好的了),所以還需要在原始的鏈接文件基礎(chǔ)上添加這幾個(gè)段的定義并分配好地址,我們將原來(lái)的鏈接文件MIMXRT1052xxxxx_flexspi_nor.icf復(fù)制一份重命名為MIMXRT1052xxxxx_hyperflash_nor_bootok.icf(名字倒是無(wú)所謂),然后打開該文件,添加這幾個(gè)段的定義和地址分配如下(修改好的源文件見(jiàn)隨本文檔附帶的壓縮包),然后在工程配置Options->Linker里選擇新修改的鏈接文件,最后點(diǎn)擊確認(rèn);
(4)不要以為這樣就結(jié)束了,呵呵,我們這兩步說(shuō)到幾個(gè)重要的元素信息是以常量的形式通過(guò)鏈接文件保存在指定的地址段內(nèi),不過(guò)我們的應(yīng)用工程卻沒(méi)有調(diào)用它們,在編譯的時(shí)候編譯器會(huì)默認(rèn)把他們又給優(yōu)化掉了搞的最后沒(méi)有體現(xiàn)在Image里面,前面的工作白搭了,所以還需要額外一步告訴編譯器把這幾個(gè)常量給Keep住,具體配置如下圖,然后點(diǎn)擊確認(rèn);
(5)這樣工程配置就結(jié)束了,我們重新編譯整個(gè)工程,然后在生成的.map文件里即可看到如下這四個(gè)元素信息都已經(jīng)正確的分配到指定地址了,這樣就萬(wàn)事俱備,就差I(lǐng)DE IAR的Flashloader這個(gè)“東風(fēng)”了;
(6)在IAR v8.20.1以上的版本已經(jīng)有HyperFlash的Flashloader了,我們?cè)贠ptions->Debugger選項(xiàng)下選擇CMSIS-DAP,然后接下來(lái)需要注意的是在Options->CMSIS-DAP選項(xiàng)下,Reset類型需要選擇Core Reset(CMSIS-DAP默認(rèn)的Reset方式會(huì)導(dǎo)致調(diào)試的時(shí)候打不了斷點(diǎn),J-link倒是沒(méi)有這個(gè)問(wèn)題),然后點(diǎn)擊Ok保持配置,最后開始Debug即可完美的把帶有幾個(gè)重要元素信息的配置數(shù)據(jù)都下載到外部Hyper Flash里面并進(jìn)入Debug模式,正常單步或者斷點(diǎn),并且按鍵復(fù)位或者重新給板子上電都可以讓RT105x正常Boot起來(lái),最后有圖有真相,發(fā)個(gè)串口打印的結(jié)果“hello world”, Enjoy it…
2.2 ISSI 1.8v QSPI啟動(dòng)
上面說(shuō)完Hyper Flash的啟動(dòng)方法,接下來(lái)繼續(xù)說(shuō)說(shuō)QSPI啟動(dòng)。由于板子上的Hyper Flash和QSPI時(shí)鐘、片選和部分?jǐn)?shù)據(jù)線是共用的,所以在測(cè)試QSPI啟動(dòng)的時(shí)候需要把Hyper Flash焊掉(跟板子硬件設(shè)計(jì)有關(guān)系,不焊掉會(huì)影響時(shí)序,稍微有點(diǎn)心疼,畢竟Hyper Flash比較貴而且又是BGA的焊下來(lái)就焊不上去了,當(dāng)然,如果是客戶自己設(shè)計(jì)的板子只會(huì)有一種SPI Nor Flash,那就沒(méi)這個(gè)問(wèn)題了),然后將下圖中DNP的0歐姆電阻焊上,最后特別注意的是需要在QSPI Flash的第7腳和3腳即Reset和WP管腳上拉4.7k的電阻到電源Flash_VCC。因?yàn)槲野l(fā)現(xiàn)有個(gè)別型號(hào)的QSPI Flash,比如板子用的ISSI這個(gè),在系統(tǒng)啟動(dòng)的時(shí)候Reset和WP這兩個(gè)腳是懸空態(tài),而QSPI Flash默認(rèn)上電都是單線方式,這樣的話Reset和WP如果是低電平則QSPI一直處于復(fù)位和寫保護(hù)狀態(tài),從而造成系統(tǒng)RT1050讀取QSPI信息失敗進(jìn)而導(dǎo)致啟動(dòng)失敗,所以需要在這兩個(gè)腳上加個(gè)上拉電阻給它有效的高電平,后來(lái)我測(cè)試的QD和Winbond的QSPI這兩個(gè)腳里面是有上拉電阻的,系統(tǒng)啟動(dòng)后是固定的高電平就沒(méi)有問(wèn)題了,不過(guò)我的建議是最好外部再加一個(gè)保證可靠,也不會(huì)影響后續(xù)的4線通信。另外,別忘了SW7啟動(dòng)模式需要修改成Table1-1第二行配置使能QSPI Flash啟動(dòng),如下圖5:
圖5 QSPI Flash啟動(dòng)模式
(1)我們?nèi)匀灰陨厦娴膆ello world工程為例,有前面章節(jié)打基礎(chǔ),本章說(shuō)起來(lái)就輕松不少了,在當(dāng)前工程下,點(diǎn)擊IAR菜單欄Project->Edit Configurations繼續(xù)新建一個(gè)工程配置并以HyperFlash_bootok為藍(lán)本將新的配置命名為“Qspi_nor_bootok”如下圖,然后點(diǎn)擊Ok進(jìn)入該配置模式下;
(2)此時(shí)xip的Group文件組仍然有效,不過(guò)由于Boot的Flash類型發(fā)生了變化,所以需要修改外部SPI Flash的前512字節(jié)的Flash Configuration Parameters元素信息(其他幾個(gè)元素?zé)o需修改)。打開fsl_flexspi_nor_flash.c文件,然后在hyperflash_config常量前面添加如下圖Qspiflash_config的常量(修改后的源文件見(jiàn)隨本文檔附帶的壓縮包),實(shí)際上只是修改了外部SPI Flash的Pads類型、SPI時(shí)鐘頻率、Flash的大?。ò偞笮∫约皃age和sector的大?。┖妥钪匾腖UT查找表指令,這里我使用了外部QSPI Flash的四線Quad I/O Read模式(即0xEB),此模式下SPI的時(shí)鐘頻率可以跑到133MHz,總帶寬可以達(dá)到532Mbps即66.5MByte/s(實(shí)際上很多MCU片內(nèi)的Flash時(shí)鐘也差不多這個(gè)頻率甚至比這個(gè)低,不過(guò)內(nèi)部的Flash線寬會(huì)大些),這個(gè)速度雖然相比于CPU 600MHz的主頻慢很多,但是實(shí)際上RT1050的一級(jí)緩存ICache和DCache各有32KB且在程序里默認(rèn)是打開的,實(shí)測(cè)下來(lái)對(duì)大部分代碼來(lái)說(shuō)外部SPI Flash的帶寬幾乎不會(huì)拖累CPU性能,針對(duì)特定應(yīng)用的復(fù)雜代碼留待大家自行測(cè)試(實(shí)測(cè)Opus音頻編解碼,跑在外部QSPI Flash上的性能大概為跑在內(nèi)部SRAM上的70%~80%);
(3)上一步通過(guò)預(yù)編譯QSPI_BOOT宏來(lái)使能QspiFlash的配置信息主要是為方便跟前面HyperFlash啟動(dòng)兼容,只需在當(dāng)前工程配置下添加QSPI_BOOT宏即可,如下圖所示,這樣即使再跳回HyperFlash_bootok工程時(shí)也不必麻煩地來(lái)回修改Flash Configuration Parameters元素信息了,同時(shí)該工程配置下的鏈接文件由于各個(gè)段地址沒(méi)有變化則不用修改,只是需要Keep的常量記得替換成Qspiflash_config,然后點(diǎn)擊確認(rèn)保存;
(4)此時(shí)整個(gè)工程的配置工作就完成了,點(diǎn)擊Build完成對(duì)整個(gè)工程的編譯和鏈接,查看.map文件也可以看到其他4個(gè)主要元素配置信息也都鏈接到整個(gè)image里了。不過(guò)接下來(lái)需要解決的是QSPI Flash的Flashloader問(wèn)題了。在IAR For ARM v8.20.2以上的版本的Flashloader里已經(jīng)加入了對(duì)QSPI Flash的支持了,但是該Flashloader只支持ISSI的QSPI Flash,我在此基礎(chǔ)上做了修改和優(yōu)化加入了對(duì)GD和Winbond QSPI Flash的支持,該新的Flashloader見(jiàn)隨本文檔附帶的壓縮包文件,將壓縮包路徑Firmware\IAR_8.20_Flashloader下的四個(gè)文件copy到IAR安裝目錄下C:\Program Files (x86)\IAR Systems\Embedded Workbench 8.0\arm\config\flashloader\NXP并覆蓋源文件。此外,該修改后的Flashloader同時(shí)支持HyperFlash和QSPI Flash的download和debug(通過(guò)查詢外部Boot模式來(lái)切換這兩種燒寫算法);
(5)一切準(zhǔn)備就緒,在點(diǎn)擊debug之前記得確認(rèn)options->debugger下選擇好CMSIS-DAP并且確保Reset類型必須要選擇Core Reset,然后點(diǎn)擊確認(rèn)保存,最后debug將代碼下載到外部QSPI Flash里并調(diào)試或者重新上電測(cè)試,hello world仍然讓人激動(dòng)不已,不容易啊不容易。
上述兩種外部SPI Nor Flash的啟動(dòng)配置方式僅僅是以hello world工程為例了,實(shí)際上大家可以參照如上幾個(gè)步驟任意porting到SDK的其他工程實(shí)例里面去,而且由于SDK_2.3.0_EVK-MIMXRT1050\devices\MIMXRT1052\xip目錄是共享的文件(包括Flashloader也是共享的),所以添加的那四個(gè)文件內(nèi)容不需要再修改了,只需要手動(dòng)添加文件到工程和配置IAR相關(guān)選項(xiàng)即可,操作起來(lái)還是比較快的。
代碼跑在SPI Flash數(shù)據(jù)跑在SDRAM的使用方法3
前面比較詳細(xì)的講了HyperFlash和QSPI Flash的啟動(dòng)方式,趁著興致尚在我們?cè)偌狱c(diǎn)餐。我相信在很多客戶開發(fā)RT105x過(guò)程中,將code跑在外部SPI Flash里,而數(shù)據(jù)存放在外部SDRAM里面會(huì)是比較常用的一種選擇(比如一些會(huì)用到高分辨率的GUI顯示方面,內(nèi)部RAM不夠用了)。雖然前面提到的xip那四個(gè)文件(兩個(gè).c和兩個(gè).h)里面的fsl_flexspi_nor_boot.c文件有定義dcd_sdram這個(gè)常量,不過(guò)很快就會(huì)發(fā)現(xiàn)這個(gè)常量數(shù)組里面的數(shù)據(jù)很大且看不出什么意義來(lái)(看不出意義就意味著不知道怎么修改),這是因?yàn)檫@個(gè)常量數(shù)組里面是編譯后的可執(zhí)行命令,它是根據(jù)不同的SDRAM編譯后的結(jié)果,也就意味著不同的SDRAM這個(gè)數(shù)組是不一樣的,這就尷尬了,客戶如果不是使用EVK板載的SDRAM的話該怎么搞呢?哈哈,這個(gè)倒是不用擔(dān)心,官方很快會(huì)推出一個(gè)輔助工具來(lái)生成不同SDRAM的DCD常量數(shù)組,不過(guò)在此之前我們也不能干等著吧,所以本章節(jié)的“加餐”就是提出一種workaround先提前解決下這個(gè)問(wèn)題。
我們要知道,在系統(tǒng)上電前無(wú)論代碼還是數(shù)據(jù)都是存在SPI Flash這些非易失存儲(chǔ)介質(zhì)里面的,待上電后程序會(huì)有一個(gè)Copy過(guò)程將數(shù)據(jù)或者想要在RAM里執(zhí)行的代碼copy到RAM里面去,對(duì)內(nèi)部RAM來(lái)講無(wú)所謂(因?yàn)橐簧想妰?nèi)部的SRAM就已經(jīng)初始化完成了)而對(duì)外部SDRAM來(lái)說(shuō)是需要事先初始化RT105x的SDRAM控制器才能往該SDRAM可尋址的空間copy內(nèi)容的。幸運(yùn)的是在Copy之前我們是有段緩沖時(shí)間的,恰恰就是這段緩沖時(shí)間給了我們有可以不使用DCD配置的機(jī)會(huì)(實(shí)際上DCD也是ROM在跳到應(yīng)用代碼之前讀取其內(nèi)容對(duì)SDRAM進(jìn)行初始化)。以IAR的啟動(dòng)代碼為例,打開startup_MIMXRT1052.s文件找到CPU的起始入口Reset_Handler如下圖,執(zhí)行的Copy過(guò)程實(shí)際上是在__iar_program_start這個(gè)函數(shù)里面實(shí)現(xiàn)的(具體內(nèi)容使用的是IAR自己的庫(kù), Keil是在__main里實(shí)現(xiàn)的),而在該函數(shù)之前(即在SystemInit函數(shù)里面)我們只需要將SDRAM初始化好讓其Ready了就不會(huì)影響后續(xù)數(shù)據(jù)的copy和使用,所以下面我就簡(jiǎn)單介紹下具體操作方法。
(1)仍然是在當(dāng)前hello world工程下,點(diǎn)擊IAR菜單欄Project->Edit Configurations繼續(xù)新建一個(gè)工程配置并以上面的HyperFlash_bootok為藍(lán)本將新的配置命名為“flexspi_code_sdram_data”如下圖,然后點(diǎn)擊Ok進(jìn)入該配置模式下;
(2)打開system_MIMXRT1052.c系統(tǒng)配置文件,也就是SystemInit函數(shù)所在的文件里面添加如下圖所示SDRAM初始化相關(guān)的函數(shù)并在SystemInit的最后調(diào)用就可以在使用SDRAM之前將其初始化(具體修改后的源文件見(jiàn)隨文檔附帶的壓縮包),而且初始化函數(shù)均是以C語(yǔ)言形式讀寫配置SDRAM相關(guān)寄存器,這樣的話即使SDRAM更換了也可以隨時(shí)修改初始化寄存器配置以適配不同的SDRAM了,俗話說(shuō)未知是最可怕的,而一旦都是開放的話就沒(méi)那么難了。至于SDRAM這塊的初始化是怎么找到的呢,實(shí)際上就是將SDRAM的預(yù)處理文件(當(dāng)前目錄下的evkmimxrt1050_sdram_init.mac)里面的命令用C語(yǔ)言實(shí)現(xiàn)了而已;
(3)由于仍然是為了兼容性問(wèn)題,上面使用了預(yù)編譯命令判斷HYBERFLASH_SDRAM宏來(lái)決定是否初始化SDRAM,所以在當(dāng)前工程配置下需要添加HYBERFLASH_SDRAM宏聲明以使在當(dāng)前工程配置下SDRAM初始化生效;
(4)然后需要修改下鏈接文件,將數(shù)據(jù)都分配到SDRAM地址范圍內(nèi),將MIMXRT1052xxxxx_hyperflash_nor_bootok.icf復(fù)制后重命名為MIMXRT1052xxxxx_flexspi_code_sdram_data.icf,打開該文件,添加data3相關(guān)信息之后保存該鏈接文件,并在Options->Linker文件里選擇新的鏈接文件(源文件見(jiàn)隨文檔附帶的壓縮包),點(diǎn)擊確定保存配置;
(5)一切都修改完畢之后,點(diǎn)擊編譯鏈接,再打開.map文件即可看到所有的數(shù)據(jù)變量已經(jīng)被分配到外部SDRAM的尋址空間里面了,最后再點(diǎn)擊debug將代碼下載到外部SPI Flash里面(注意SW7啟動(dòng)模式記得修改成HyperFlash啟動(dòng),因?yàn)楸纠友菔镜氖莄ode跑在HyperFlash里,數(shù)據(jù)跑在SDRAM里),這樣就完美實(shí)現(xiàn)代碼在SPI Flash里執(zhí)行而數(shù)據(jù)跑在SDRAM里。當(dāng)然,hello world本身沒(méi)多少數(shù)據(jù),大家可以把該功能照本宣科的poring到復(fù)雜一點(diǎn)的應(yīng)用里面或者在當(dāng)前工程里面自己memory alloc一段足夠大的數(shù)據(jù)區(qū),然后讀修改寫的去操作以測(cè)試該方法的可靠性,我這里就不多說(shuō)了。
GD和Winbond 3.3v QSPI Flash啟動(dòng)4
在第2.2章節(jié)里我已經(jīng)介紹了RT1050 EVK板載1.8v ISSI的QSPI Flash的啟動(dòng)方法,不過(guò)經(jīng)過(guò)一段時(shí)間客戶的反饋,實(shí)際上市面上常用的QSPI Flash目前以GD和Winbond的3.3v產(chǎn)品居多,物美價(jià)廉且采購(gòu)渠道豐富,所以我特意增加了第4章用來(lái)專門介紹下GD和Winbond 3.3v QSPI Flash啟動(dòng)方法并修改優(yōu)化了Keil下對(duì)這兩家QSPI Flash的燒寫算法供客戶在keil下擦寫和debug。
硬件上仍然是以我們官方RT1050的EVK板子為調(diào)試平臺(tái),在2.2章節(jié)的硬件改動(dòng)基礎(chǔ)上焊掉ISSI的QSPI Flash,換成GD的GD25Q32CSIG 3.3v QSPI Flash(3腳和7腳仍然上拉電阻到VDD),然后將下圖中EVK板子R49的0歐姆電阻去掉,R301用0歐姆電阻短接,即將Flash電源由之前的1.8v改成3.3v,其他部分硬件與2.2章節(jié)保持一致,接下來(lái)我介紹Keil環(huán)境下的配置方法(前面的示例用的IAR,這次用keil讓大家對(duì)IAR和keil下的開發(fā)配置都熟悉一遍):
(1)首先打開Keil下SDK開發(fā)包的hello_world_xip工程(路徑demo_apps\hello_world_xip\mdk,Keil自帶xip的工程),默認(rèn)只有hello_world_xip Flexspi_nor_debug和hello_world_xip Flexspi_nor_release兩個(gè)跑在板載HyperFlash的工程配置,點(diǎn)擊Keil菜單欄Project->Manage->Project Items,我們新添加一個(gè)工程配置hello_world_xip Qspi_nor_debug如下圖,然后選擇該工程配置為當(dāng)前工程,最后點(diǎn)擊OK確認(rèn):
(2)在新建的工程配置里,右鍵工程Options->C/C++,添加QSPI_BOOT和XIP_EXTERNAL_FLASH這兩個(gè)宏如下圖1,然后打開工程目錄下xip->fsl_flexspi_nor_flash.c文件,參考2.2章節(jié)中(2)點(diǎn),手動(dòng)添加QSPI的Flash Configuration Parameters元素信息如下圖2,有一點(diǎn)不同的是我們官方板子的ISSI QSPI Flash的最高時(shí)鐘可以到133MHz,而Winbond的QSPI最高到80MHz,GD QSPI最高到120MHz,我板子上自己焊了一塊GD的GD32Q32CSIG QSPI Flash,所以將serialClkFreq設(shè)定為kFlexSpiSerialClk_100MHz,然后sflashA1Size改成4M Bytes;
(3)由于keil下自帶了xip的工程,所以我們就直接復(fù)用其現(xiàn)成的.scf鏈接文件即可不用做修改,如下圖Options->Linker。而且keil下也已經(jīng)添加了Keep變量以防止xip這幾個(gè)元素信息因?yàn)槌绦蚶餂](méi)有調(diào)用而自動(dòng)被編譯器優(yōu)化掉(注意:下圖顯示窗口有限,實(shí)際上要keep的信息段包括.boot_hdr.ivt,.boot_hdr.boot_data,.boot_hdr.dcd_data和.boot_hdr.conf,格式參考下圖);
(4)至此我們編譯整個(gè)工程,最后打開生成的.map文件如下圖可以看到我們想要的幾個(gè)QSPI啟動(dòng)必須的元素信息頭都已經(jīng)正確的分配到image文件里了;
(5)支持QSPI啟動(dòng)的完整image文件通過(guò)以上幾步我們已經(jīng)解決了,接下來(lái)要解決keil下download、Erase和debug需要的QSPI Flash燒寫算法問(wèn)題,本文檔附帶的壓縮包文件里路徑Firmware\Keil_Algorithm下MIMXRT_QSPIFLASH.FLM文件為我已經(jīng)優(yōu)化修改好的可以支持ISSI,GD和Winbond燒寫的Flash算法,將其copy到keil安裝路徑下C:\Keil_v5\ARM\Flash即可,然后右鍵工程options->Debug-> CMSIS-DAP debugger,進(jìn)入settings->Flash Download,點(diǎn)擊Add找到如下圖所示的MIMXRT_QSPIFLASH(4KB Sec),另外建議給Flash算法預(yù)留的RAM空間大一些否則可能會(huì)導(dǎo)致算法運(yùn)行失敗,因?yàn)檫@個(gè)flash算法比較占空間,我這里修改成了0x4000大小是沒(méi)有問(wèn)題的;
(6)設(shè)置完畢之后,我們?cè)俅沃匦戮幾g整個(gè)工程,然后點(diǎn)擊F8或者keil菜單欄Flash->Download即可完成對(duì)外部QSPI的擦除和寫入,待燒寫完畢之后我們點(diǎn)擊debug即可正常調(diào)試(建議:如果程序做了修改,在編譯之后進(jìn)入debug之前先Download一次,再點(diǎn)debug),重新斷電之后程序也可以。
-
FlaSh
+關(guān)注
關(guān)注
10文章
1673瀏覽量
151310 -
SPI
+關(guān)注
關(guān)注
17文章
1790瀏覽量
95185
原文標(biāo)題:【博文精選】i.MXRT1050 從外部QSPI Nor Flash啟動(dòng)
文章出處:【微信號(hào):ChinaAET,微信公眾號(hào):電子技術(shù)應(yīng)用ChinaAET】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
串行Nor Flash的結(jié)構(gòu)和參數(shù)特性(1)

什么是串行Nor Flash?串行Nor Flash的結(jié)構(gòu)和參數(shù)特性

關(guān)于6657使用SPI連接的NOR啟動(dòng)的問(wèn)題
i.MXRTxxx系列ROM中靈活的串行NOR Flash啟動(dòng)硬復(fù)位引腳選擇
旺宏并行串行NOR Flash對(duì)比參考指南
串行SPI NOR閃存與并行NOR閃存之間的對(duì)比
一文了解SPI NAND Flash和SPI NOR Flash的區(qū)別
深入i.MXRT1050系列ROM中串行NOR Flash啟動(dòng)初始化流程

TWS藍(lán)牙耳機(jī)SPI NOR Flash
i.MX RT500/600系列上串行NOR Flash雙程序可交替啟動(dòng)設(shè)計(jì)

恩智浦i.MX RT1060/1010上串行NOR Flash冗余程序啟動(dòng)設(shè)計(jì)

物聯(lián)網(wǎng)行業(yè)存儲(chǔ)方案詳解_SPI NOR Flash

評(píng)論