通常的Cortex-M內核MCU一般都會內嵌並行NOR Flash,這個並行NOR Flash是直接掛在Cortex-M內核高性能AHB匯流排上的,知名IDE如果支持這款MCU,也都會同時集成對應Flash的下載演算法,方便用戶直接在IDE里下載代碼進Flash和XIP調試,但是i.MXRT內部並沒有F... ...
大家好,我是痞子衡,是正經搞技術的痞子。今天痞子衡給大家介紹的是飛思卡爾i.MX RTyyyy系列EVK在串列NOR Flash調試的原理。
本文是i.MXRT硬體那些事系列第二篇的續集,在第二篇首集中痞子衡給大家詳細介紹了EVK板載調試器用法,有了調試器在手,從此調試不用愁。從調試代碼所在目標存儲器類別上來分,調試一般分為在SRAM調試和在Flash調試。在SRAM調試實現比較簡單,程式直接從JTAG/SWD口灌進RAM即可;在Flash調試,則相對複雜一點,因為首先需要有Flash下載演算法,下載成功後才能調試。
通常的Cortex-M內核MCU一般都會內嵌並行NOR Flash,這個並行NOR Flash是直接掛在Cortex-M內核高性能AHB匯流排上的,知名IDE如果支持這款MCU,也都會同時集成對應Flash的下載演算法,方便用戶直接在IDE里下載代碼進Flash和XIP調試,但是i.MXRT內部並沒有Flash,用戶需要自己外接Flash,那該怎麼辦?還能線上XIP調試麽?彆著急,i.MXRT可以支持外接並行NOR和串列NOR實現XIP,從節省管腳數的角度,最常見的做法是將串列NOR Flash掛在i.MXRT FlexSPI匯流排上,FlexSPI支持XIP特性,所以原理上可以實現線上調試,今天痞子衡就為大家介紹i.MXRT上在外部串列Flash調試的原理:
一、ARM CoreSight調試架構
要實現在串列Flash調試,首先要能對內核進行調試。i.MXRT晶元是基於Cortex-M內核的,而Cortex內核的調試和跟蹤,當然離不開CoreSight,它是ARM公司於2004年推出的一種新的調試體繫結構,也是內核授權的一部分。
CoreSight功能非常強大,其包含了很多調試組件(即各種協議),下圖來自於 CoreSight技術簡介手冊,圖中標出了CoreSight架構下的各種調試組件之間的聯繫,這麼多組件一下子看起來會有點暈,如果我們按功能將這些組件分組,它們可以被分成如下三組:
- 源部件(Source):晶元上跟蹤數據的來源,產生跟蹤數據發送到ATB(AMBA Trace Bus)。比如STM和ETM都屬於Source部分。
- 控制訪問部件(Sink):配置和控制數據流的產生,但是不產生數據流,即那些可以保持從Source過來數據的模塊。比如DAP和ECT(包含CTI和CTM)都屬於Sink部分。
- 匯聚點(Link):晶元上跟蹤數據的終點,用於引導從Source到Sink過程中的類似於通道作用的模塊。比如TPIU、ETB和SWO都屬於匯聚點。
本文主要是概述性地介紹i.MXRT在外部串列Flash調試的原理,並不想深入探析CoreSight,因此對於CoreSight,我們只需要知道是它完成了主要的調試工作,而CoreSight唯一的依賴就是要保證能通過DAP組件從AMBA匯流排實時訪問系統記憶體和外設寄存器(當然包括外部串列Flash中的代碼)。
二、i.MXRT FlexSPI外設特性
要實現在串列Flash調試,其次是代碼要能在串列Flash中XIP(原地執行),即CPU要能實時從串列Flash中任意位置取指令和數據。本文講的串列Flash一般指SPI介面的NOR Flash,SPI模式可以是Single/Dual/Quad/Octal。無論是哪種SPI模式,這種介面的Flash本質上都屬於串列Flash,地址線和數據線不僅共用而且是串列的。而按照通常的理解,要能夠實現XIP,Flash應該是並行匯流排介面掛在AMBA上,這個並行匯流排應有獨立的地址線和數據線,且地址線寬度跟Flash大小相對應。那麼串列Flash為什麼能在i.MXRT上實現XIP呢?答案就是FlexSPI外設。
讓我們打開RT1050參考手冊,找到FlexSPI外設章節,可以看到如下FlexSPI模塊框圖,框圖右邊是FlexSPI與外部串列Flash的信號連接,框圖左邊是FlexSPI與i.MXRT系統內部匯流排連接,匯流排連接分為兩種,分別是32bit IPS BUS(即手動操作FlexSPI寄存器發送Flash讀寫命令),64bit AHB BUS(由FlexSPI翻譯AHB訪問地址並自動發送相應Flash讀寫命令),串列Flash能夠XIP的奧秘就在FlexSPI外設的AHB BUS連接。
關於這個64bit AHB BUS連接,我們可以FlexSPI特性里的Memory mapped read/write access by AHB Bus一欄找到更多細節。i.MXRT為FlexSPI外設在系統記憶體里分配了AHB訪問地址映射(對於XIP調試來說主要是讀訪問),當CPU取指到FlexSPI AHB地址映射空間時,FlexSPI外設會自動完成從外部串列Flash讀取指令數據的工作,並將指令數據存放到AHB RX buffer里(一共8個),CPU直接從AHB RX buffer里獲取指令去執行,AHB RX buffer可以有效降低讀延時。
- AHB RX Buffer implemented to reduce read latency. Total AHB RX Buffer size: 128 x 64 Bits
- 16 AHB masters supported with priority for read access
- 8 flexible and configurable buffers in AHB RX Buffer
- AHB TX Buffer implemented to buffer all write data from one AHB burst. AHB TX Buffer size: 8 x 64 Bits
- All AHB masters share this AHB TX Buffer. No AHB master number limitation for Write Access.
關於FlexSPI AHB地址映射,可見下麵的RT1050 memory map表,AHB映射起始地址為0x60000000,最大支持504MB的空間(適用RT1010/RT1020/RT1050/RT1060)。如果是RT1064,AHB映射起始地址改為0x70000000;如果是RT1170,除了0x60000000映射地址外還新增了0x30000000的地址映射。FlexSPI AHB映射地址讀訪問包含以下特點:
- Cachable and Non-Cachable access
- Prefetch Enable/Disable
- Burst size: 8/16/32/64 bits
- All burst type: SINGLE/INCR/WRAP4/INCR4/WRAP8/INCR8/WRAP16/INCR16
三、串列NOR Flash下載演算法
要實現在串列Flash調試,最後要確保代碼被成功下載到串列Flash中。串列Flash的讀寫不像訪問RAM那樣簡單,是需要一套專門的FlexSPI NOR Flash驅動的,即所謂的Flash下載演算法。
串列Flash種類很多,雖然大多都符合JESD216標準,但是具體到某個廠家生產的Flash,還是有細微區別的。有的Flash下載演算法力求支持儘可能多的Flash,而有的Flash下載演算法則僅針對某個系列Flash。不管是哪種Flash下載演算法,對於i.MXRT這樣沒有內部Flash的晶元而言,Flash下載演算法都是要跟具體的i.MXRT開發板相關聯的,因為開發板決定了Flash連接的pinmux,Flash下載演算法里FlexSPI管腳初始化要與開發板相匹配。
每個IDE的Flash下載演算法設計不盡相同,本文暫不詳細介紹具體Flash下載演算法,後續文章會對常見IDE的Flash下載演算法設計進行詳解。
四、在串列Flash調試過程
CoreSight架構,FlexSPI特性,NOR Flash下載演算法都介紹過了,在串列Flash調試的充分條件都有了。現在痞子衡為大家綜合介紹一下調試過程。下麵是痞子衡特地畫的簡圖,其實調試過程概述起來並不複雜,當你啟動IDE調試時,預先放在IDE里的Flash下載演算法(可執行文件)會首先通過調試器下載到i.MXRT內部FlexRAM中,下載演算法需要提供FlexSPI外設初始化和NOR Flash擦除、燒寫功能API,然後調試器繼續將應用程式代碼(二進位機器碼)分段緩存在FlexRAM里,並調用Flash下載演算法API去完成應用程式的燒寫(從FlexRAM到Flash中),應用程式完全下載結束之後,便由CoreSight開始接管調試工作,此時CPU已經可以通過AHB匯流排訪問掛在FlexSPI外設上的串列Flash里的應用程式代碼數據,所以CoreSight當然可以完成實時代碼運行控制與跟蹤,你在IDE里也就可以進行單步調試啦。
至此,飛思卡爾i.MX RTyyyy系列EVK在串列NOR Flash調試的原理痞子衡便介紹完畢了,掌聲在哪裡~~~