STM32有一顆什麼樣的“心”?

STM32有一颗什么样的“心”?

MCU的主要組成有:內核、儲存器、外設。大部分剛接觸MCU的人員一般是從關注外設的使用開始,但對於要深入理解MCU工作原理,瞭解MCU的內核、儲存器這兩部分內容是很有必要的。本文將以Cortex-M3內核為例對MCU的內核做一個簡要分析。主要關注以下三個問題:

定義:Cortex-M3內核是什麼?

結構:Cortex-M3架構是怎麼樣的?

功能:Cortex-M3架構各模塊各有什麼用?

下面我們來通過解答以上三個問題來初步認識Cortex-M3內核。

一、Cortex-M3內核是什麼(定義)?

Cortex-M3內核是單片機的中央處理器單元CPU。

Cortex-M3內核與基於Cortex-M3的MCU區別:

基於Cortex-M3的MCU:Cortex-M3+存儲器+外設等。Cortex-M3內核通過接口總線的形式掛載了儲存器、外設、中斷等組成一個MCU。

STM32有一颗什么样的“心”?

二、Cortex-M3架構是怎麼樣的(結構)?

特點:

1、Cortex-M3是一個32位處理器內核。內部的數據路徑是32位,寄存器是32位,存儲器接口是32位。

2、Cortex-M3採用哈佛架構。擁有獨立的指令總線和數據總線,取指與數據訪問可以同時進行。

3、支持小端模式、大端模式。

組成介紹:

Cortex-M3內核的架構如下圖所示,本文我們主要關注架構圖中標了序號的模塊。有:

寄存器組、NVIC、中斷和異常、儲存器映射、總線接口、調試支持、指令集(注:數字序號與圖中序號對應)。

STM32有一颗什么样的“心”?

三、Cortex-M3架構各模塊各有什麼用(功能)?

1、寄存器組

STM32有一颗什么样的“心”?

1、R0-R12:通用寄存器

R0-R12都是32位通用寄存器,用於數據操作。絕大多數16位Thumb指令只能訪問R0-R7,32位Thumb-2指令可以訪問所有寄存器。

2、R13:兩個堆棧指針。

CM3擁有兩個堆棧指針,都是banked,因此任一時刻只能使用其中一個。

主堆棧指針MSP:復位後缺省使用的堆棧指針,用於操作系統內核以及異常處理例程。

進程堆棧指針PSP:由用戶的應用程序代碼使用。

堆棧指針的最低兩位永遠是0,意味著堆棧總是4字節對齊。

3、R14:連接寄存器

當調用一個子程序時,由R14存儲返回地址。不像大多數其他處理器,ARM為了減少訪問內存的次數,把返回地址直接存儲在寄存器中。這樣足以使很多隻有1級子程序調用的代碼無需訪問內存(堆棧內存),從而提高子程序調用的效率。如果多於1級,則需要把前一級的R14值壓到堆棧裡。

4、R15:程序計數寄存器

指向當前的程序地址,如果修改它的值,就能改變程序的執行流。

5、特殊功能寄存器

PSRs:程序狀態字寄存器組

PRIMASK,FAULTMASK,BASEPRI:中斷屏蔽寄存器組

CONTROL:控制寄存器

特殊功能寄存器的功能描述如下圖所示。

STM32有一颗什么样的“心”?
STM32有一颗什么样的“心”?

2、NVIC嵌套向量中斷控制器

1、可嵌套中斷支持。可嵌套中斷支持,覆蓋所有的外部中斷和絕大多數系統異常。這些異常可以賦予不同的優先級。當前優先級被存儲在xPSR的專用字段。當一個異常發生時,硬件會字段比較該異常是否與當前的異常優先級更高,如果發現來了更高優先級的異常,處理器就會中斷當前的中斷服務程序,而服務新來的異常。

2、向量中斷支持。當開始響應一箇中斷後,Cortex-M3會自動定位一張向量表,並且根據中斷號從表中找出ISR的入口地址,然後跳轉過去執行。

3、動態優先級調整。軟件可以在運行時期更改中斷的優先級,如果在某ISR中修改了自己所對應中斷的優先級,而且這個中斷又有新的實例處於懸起中,也不會自己打斷自己,從而沒有重入風險。

