Rt1052從外部啟動 keil測試


當 RT105x 板載的 Boot 模式跳線帽短接到NC, 系統會通過片上的 FlexSPI 接口執行外部串行SPI Nor Flash 的啟動, 其啟動地址為 Table1-2 所示的 0x6000_0000(如果是從並行的 NorFlash 啟動則啟動地址為 0x8000_0000) , 關於其他 Boot pin 對啟動模式的配置影響,見
RT105x 的 RM 手冊 8.6 章節,這里就不細說了。 

 

 

 

如圖 1 所示為完整的 SPI Nor Flash 啟動流程圖, 當 RT105x 的片上 ROM 在檢測到啟動模式為 FlexSPI 接口后, 會根據 Boot Pin 的配置信息配置該模式下需要使用的 FlexSPI 接口管腳的復用模式並將 FlexSPI 的時鍾配置成默認的低速 30MHz, 然后會以 0x6000_0000 為首地址讀取前 512 個字節作為外部 Flash 的配置信息( 即 Flash Configuration Parameters, 包括幾線制的 SPI Flash, SPI 的時鍾頻率, LUT 查找表, DDR/SDR 模式以及片選 CS 管腳的 Hold/Setup Time 等信息,見 RM8.6.3 章節) 並以此來配置 FlexSPI 模塊以滿足外部 Flash 的特性, 待配置
完畢后, RT105x CPU 以后即會以 AHB 總線讀取數據和指令的方式(雖然從外部來看仍然是FlexSPI 接口, 但是由於 LUT 查找表讀取數據的指令已經配置好, CPU 只是通過 AHB 總線發送讀取指令即可觸發 LUT 以操作外部 Flash, 也就是說在內部對 CPU 來講已經屏蔽掉了 FlexSPI 的
底層) 來讀取接下來的跟用戶 Image 相關的幾個關鍵信息, 即 IVT(Image Vector Table),Boot Data 和 DCD( Device configuration data)如圖 2, 其中 IVT 需要放在外部 Flash 的固定偏移地址( 如圖 3,對 Nor Flash 來說其需要存儲在基地址 + 4KB 的偏移地址, 比如0x60000000+4*1024) 供 ROM 讀取以便讓系統知道用戶 Image 的第一條可執行指令放在了哪里以

l 及 BootData 和 DCD 的存放地址, BootData 則保存了完整 Image 的首地址和整個 image 所占的 空間大小, 而 DCD 則包含了一些配置命令以便在跳到用戶程序入口之前供 ROM 調用配置內部外設以更好的匹配外部 IC,一般如果系統外掛了 SDRAM 的情況則需要配置好 DCD( 因為有時需要
主程序在跑起來之前,外部 SDRAM 就得處在 ready 狀態, 以供 CPU 把 data 或者 code copy 到SDRAM 里時不會出錯)。 

 

 綜上所述,我們實際上就可以得出結論來,如果要讓系統能正常 Boot 起來,則燒寫到外部串行 SPI Flash 里面的完整 image 必須要包括五個重要元素,即 Flash ConfigurationParameters, IVT, Boot Data, DCD 和用戶 image, 而其中 Flash Configuration Parameters和 IVT 是存放在固定的地址的,而后三者則由 IVT 的內容來決定, 無論是直接編譯生成或者通過輔助工具手動添加,只要我們最后形成的 image 里面包含了這幾個元素, CPU 就會認可這個
image 並執行(先不談安全加密的事) 。 所以我們只要搞清楚這個基本原理了, 無論是什么方法, 最后都是殊途同歸, 下面就可以放心大膽地去解決 RT105x 的 FlesSPI 啟動問題了 

 工程配置里,右鍵工程 Options->C/C++,添加 QSPI_BOOT 和
XIP_EXTERNAL_FLASH 這兩個宏如下圖 1 

 

 

 添加兩個文件,fsl_flexspi_nor_boot.cfsl_flexspi_nor_flash.c.scf 鏈接文件 使用KEIL安裝目錄下的xip工程的scf文件即:MIMXRT1052xxxxx_flexspi_nor_sdram。而且 keil 下也已經添加了 Keep 變量以防止 xip 這幾個元素信息因為程序里沒有調用而自動被編譯器優化掉(注意:下圖顯示窗口有限,實際上要 keep 的信息段.boot_hdr.ivt, .boot_hdr.boot_data, .boot_hdr.dcd_data和.boot_hdr.conf,格式參考下圖)

至此我們編譯整個工程,最后打開生成的.map 文件如下圖可以看到我們想要的幾個 QSPI啟動必須的元素信息頭都已經正確的分配到 image 文件里了;   

 

 

 

 

看下startup_MIMXRT1052.S文件其中有復位啟動流程:

Reset_Handler   PROC

                EXPORT  Reset_Handler             [WEAK]

                IMPORT  SystemInit  

 ...

   LDR     R2, [R1]

                MSR     MSP, R2

                LDR     R0, =SystemInit

                BLX     R0

                CPSIE   i               ; Unmask interrupts

                LDR     R0, =__main

                BX      R0

                ENDP

打開system_MIMXRT1052.c系統配置文件,也就是SystemInit函數所在的文件里面添加如下圖所示SDRAM初始化相關的函數並在SystemInit的最后調用就可以在使用SDRAM之前將其初始化(具體修改后的源文件見隨文檔附帶的壓縮包),而且初始化函數均是以C語言形式讀寫配置SDRAM相關寄存器,這樣的話即使SDRAM更換了也可以隨時修改初始化寄存器配置以適配不同的SDRAM了,俗話說未知是最可怕的,而一旦都是開放的話就

沒那么難了。至於SDRAM這塊的初始化是怎么找到的呢,實際上就是將SDRAM的預處理文件(當前目錄下的evkmimxrt1050_sdram_init.mac)里面的命令用C語言實現了而已。

void SystemInit (void) {

#if 1 //SEMCW9825_SDRAM

    SDRAM_Init();

#endif

 

}

上面使用了預編譯命令判斷HYBERFLASH_SDRAM宏來決定是否初始化SDRAM,所以在當前工程配置下需要添加HYBERFLASH_SDRAM宏聲明以使在當前工程配置下SDRAM初始化生效

接下來要解決keil下download、Erase和debug需要的QSPI Flash燒寫算法問題,本文檔附帶的壓縮包文件里路徑Firmware\Keil_Algorithm下MIMXRT_QSPIFLASH.FLM文件為我已經優化修改好的可以支持ISSI,GD和Winbond燒寫的Flash算法,將其copy到keil安裝路徑下C:\Keil_v5\ARM\Flash即可,然后右鍵工程options->Debug-> CMSIS-DAP debugger,進入settings->Flash Download,點擊Add找到如下圖所示的MIMXRT_QSPIFLASH(4KB Sec),另外建議給Flash算法預留的RAM空間大一些否則可能會導致算法運行失敗,因為這個flash算法比較占空間,我這里修改成了0x4000大小是沒有問題的;

設置完畢之后,我們再次重新編譯整個工程,然后點擊F8或者keil菜單欄Flash->Download即可完成對外部QSPI的擦除和寫入,待燒寫完畢之后我們點擊debug即可正常調試(建議:如果程序做了修改,在編譯之后進入debug之前先Download一次,再點debug),重新斷電之后程序也可以。

注意:藍色字是重點!!

 

注意1:在APP初始化里面不需要對semc再次初始化,因為在sysInit里面已經初始化完成了,不然會造成死機。

/ CLOCK_SetMux(kCLOCK_SemcMux,0); //PERIPH_CLK作為SEMC時鍾源,PERIPH_CLK=600M

 

    //CLOCK_SetDiv(kCLOCK_SemcDiv,3); //設置SEMC時鍾由PERIPH_CLK四分頻得到,即SEMC Clock=600/4=150Mhz

 

注意2:在Ini文件里面,不需要再次對semi外部SDRAM初始化。

 

原來增加的代碼可以刪除。支持 QSPI 啟動的完整 image 文件通過以上幾步我們已經解決了 !

文章參考了網友的文章,若有侵權請聯系我刪除,謝謝。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM