360度全方位無死角深度刨析STM32結構,初學者建議收藏
從「2.2 ARM與STM32的關系」可知,ARM公司負責設計內核,半導體晶片廠商拿到內核授權後,根據產品需求,添加各類組件,生產晶片售賣。如圖 6.1.1所示,為STM32的組成示意圖,其中Cortex-M3內核、調試系統都是ARM公司設計,內部總線、外設、存儲、時鐘復位等都由ST公司開發。
在編程之前,對STM32的總線結構、存儲結構、外設寄存器等有個大致了解,有助於理解編程中的一些操作。此外,中斷與異常(Nested Vectored Interrupt Controller,NVIC)、時鐘復位(Reset and Clock,RCC)也很重要,且與編程緊密相關,在後面相關實驗章節里再專門講解。
對於開發者,掌握一款MCU的開發需要重點關注四大模塊:時鐘復位、中斷異常、存儲映射和外設寄存器組。
STM32總線結構
總線(Bus)是各種信號線的集合,是嵌入式系統中各布件之間傳輸數據信息、地址信息和控制信息的公共通道。
與總線相關的主要參數有總線寬度、總線頻率和總線帶寬。總線寬度是指總線能同時傳輸的數據位數,如8位、32位、64位;總線頻率是指總線的工作速度,頻率越高,速度越快;總線帶寬用來描述總線傳輸數據的快慢,總線帶寬=總線寬度x總線頻率/8,單位為MB/s。
STM32的總線結構如圖 6.1.2所示,可以分為6部分。
.ICode總線:(Instruction bus)用於訪問存儲空間裡指令的總線;
.DCode總線:(Data bus):用於訪問存儲空間裡數據的總線;
.System總線:用於訪問指令、數據以及調試模塊接口;
.DMA總線:用於內存與外設之間的數據傳輸;
.Bus matrix(總線矩陣):用於總線之間的訪問優先級管理控制;
.APB總線:用於外設接口的數據傳輸;ARM公司推出AMBA片上總線結構,該總線主要包含先進高速總線(Advanced High-speed Bus,AHB)和先進外設總線(Advanced Peripheral Bus,APB),分別連接高速設備和低速設備。基於這個總線結構,ICode、Dcode、System Bus都是AHB總線。這里AHB系統總線經過兩個AHB-APB橋轉換成了兩個APB總線。APB1上掛接有DAC、UART等外設,其最高頻率可達36MHz;APB2上掛接有ADC、GPIO等外設,其最高頻率可達72MHz。
在MCU每次復位後,所有的外設時鐘都會默認處於關閉狀態。因此,在使用外設前需要操作復位和時鐘寄存器(Reset and Clock Control,RCC)開啟所需外設的時鐘。
STM32存儲結構
CPU通過總線訪問各個外設,現在通往外設的「路」已經鋪好,還需要規定各個外設的「門牌號」,以便精準控制每個外設。ARM Cortex-M3系列的處理器,採用存儲器與I/O設備(外設)統一編址的方式,將部分存儲器地址範圍用於外設,這種通過存儲器地址訪問外設的方式,稱為存儲器地址映射。
對於32位的處理器,可尋址的範圍為232位元組,即232 = 4 × 1024 × 1024 × 1024 = 4,也就是0x00000000至0xFFFFFFFF。ARM將這4G空間從低地址到高地址依次劃分為代碼區(Code)、片上SRAM區(SRAM)、片上外設(Peripheral)、片外RAM(External RAM)、片外外設(External Device)和系統級(System level),如圖 6.1.3所示。
ARM公司只是大概的規定了存儲器空間的映射,允許各晶片廠商在指定範圍內自行定義和使用這些存儲空間,未分配的空間為保留的地址空間。
STM32在ARM規定的基礎上,將4G空間分為了Block0、Block1、Block2、……、Block7,共8塊,每塊大小為512MB,如下表 6.1.1所示,詳細結構如圖 6.1.4所示。
.0x0000 0000 ~ 0x1FFF FFFF(512MB):作為代碼區,用於存放下載的代碼。系統上電後,將從該部分讀取代碼;
.0x2000 0000 ~ 0x3FFF FFFF(512MB):作為SRAM區,用於存放運行代碼。系統上電後,將從Flash讀取代碼,放到SRAM里,CPU再從SRAM讀取代碼運行;
.0x4000 0000 ~ 0x5FFF FFFF(512MB):作為片上外設區,用於存放廠商外設寄存器。要操作外設,即修改這裡對應的外設寄存器;注意這裡的RCC和PortB外設的地址範圍,後面很快就會用到;
.0x6000 0000 ~ 0x9FFF FFFF(1GB):作為片外RAM,用於擴展RAM。當SRAM或者Flash不夠用時,MCU通過FSMC外接其它IC晶片,則在這個地址範圍讀寫IC晶片數據;
.0xA000 0000 ~ 0xDFFF FFFF(1GB):作為片外外設區,用於讀寫擴展IC晶片的寄存器。ST只用了這裡的一半空間,另外一空間未使用;
.0xE000 0000 ~ 0xFFFF FFFF(512MB):作為內核外設區,用於存放Cortex-M3內核的內部外設。CortexM3內核的內部外設有NVIC、Systick等;
STM32寄存器
寄存器是用來存儲二進位數據的時序邏輯電路,由眾多電晶體組成。
前面提到的寄存器,都是外設寄存器。這些外設寄存器由晶片廠商設計,與存儲器統一編址,常用C語言的指針來表示外設寄存器地址,實現對外設寄存器的訪問和操作。
在嵌入式系統中,除了外設寄存器,還有一類叫CPU內部寄存器。這些內部寄存器由ARM設計,在CPU內部,常用彙編語言直接操作,用於暫存參與運算的數據和內核的一些控制。
開發人員,通常只操作外設寄存器實現需求功能,後面實驗會詳細講解外設寄存器。而內部寄存器在實際開發中接觸會比較少,後面彙編點燈實驗會涉及部分相關知識,本小結簡單介紹下內部寄存器。
ARM Cortex-M3微處理器的內部寄存器,又分為普通寄存器和特殊功能寄存器。普通寄存器如圖 6.1.5所示。
.R0-R12(General-Purpose Registers):用於數據操作的32位通用寄存器;一些16位的Thumb指令,只能訪問低寄存器(R0~R7);
.R13(Stack Pointers,SP)Cortex-M3包含兩個堆棧指針寄存器;同一時刻只能看到其中一個;(1)主堆棧指針寄存器(Main Stack Pointer,MSP):作業系統(OS)內核和異常處理程序使用的默認堆棧指針;(2)進程堆棧指針寄存器(Process Stack Pointer,PSP):用於用戶代碼;
.R14(Link Register,LR):連結寄存器;調用子例程時,返回地址將存儲在連結寄存器中;
.R15(Program Counter,PC):程序計數器;總是指向下一條指令所在單元的地址,可以寫入該寄存器以控制程序流;Cortex-M3處理器還具有許多特殊寄存器,如圖 6.1.6所示。
.xPSR(Program Status registers):程序狀態寄存器;用於存放程序運作中的各種狀態信息以及中斷等狀態;由應用狀態寄存器(APSR)、中斷狀態寄存器(IPSR)和執行狀態寄存器(EPSR)組成;
.PRIMASK、FAULTMASK和BASEPRI:中斷屏蔽寄存器;用於控制異常和中斷的屏蔽
.CONTROL:控制寄存器;用於定義特權狀態和當前使用哪一個堆棧指針;
【總結】
STM32由ARM公司設計的Cortex-M3內核與ST公司開發的外設資源組成。
Cortex-M3內核有內部寄存器,主要用於運算和內核的控制,這塊對於初學者較難,暫時了解即可。
Cortex-M3內核通過總線和外設連接,重點了解大部分外設都掛載APB即可。
STM32採用存儲器與外設統一編址的方式,控制外設,則對應操作指定地址的外設寄存器即可,這是後續實驗的重點。我自己在今年年初錄製了一套還比較系統的入門單片機教程,想要的同學找我拿就行了免費的,私信我就可以哦~簡介里也有。