4、中斷延遲大大縮短。Cortex-M3為了縮短中斷延遲,引入了幾個新特性,包括自動的現場保護和恢復,以及其它的措施,用於縮短中斷嵌套時的ISR間延遲。

5、中斷可屏蔽。既可以屏蔽優先級低於某個閾值的中斷/異常(設置BASEPRI寄存器),也可以全體封殺(設置PRIMASK和FAULTMASK寄存器)。這是為了讓時間關鍵的任務能在死線到來前完成,而不被幹擾。

3、中斷和異常

Cortex-M3的所有中斷機制都由NVIC實現。除了支持240條中斷之外,NVIC還支持16-4-1=11個內部異常源(4+1個為保留),可以實現fault管理機制。結果,Cortex-M3有了256個預定義的異常類型。

雖然Cortex-M3支持240個外中斷,但具體使用了多少個是由芯片生產商決定。Cortex-M3還有一個NMI(不可屏蔽中斷)輸入腳,當它被置為有效時,NMI服務函數會無條件地執行。

4、存儲器映射

Cortex-M3支持4GB存儲空間。

不像其它的ARM架構,它們的存儲器映射由半導體廠商說的算。Cortex-M3預先定義了“粗線條的”存儲器映射。通過把片上外設的寄存器映射到外設區,就可以簡單地以訪問內存的方式來訪問這些外設的寄存器,從而控制外設的工作。不要每學一種不同的單片機就要熟悉一種新的存儲器映射。

各個分區存儲器映射如下圖,有Code區(Flash區)、片上SRAM區、片上外設區、片外RAM區、片外外設區、Cortex-M3私有外設區。

STM32有一颗什么样的“心”?

5、總線接口

Cortex-M3內部有若干個總線接口,以使Cortex-M3能同時取址和訪內(訪問內存):

1、指令存儲區總線(兩條):有兩條代碼存儲區總線負責對代碼存儲區的訪問,分別是I-Code總線和D-Code總線。前者用於取指,後者用於查表等操作。(對應架構圖中的數字序號⑴)

2、系統總線用於訪問內存和外設。覆蓋的區域包含SRAM、片上外設、片外RAM、片外擴展設備,以及系統級存儲區的部分空間。(對應架構圖中的數字序號⑵)

3、私有外設總線負責一部分私有外設的訪問,主要是訪問調試組件。它們也在系統級存儲區。(對應架構圖中的數字序號⑶)

6、調試支持

Cortex-M3在內核水平上搭載了若干種調試相關的特性。最主要的就是程序執行控制,包括停機(halting)、單步執行(stepping)、指令斷點、數據觀察點、寄存器和存儲器訪問、性能速寫以及各種跟蹤機制。

目前可用的DPs包括SWJ-DP,既支持傳統的JTAG調試,也支持新的串行線調試協議SWD。

7、指令集

Cortex-M3只使用Thumb-2指令集,它允許32位指令和16位指令水乳交融,代碼密度和處理性能兩手抓。

在過去,做ARM開放必須處理好兩個狀態。32位的ARM狀態和16位的Thumb狀態,這兩個狀態是井水不犯河水。當處理器在ARM狀態下時2,所有的指令均是32位的,那怕是NOP指令,此時性能相當高。在Thumb狀態下,所有的指令均是16位的,代碼密度提高了一倍。但是,Thumb狀態下的指令功能是ARM下的一個子集,結果可能需要更多條的指令區完成相同的工作,導致處理性能下降。

為了取長補短,很多應用程序都混合使用ARM和Thumb代碼段。這種混合使用有額外開銷,時間和空間上都有,主要發生在狀態切換時,另一方面,ARM代碼和Thumb代碼需要以不同的方式編譯,這也增加了軟件開發管理的複雜度。

如下圖為ARM7處理的狀態切換圖。

STM32有一颗什么样的“心”?

Cortex-M3只使用Thumb-2指令集,使Cortex-M3有幾個方面比傳統ARM處理器更先進:

1、消滅了狀態切換的額外開銷,節省了執行時間和指令空間。

2、不需要把源代碼分成ARM編譯和Thumb編譯,軟件開發的管理大大減少。

3、無需再反覆求證和測試:究竟在何時何地切換到何種狀態,程序才最有效率。

STM32有一颗什么样的“心”?


分享到:


相關文章: