串行下載下傳功能即BootROM中實作了通過串行接口(UART/USB...)與上位機通訊,将客戶App資料燒錄進外部啟動裝置中,這個功能主要用于量産,但在實際應用過程中,通過首推的啟動引腳(ISP[2:0] / BT_MODE[1:0])配置進入串行下載下傳模式的方式有時候不友善,因為引腳狀态不友善切換,本文痞子衡将給大家介紹一種不需要切換啟動引腳進入串行下載下傳模式的方法。
大家好,我是痞子衡,是正經搞技術的痞子。今天痞子衡給大家介紹的是i.MXRT下在App中利用ROM API進ISP/SDP模式的方法。
我們知道i.MXRT系列分為兩大陣營:CM33核心的i.MXRTxxx系列和CM7核心的i.MXRT1xxx系列,但是這兩個陣營都有一個共性,那就是都沒有内部非易失性存儲器(NVM)并且BootROM裡都內建了串行下載下傳功能。
串行下載下傳功能即BootROM中實作了通過串行接口(UART/USB...)與上位機通訊,将客戶App資料燒錄進外部啟動裝置中,這個功能主要用于量産,但在實際應用過程中,通過首推的啟動引腳(ISP[2:0] / BT_MODE[1:0])配置進入串行下載下傳模式的方式有時候不友善,因為引腳狀态不友善切換,本文痞子衡将給大家介紹一種不需要切換啟動引腳進入串行下載下傳模式的方法。
痞子衡很早前寫過兩篇文章,詳細介紹了 《i.MXRTxxx的串行下載下傳模式(ISP)》、《i.MXRT1xxx的串行下載下傳模式(SDP)》,此處再簡單回顧一下。
i.MXRTxxx系列用于配置進入串行下載下傳模式的啟動引腳有3個,即ISP[2:0],這三個引腳在系統軟複位後由BootROM直接進行軟采樣,BootROM根據ISP[2:0]值判斷是否進入串行下載下傳模式,串行接口支援UART/SPI/USB-HID三種,燒錄算法是直接內建在BootROM中的,可以直接燒錄App。
i.MXRT1xxx系列用于配置進入串行下載下傳模式的啟動引腳有2個,即BT_MODE[2:0],這兩個引腳僅在系統POR複位時由系統硬采樣儲存到非易失性寄存器SRC->SBMR2中,BootROM從SRC->SBMR2寄存器中擷取BT_MODE[2:0]值判斷是否進入串行下載下傳模式,串行接口支援UART/USB-HID兩種,因為BootROM中沒有內建燒錄算法,是以需要加載一個專用的Flashloader來燒錄App。
在恩智浦官方i.MXRT開發闆設計上,外部啟動引腳是連接配接的撥碼開關,是以我們可以通過切換撥碼開關并複位的方式來進入ROM串行下載下傳模式,但實際應用場景下,客戶闆卡并不會留有撥碼開關,更多的是用上下拉電阻的方式确定啟動模式,而且預設設定的啟動模式是從Flash啟動。
當客戶闆卡首次上電,且連接配接的啟動Flash是空白時,即使啟動模式設定的是從Flash啟動,但由于Flash裡并沒有App,是以BootROM在啟動App失敗後還是會自動進入串行下載下傳模式,這意味着至少可以進一次串行下載下傳模式。當成功使用串行下載下傳模式将App燒錄進啟動Flash之後,再次上電,此時闆卡便會從ROM跳轉到App執行,這種情況下,除非改變啟動引腳輸入狀态,不然永遠不會再次進入串行下載下傳模式。而在客戶闆卡上改變啟動引腳狀态便意味着要重新焊接闆子,改變啟動引腳的上下拉電阻,這當然很不友善。
那麼有沒有不改變啟動引腳狀态就進入ROM串行下載下傳模式的方法呢?答案當然是有。痞子衡之前寫過一篇文章 《了解i.MXRTxxx系列ROM API及其與i.MXRT1xxx系列的差異》,把i.MXRT全系列ROM API都捋了一遍。如果你足夠細心會發現它們都有一個共同的API,名字叫runBootloader:
關于這個runBootloader API函數可在參考手冊中找到相關解釋,從文檔中來看,這個函數的作用主要有兩個:一、IAP後直接去啟動新更新的App;二、重新進ROM串行下載下傳模式去更新App。這第二個功能不正是我們要的效果嗎,讓我們試一試。
根據前面介紹的ROM API知識,讓我們在App中把runBootloader函數重定義一下,runBootloader函數原型與API中原型保持一緻,其函數實作就直接調用API:
App中有了runBootloader函數,下一步就是傳參調用。先說調用,其實這裡就相當于切換啟動引腳操作了,因為我們不想切換啟動引腳,是以我們需要在App中插入一段runBootloader函數調用代碼,并且需要為它設計一個專用的觸發方式(比如可以是某個引腳中斷,也可以是序列槽收到某個指令等等,這裡客戶自由發揮)。解決了調用問題,下一步就是傳什麼參數,參考手冊裡有詳細的參數各bit定義,下面是進入USB下載下傳模式的示例代碼:
Note:實際上i.MXRT1015/1020/1050三款型号并不支援通過API進入ROM SDP模式,原因見附錄三
下圖是i.MXRT500中arg位定義,進入USB下載下傳模式參數值應是0xeb130000:

下圖是i.MXRT1060中arg位定義,進入USB下載下傳模式參數值應是0xeb100000或0xeb110000:
runBootloader(&arg)函數執行完之後,此時在USB OTG1口上插上USB線應該可以看到電腦裝置上重新枚舉了HID裝置,然後就可以使用配套上位機工具(比如MCUBootUtility)進行App更新下載下傳了。
附錄收錄了i.MXRT兩大陣營代表型号的ROM API中runBootloader具體實作,其中i.MXRTxxx系列對應執行個體是bootloader_user_entry()函數,i.MXRT1xxx系列對應執行個體是run_bootloader()函數,這兩個函數的核心思想都是在晶片某個非易失性(軟複位不置位)的寄存器中将使用者傳入的參數值儲存下來,然後調用NVIC軟複位函數重新進入BootROM,由BootROM來處理使用者傳入的參數:
雖然我們在i.MXRT1015/1020/1050三款型号上讀API tree能夠發現runBootloader成員是有非0值的,但其具體函數如下,是以不支援重入ROM SDP模式,效果類似于軟複位。
至此,i.MXRT下在App中利用ROM API進ISP/SDP模式的方法痞子衡便介紹完畢了,掌聲在哪裡~~~
文章會同時釋出到我的 部落格園首頁、CSDN首頁、知乎首頁、微信公衆号 平台上。
微信搜尋"痞子衡嵌入式"或者掃描下面二維碼,就可以在手機上第一時間看了哦。
最後歡迎關注痞子衡個人微信公衆号【痞子衡嵌入式】,一個專注嵌入式技術的公衆号,跟着痞子衡一起玩轉嵌入式。
衡傑(痞子衡),目前就職于恩智浦MCU系統部門,擔任嵌入式系統應用工程師。
專欄内所有文章的轉載請注明出處:http://www.cnblogs.com/henjay724/
與痞子衡進一步交流或咨詢業務合作請發郵件至 [email protected]
可以關注痞子衡的Github首頁 https://github.com/JayHeng,有很多好玩的嵌入式項目。
關于專欄文章有任何疑問請直接在部落格下面留言,痞子衡會及時回複免費(劃重點)答疑。
痞子衡郵箱已被私信擠爆,技術問題不推薦私信,堅持私信請先掃碼付款(5元起步)再發。