【原創】All in One i.MXRT1050/RT1020 SPI Flash Algorithm for J-Flash
2020年,這個給大家一種很漫長的恍惚感的一年,終於是過去了。這一年我們很多新的人生第一次就這麼被髮生了,第一次居家辦公這麼長時間(很多人肥膘都長了不少,我卻瘦了2斤,不知是工作太積極了還是被家裡小怪獸給折磨的),第一次戴口罩這麼長時間(大大超過了前兩年北方霧霾嚴重的時候),第一次大家見面打招呼可以調侃一句"核酸"了沒(北京人回答:“陰著呢”),第一次學生和老師這兩個角色在非培訓班的時候要上網課(此處家長兩行淚),第一次在外留學生這麼想回國,第一次這麼多國人吃瓜看美國大選(現在大家對美國的選舉制度瞭解的比咱自己國家的還清楚),臨末了(liao)還第一次聽說於正和郭敬明知道道歉了(這上哪兒說理去,呵呵)。。。不管怎樣,這個不平凡的一年算是過去了,未來可期,2021希望我們都能撥雲見日看到風雨後的彩虹,對我個人來講,期望新的一年家人身體健康最重要。下面且談本篇正題(文末有新訊息跟大家說):
在閱讀此文之前強烈建議先通讀一遍我在
測試平臺
Board: i.MXRT1021_EVK, i.MXRT1050_EVK
SPI Flash: IS25LP64, GD25Q32, S26KS512(HyperFlash)
Tool: J-Link_v9, J-Flash_v6.90, Keil_v5.31, Segger Embeded Studio_v5.4
使用方法:
(1)在AllinOne Flash Algorithm for J-Flash專案中我建立了兩個演算法工程,其中一個為Keil版本的CMSIS標準flash演算法(生成.FLM演算法檔案),另外一個為Segger公司提供的Segger Embeded Studio版本的快速Flash演算法(.elf演算法檔案),J-Flash兩種演算法都可以支援,只是道理大家都明白,畢竟J-Flash一套都是Segger自家親兒子,Segger提供的那一套快速Flash演算法模板,我移植過去之後親測速度非常快,尤其是Verify過程(唰的一下,飛一般的感覺~),它使用了CRC校驗的方法而非標準CMSIS的回讀比對方式校驗,效率提高了幾倍不止,只是CRC校驗方法Segger只提供了Segger Embeded Studio版本編譯的靜態庫(Segger好心機啊。。。),所以我不得不單獨建立了一個Embeded Studio演算法工程;
(2)從我的[Github repo](https://github.com/jicheng0622/All-in-One-Flash-Algorithm-for-RT1050-RT1020)下載AllinOne Flash Algorithm for J-Flash兩個程式碼工程(Keil版本和Segger Embeded Studio版本),看個人喜好選擇其中一種(個人推薦後者,Embeded Studio雖然是後來之秀,但是我一直很盲目的崇拜和相信Segger,用起來的確很舒爽),選擇分別選擇FlashRT1020_SPINor和FlashRT1050_SPINor編譯通過,此時可以在工程目錄下生成FlashIMXRT1020_SPINor.FLM和FlashIMXRT1050_SPINor.FLM演算法檔案(Keil版本,路徑根目錄)或者FlashIMXRT1020_SPINor.elf和FlashIMXRT1050_SPINor.elf演算法檔案(Segger版本,路徑\Output\FlashIMXRT1050_SPINor\Exe);
注意:Keil下的FLM演算法檔案與J-Flash下的FLM演算法檔案不能通用
(3)將Flash演算法檔案分別對應地拷貝到J-link安裝目錄下\SEGGER\JLink_V690\Devices\NXP\iMXRT102x和\SEGGER\JLink_V690\Devices\NXP\iMXRT105x資料夾裡;
(4)回到J-link安裝目錄\SEGGER\JLink_V690路徑下,用文字編輯工具(e.g Notepad++)開啟JLinkDevices.xml檔案,將RT1020和RT1050的flash演算法路徑資訊新增到該檔案裡如下圖(在Jlink_v6.90的xml檔案裡預設有RT1050的路徑資訊,只需要參考下圖修改flash演算法的名字即可,而RT1020的路徑資訊沒有,它包含在Jlink的DLL動態連結庫裡,所以需要完整新增下圖中關於RT1020的所有資訊以覆蓋DLL裡的內容),為了方便大家拷貝新增資訊我也把Jlink_v6.90裡修改過的JLinkDevices.xml原始檔一併上傳到github程式碼倉庫裡(路徑All-in-One-Flash-Algorithm-for-RT1050-RT1020/J-Flash);
重要提示:如果是Segger版本的話,記得把下圖中的所有FlashIMXRT1050_SPINor.FLM和FlashIMXRT1020_SPINor.FLM字尾都改為FlashIMXRT1050_SPINor.elf和FlashIMXRT1020_SPINor.elf
(5)開啟J-Flash工具建立新Project,在Target Device列表裡選擇RT1021或者RT1052,另外要注意的是i.MXRT系列預設的除錯埠為SWD而非JTAG(使能JTAG除錯需要提前燒eFuse配置才可以)。工程建立完畢之後,我們上述新新增的Flash燒寫演算法實際上已經被J-Flash先load進去了,此時如果是官方RT1021/RT1052_EVK預設板載Flash的話,我們把待燒寫的bin/hex/srec檔案拖到J-Flash工具裡之後就可以點選選單欄Target->Connect或者直接點選Target->Production Programming觸發J-Link燒寫image到目標晶片上了。
如何給J-Flash Flash燒寫演算法傳入命令配置字
如我在AllinOne Flash Algorithm for IAR專案裡的詳細解釋,該演算法可以支援符合JEDEC-216A及以後版本直接燒寫,因為QE bit即4線使能位可以通過SFDP命令讀取出來,這樣演算法可以解析命令並自動把QE bit置位,而對於老版本的JEDEC216 SPI Flash(市面上很多常用的QSPI Flash仍然是該版本),flash演算法無法自動獲取QE的位置和對應的使能命令,此時就需要手動地給Flash演算法輸入一個Option0命令告訴它怎麼去使能QE(至於如何獲取不同JEDEC216 QSPI Flash的Option0命令請參考AllinOne Flash Algorithm for IAR專案裡面的說明),此外如果外部QSPI Flash掛在RT1050的Secondary pinmux組上作為啟動裝置的話還要另外輸入Option1命令。那在J-Flash裡如何給Flash演算法輸入這兩個引數呢?
我這裡給了一種解決方案,點選J-Flash選單欄Options->Project settings,在裡面找到Init. steps,在裡面新增如下圖的4條命令,即在指定的memory address(0x20201000~0x20201010 RT1020/1050的OCRAM定址空間)裡輸入Option0和Option1的標誌和引數(0x4F707430位Opt0的ASCII碼,另外之所以加標誌判斷是確保Opt0/1的value是我們輸入的而不是OCRAM本身的不確定的值),然後在flash演算法裡新增對應的判斷和解析處理,這樣即可完成外部引數的輸入了。
至此我們就完全實現了AllinOne Flash Algorithm for J-Flash的功能了,此時我們再點選Target->Connect或者Target->Production Programming即可觸發J-Link對目標晶片的燒寫了。實際上相比於IAR裡的區別,J-Flash只是需要解決Option0和Option1的外部引數輸入問題,下面我也是給出了幾個常用的QSPI Norflash配置字的示例供大家參考。
常用QSPI Norflash配置字示例
當然如果是使用者片外的SPI Flash型號固定不變的話,最簡單的方式就是直接開啟Keil Flash演算法工程然後修改預設的Option0和Option1的配置,重新編譯生成你想要的FLM演算法檔案之參考上面提到第(2)和第(3)步去做即可。
至此本篇文章算是結束了,大家如果針對此專案在使用過程中如果遇到什麼問題可以到我的github respo.下提交issue或者發郵件給我交流(github專案裡有我郵箱)。此外,此前一直堅守在AET部落格裡不願動彈(