【原創】i.MXRT J-Flash燒寫演演算法使能eFuse熔絲位寫入

2022-10-29 06:00:46
​       臨近年底,終於又憋了一篇文章出來,本來年初的時候是有計劃把去年總結的一些東西整理下發布出來的,結果還是被工作和生活上各種瑣事給耽擱了。哎,今年剛過了自己35歲的生日,眼瞅著這個人生節點過來了,未來該如何走呢,目前還真沒想好。回首這不到一年的時間,發生了好多大事情,年初悲痛的東航事件,尷尬的上海疫情封城,全國人民直播觀看佩羅西訪臺,俄烏戰爭從年初打到現在還沒完,到現在剛剛結束的二十大,一年的時間很短,短到等我意識到寫第二篇部落格時已經快要到年底了,一年時間又很長,長到這麼一年的時間裡會發生這麼多的事情。哎,珍惜身邊人,繼續提升自己,然後迎接即將到來的2023(咳咳,還有倆月。。。)

       好吧,前文還在各種感慨各種裝x然後立刻切換到技術上來貌似有點生硬有點突兀,不過看我部落格的人都習慣我嘮叨了,不影響大家學習知識就好,哈哈。。。下文進入正題。

       i.MXRT系列在Internal Boot模式下正常啟動時,預設設定會在POR_B復位管腳上升沿的時刻從Boot CFG GPIO管腳獲取到電平狀態並裝載到SRC_SBMR1暫存器,然後BOOT_ROM會以該暫存器的值來決定外部啟動裝置的型別和相關的啟動設定,比如Flexspi介面啟動還是SEMC介面啟動還是SDHC啟動,還有Flexspi是Norflash啟動還是Nandflash啟動,以及啟動時的時脈頻率和使用的哪組管腳設定,具體請查詢i.MXRT RM手冊SystemBoot章節(注意不同RT系列,它的BOOT_CFG對應的IO管腳可能是不一樣的,下圖是RT1060的)。


       不過在實際應用中,有些系統設計對IO利用率要求較高,由於可用IO數量不夠而使用到BOOT_CFG相關的IO管腳同時外部電路又沒辦法保證在剛上電時POR_B上升沿時刻這些管腳的電平狀態是可控的,這種情況下如果繼續使用Internal Boot模式下的預設設定則可能會由於啟動設定裝載的IO狀態不是預期的進而導致MCU啟動失敗(可通過dump SRC_SBMR1暫存器看到BOOT_CFG訊號不正常非預期)。針對這種情況,i.MXRT在Internal Boot模式下提供了從內部eFuse熔絲位獲取啟動設定的方式,即MCU上電覆位後不再從BOOT_CFG IO管腳電平獲取啟動設定而是使用內部eFuse的設定,具體見RM手冊SystemBoot章節如下圖,當內部熔絲位BT_FUSE_SEL寫成1之後(出廠預設為0),GPIO狀態不再決定啟動設定而是由eFuse熔絲內部的BOOT_CFG1和BOOT_CFG2位決定。

       從上述解釋說明我們知道了通過燒寫內部eFuse熔絲位BT_FUSE_SEL和BOOT_CFG1和2可以決定RT的啟動設定,那這兩個熔絲位的位置具體在哪裡以及如何寫入。從RT的RM手冊裡Fusemap章節找到boot fusemap table如下,可以看到BOOT_CFG1和2位於eFuse地址0x450的[15:0]位,BT_FUSE_SEL位於地址0x460的bit4位元,這些eFuse位出廠預設均為0,如果使用者的外部Flash是我們平時最常用的QSPI Flash的話,則從下圖eFuse位說明可以看到BOOT_CFG1和2位不需要再寫入(保持0即可),我們只需要把BT_FUSE_SEL寫1即可(注意eFuse只能從0寫成1,而且只能寫一次)。

       本專案最新的Flash燒寫演演算法新加入了對eFuse熔絲位的寫入支援,一旦使能了該功能後,使用者在給RT下載更新程式的同時也會寫入eFuse,對使用者來說是無感的,最大程度減少使用者額外的操作,不過對eFuse的寫入大家一定要謹慎,因為eFuse一旦從0寫成1就無法再逆向回去了 (這也是叫做熔絲位的原因)。如下圖,加入了eFuse的寫入,不過預設是不生效的,使用者如果想使能eFuse的燒寫的話,需要開啟BT_FUSE這個宏然後重新編譯生成對應的elf檔案,再參考我之前的一篇文章<All in One i.MXRT1050/RT1020 SPI Flash Algorithm for J-Flash>更新到J-Flash的支援裡面去。

       對於上述的eFuse寫入程式碼,這裡簡單解釋一下,由於eFuse是一塊獨立的物理儲存空間不在CPU內部的4G可定址空間範圍內,要對其進行操作需要藉助於OCOTP控制器,而eFuse的地址和OCOTP裡的地址有個對映關係即eFuse address = OCOTP index * 0x10 + 0x400,所以上圖中我們傳入OCOTP的引數0x06對應的是eFuse空間中的0x460,也就是BT_FUSE_SEL熔絲位所在的物理空間地址。如果使用者想要操作其他eFuse空間,則可以參考該程式碼中的API用法自行新增和修改,但是一定要注意對eFuse的操作是一次性的。

       本文的最新程式碼和檔案我已update到我的github倉庫,歡迎下載和star。老話繼續,本文首發ChinaAET,續發於CSDN和部落格園,未完待續!

jicheng0622/All-in-One-Flash-Algorithm-for-NXP-i.MXRT: A Uniform Flashloader Algorithm for NXP i.MXRT MCU family on different IDEs (github.com)