360度全方位無死角深度刨析STM32 結構,初學者建議收藏

2022-04-07     大方老師單片機

原標題:360度全方位無死角深度刨析STM32 結構,初學者建議收藏

360度全方位無死角深度刨析STM32結構初學者建議收藏

2.2 ARMSTM32的關可知ARM公司負責設計內核,半導體晶片廠商拿到內核授權後,根據產品需求,添加各類組件,生產晶片售賣。如 6.1.1所示,STM32的組成示意圖,其Cortex-M3內核、調試系統都ARM公司設計,內部總線、外設、存儲、時鐘復位等都ST公司開發。

在編程之前,STM32的總線結構、存儲結構、外設寄存器等有個大致了解,有助於理解編程中的一些操作。此外,中斷與異常Nested Vectored Interrupt ControllerNVIC)、時鐘復位Reset and ClockRCC)也很重要,且與編程緊密相關,在後面相關實驗章節里再專門講解。

對於開發者,掌握一MCU的開發需要重點關注四大模塊:時鐘復位、中斷異常、存儲映射和外設寄存器組。

STM32總線結構

總線Bus)是各種信號線的集合,是嵌入式系統中各布件之間傳輸數據信息、地址信息和控制信息的公共通道。

與總線相關的主要參數有總線寬度、總線頻率和總線帶寬。總線寬度是指總線能同時傳輸的數據位數83264位;總線頻率是指總線的工作速度,頻率越高,速度越快;總線帶寬用來描述總線傳輸數據的快慢,總線帶=總線寬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 BusAHB)和先進外設總線Advanced Peripheral BusAPB),分別連接高速設備和低速設備。基於這個總線結構ICodeDcodeSystem BusAHB總線。這AHB系統總線經過兩AHB-APB橋轉換成了兩APB總線APB1上掛接DACUART等外設,其最高頻率可36MHzAPB2上掛接ADCGPIO等外設,其最高頻率可72MHz

MCU每次復位後,所有的外設時鐘都會默認處於關閉狀態。因此,在使用外設前需要操作復位和時鐘寄存(Reset and Clock ControlRCC)開啟所需外設的時鐘。

STM32存儲結構

CPU通過總線訪問各個外設,現在通往外設已經鋪好,還需要規定各個外設門牌便精準控制每個外設ARM Cortex-M3系列的處理器,採用存儲器I/O設備(外設)統一編址的方式,將部分存儲器地址範圍用於外設,這種通過存儲器地址訪問外設的方式,稱為存儲器地址映射。

32位的處理器,可尋址的範圍232位元組,232 = 4 × 1024 × 1024 × 1024 = 4,也就0x000000000xFFFFFFFFARM4G空間從低地址到高地址依次劃分為代碼區Code)、片SRAMSRAM)、片上外設Peripheral)、片RAMExternal RAM)、片外外設External Device)和系統System level),如 6.1.3所示。

ARM公司只是大概的規定了存儲器空間的映射,允許各晶片廠商在指定範圍內自行定義和使用這些存儲空間,未分配的空間為保留的地址空間。

STM32ARM規定的基礎上,4G空間分為Block0Block1Block2Block78塊,每塊大小512MB,如下 6.1.1所示,詳細結構如 6.1.4所示。

.0x0000 0000 ~ 0x1FFF FFFF(512MB):作為代碼區,用於存放下載的代碼。系統上電後,將從該部分讀取代碼;

.0x2000 0000 ~ 0x3FFF FFFF(512MB):作SRAM區,用於存放運行代碼。系統上電後,將Flash讀取代碼,放SRAMCPUSRAM讀取代碼運行;

.0x4000 0000 ~ 0x5FFF FFFF(512MB):作為片上外設區,用於存放廠商外設寄存器。要操作外設,即修改這裡對應的外設寄存器;注意這裡RCCPortB外設的地址範圍,後面很快就會用到;

.0x6000 0000 ~ 0x9FFF FFFF(1GB):作為片RAM,用於擴RAMSRAMFlash不夠用時MCUFSMC外接其IC晶片,則在這個地址範圍讀IC晶片數據;

.0xA000 0000 ~ 0xDFFF FFFF(1GB):作為片外外設區,用於讀寫擴IC晶片的寄存器ST只用了這裡的一半空間,另外一空間未使用;

.0xE000 0000 ~ 0xFFFF FFFF(512MB):作為內核外設區,用於存Cortex-M3內核的內部外設CortexM3內核的內部外設NVICSystick等;

STM32寄存器

寄存器是用來存儲二進位數據的時序邏輯電路,由眾多電晶體組成。

前面提到的寄存器,都是外設寄存器。這些外設寄存器由晶片廠商設計,與存儲器統一編址,常C語言的指針來表示外設寄存器地址,實現對外設寄存器的訪問和操作。

在嵌入式系統中,除了外設寄存器,還有一類CPU內部寄存器。這些內部寄存器ARM設計,CPU內部,常用彙編語言直接操作,用於暫存參與運算的數據和內核的一些控制。

開發人員,通常只操作外設寄存器實現需求功能,後面實驗會詳細講解外設寄存器。而內部寄存器在實際開發中接觸會比較少,後面彙編點燈實驗會涉及部分相關知識,本小結簡單介紹下內部寄存器。

ARM Cortex-M3微處理器的內部寄存器,又分為普通寄存器和特殊功能寄存器。普通寄存器如 6.1.5所示。

.R0-R12General-Purpose Registers):用於數據操作32位通用寄存器;一16Thumb指令,只能訪問低寄存器R0~R7);

.R13Stack PointersSPCortex-M3包含兩個堆棧指針寄存器;同一時刻只能看到其中一個;1)主堆棧指針寄存器Main Stack PointerMSP):作業系統OS)內核和異常處理程序使用的默認堆棧指針;2進程堆棧指針寄存器Process Stack PointerPSP):用於用戶代碼;

.R14Link RegisterLR):連結寄存器;調用子例程時,返回地址將存儲在連結寄存器中;

.R15Program CounterPC):程序計數器;總是指向下一條指令所在單元的地址,可以寫入該寄存器以控制程序流Cortex-M3處理器還具有許多特殊寄存器,如 6.1.6所示。

.xPSRProgram Status registers):程序狀態寄存器;用於存放程序運作中的各種狀態信息以及中斷等狀態;由應用狀態寄存器APSR)、中斷狀態寄存器IPSR)和執行狀態寄存器EPSR)組成;

.PRIMASKFAULTMASKBASEPRI:中斷屏蔽寄存器;用於控制異常和中斷的屏蔽

.CONTROL:控制寄存器;用於定義特權狀態和當前使用哪一個堆棧指針;

【總結】

STM32ARM公司設計Cortex-M3內核ST公司開發的外設資源組成。

Cortex-M3內核有內部寄存器,主要用於運算和內核的控制,這塊對於初學者較難,暫時了解即可。

Cortex-M3內核通過總線和外設連接,重點了解大部分外設都掛APB即可。

STM32採用存儲器與外設統一編址的方式,控制外設,則對應操作指定地址的外設寄存器即可,這是後續實驗的重點。我自己在今年年初錄製了一套還比較系統的入門單片機教程,想要的同學找我拿就行了免費的,私信我就可以~簡介里也有。

文章來源: https://twgreatdaily.com/d5b670fa75f3cc100d0d8e21dfdb3970.html