物联网之STM32开发一(基础知识)
一、ARM體系結構概述
內容概述:
必須要get到的ARM知識
Cortex-M0處理器介紹
認識STM32
STM32F0硬件平臺介紹
必須要get到的ARM知識:
STM32的核心部件CPU是Cortex-M 系列處理器
ARM處理器家族:
早先經典處理器 包括ARM7、ARM9、ARM11家族。 ?
Cortex-M 系列 為單片機驅動的系統提供的低成本優化方案,應用于傳統 的微控制器市場,智能傳感器,汽車周邊部件等。
Cortex-A 系列 針對開放式操作系統的高性能處理器; 應用于智能手機,數字電視,智能等高端運用。 ?
Cortex-R 系列 針對實時系統、滿足實時性的控制需求; 應于汽車制動系統,動力系統等。
ARM處理器架構:
概念:體系結構定義指令集和基于這一體系結構下處理器的 編程模型(基本數據類型、工作模型、寄存器組)。基于同種體系結構可以有多種處理器、每個處理器的性能不同,面向的應用領域也不同。
ARM體系結構發展:
? ??目前ARM體系架構共定義了8個版本V1-V8
? ??V1-V3 最早的版本,目前已廢棄
? ??V4-V6 經典處理器中運用的比較多
? ??V7 ?目前Cortex系列處理器主要是這種架構、支持Thumb-2的32位指令集
? ??V8 兼容ARMv7架構的特性,并支持64位數據處理
ARM指令集:
指令集的概念:處理器能夠識別并執行的指令集合;每一條指令可處理一個簡單或復雜操作(加、加乘…);每一條指令對應一條或幾條匯編指令。
指令集常見分類:
? ? 復雜指令集(CISC):包含處理復雜操作的特定指令,指令長度不固定,執行需要多個周期。
? ??精簡指令集(RISC):指令簡單而有效,格式和長度通常是固定的,大多數指令在一個周期內可以執行完畢,ARM的內核是基于RISC體系結構的
SOC的概念:
SOC(片上系統)指的是在單個芯片上集成一個完整的計算機系統,所謂完整的系統一般包括中央處理器(CPU)、存儲器、以及外圍電路等。
Cortex-M0處理器介紹
主要內容:
Cortex-M0處理器簡介
Cortex-M0體系結構
Cortex-M0異常和中斷
Cortex-M0指令集
Cortex-M0處理器簡介:
Cortex-M 系列產品主要包括 Cortex-M0、Cortex-M1、Cortex-M3、Cortex-M4、Cortex-M7 等,其中 Cortex-M0 主打低功耗和混合信號的處理,M3 主要用來替代 ARM7,重點側重能耗與性能的平衡,而 M7 則重點放在高性能控制運算領域。
注:STM32F051微控制器內核就是ARM Cortex-M0
Cortex-M0結構框圖:
Cortex-M0 微處理器主要包括處理器內核、嵌套向量中斷控制器(NVIC)、調試子系統、內部總線系統構成。Cortex-M0 微處理器通過精簡的高性能總線(AHB-LITE)與外部進行通信。
Cortex-M0特性:
Thumb 指令集,高效、高代碼密度;
高性能,使用ARMv6-M的體系架構;
中斷數量可配置(1~32 個),4 級中斷優先級,低中斷切換時延,提供不可屏蔽中斷(NMI)輸入保障高可靠性系統;
門電路少,低功耗,處理器可在休眠狀態下掉電以降低功耗,還可被 WIC 喚醒;
與 Cortex-M1 處理器兼容,向上兼容 Cortex-M3 和 Cortex-M4 處理器,可以很容易地升級到 Cortex-M3。Cortex-M3 和 Cortex-M4 移植到 Cortex-M0 也非常簡單。
支持多種嵌入式操作系統,也被多種開發組件支持,包括 MDK(ARM Keil 微控制器開發套件)、RVDS(ARM RealView 開發組件)、IAR C 編譯器等。
Cortex-M0工作模式:
Cortex-M0有兩種工作模式和兩種工作狀態:
? ??線程模式(Thread Mode): 芯片復位后,即進入線程模式,執行用戶程序;
? ??處理模式(Handler Mode)。 當處理器發生了異常或者中斷,則進入處理模式進行處理、處理完成后返回線程模式。
? ??Thumb狀態:正常運行時處理器的狀態
? ??調試狀態:調試程序時處理器的狀態
Cortex-M0寄存器組——通用寄存器:
Cortex-M0 處理器內核有 13 個通用寄存器以及多個特殊寄存器,如圖 所示。具體介紹如下:
R0-R12:通用寄存器。其中 R0-R7 為低端寄存器,可作為 16 位或 32 位指令操作數,R8-R12 為高端寄存器,只能用作 32 位操作數
R13:堆棧指針 SP,Cortex-M0 在不同物理位置上存在兩個棧指針,主棧指針 MSP,進程棧指針 PSP。在處理模式下,只能使用主堆棧,在線程模式下,可以使用主堆棧也可以使用進程堆棧,這主要是由 CONTROL 寄存器控制完成。 系統上電的默認棧指針是MSP
R14:連接寄存器(LR),用于存儲子程序或者函數調用的返回地址
R15:程序計數器(PC),存儲下一條將要執行的指令的地址。
Cortex-M0寄存器組——特殊寄存器:
xPSR:組合程序狀態寄存器,該寄存器由三個程序狀態寄存器組成:
? ??應用PSR(APSR):包含前一條指令執行后的條件標志
? ??中斷PSR(IPSR): ?包含當前ISR的異常編號
? ??執行PSR(EPSR) ? : ?包含Thumb狀態位
PRIMSK:中斷屏蔽特殊寄存器。
CONTROL:控制寄存器。
? ??控制處理器處于線程模式時,使用哪個堆棧:
? ? ? ??=0,使用MSP
? ? ? ??=1,使用PSP
? ? ? ??處理器模式時,固定使用MSP
Cortex-M0異常和中斷:
Cortex-M0 處理器最多支持 32 個外部中斷(通常稱為 IRQ)和一個不可屏蔽中斷(NMI),另外 Cortex-M0 還支持許多系統異常(Reset、HardFault、SVCall、PendSV、SysTick),它們主要用于操作系統和錯誤處理,參見下表
Cortex-M0指令集:
ARM 處理器支持兩種指令集:ARM 和 Thumb。
EPSR 寄存器的 T 標志位負責指令集的切換,Cortex-M0只支持Thumb指令。
ARM指令集:32位精簡指令集; 指令長度固定; 降低編碼數量產生的耗費,減輕解碼和流水線的負擔。
Thumb指令集:Thumb指令集是ARM指令集的一個子集; 指令寬度16位; 與32位指令集相比,大大節省了系統的存儲空間; Thumb指令集不完整,所以必須配合ARM指令集一同使用。
注:Thumb 與 ARM 相比,代碼體積小了 30%,但性能也低了 20%。2003 年,ARM 公司引入了 Thumb-2 技術,具備了一些 32 位的 Thumb 指令,使得原來很多只有 ARM 指令能夠完成的功能,用 Thumb 指令也可以完成了。Cortex-M0 基于的 ARMv6-M 體系結構,該體系結構的處理器只是用了16位Thumb指令和部分32位Thumb指令
認識STM32
內容概述:?
STM32的應用
STM32產品的介紹
STM32產品命名規范
STM32F0體系架構
STM32:從字面上來理解,ST 是意法半導體,M 是 Microelectronics 的縮寫,32 表示32 位,合起來理解,STM32 就是指 ST 公司開發的 32 位微控制器。在如今的 32 位控制器當中,STM32 可以說是最璀璨的新星,它受寵若嬌,大受工程師和市場的青睞,無芯能出其右。
STM32的應用:
可穿戴 物聯網 無人機 工業控制 醫療電子 汽車電子 電力系統 石油系統 燃氣系統 …….
STM32產品介紹:
STM32產品命名規范:
STM32F0系統架構:
系統主要由以下幾個模塊組成 :
? ??二個主模塊 :
? ? ? ??Cortex-M0 內核及先進高性能總線 (AHB bus)
? ? ? ??通用 DMA ( GP-DMA -- general-purpose DMA)
? ??四個從模塊 :
? ? ? ??內部 FLASH
? ? ? ??內部SRAM
? ? ? ??專門用于連接 GPIO 口的 AHB2
? ? ? ??AHB 到 APB 的橋 , 所有的外設都掛在 APB 總線上
STM32F0硬件平臺介紹
二、STM32開發環境搭建
內容概要:
Keil MDK-ARM簡介及安裝
STM32CubeMX簡介及安裝
STM32F0存儲器映射
STM32F0啟動文件分析
Keil MDK-ARM簡介及安裝
。。。略
STM32CubeMX簡介及安裝?
。。。略
STM32F0存儲器映射
內容概述:
Cortex-M0存儲器映射
STM32F0存儲器映射
寄存器的訪問方式
Cortex-M0存儲器映射:
存儲器本身沒有地址,給存儲器分配地址的過程叫存儲器映射
注:被控單元的FLASH,RAM和AHB到APB的橋(即片上外設),這些功能部件共同排列在一個 4GB 的地址空間內。我們在編程的時候,可以通過他們的地址找到他們,然后來操作他們
STM32F0存儲器映射:
可尋址4GB字節空間
多達64KB片上閃存
多達8K的SRAM
STM32F05x 存儲器映像和外設寄存器編址:在芯片手冊上可查到
寄存器訪問:
以GPIOA寄存器組為例,讀寫ODR寄存器方法:
已知GPIOA的起始地址為0x48000000
各寄存器的偏移地址如下:
MODER; ? ? ? ??? ? /*Address offset: 0x00 */
OTYPER; ? ? ? ? ? ?/*Address offset: 0x04 */
OSPEEDR; ? ? ? ?/*Address offset: 0x08 */
PUPDR; ? ? ? ? ? ??/*Address offset: 0x0C */
IDR; ? ? ? ? ? ? ? ? ? ?/*Address offset: 0x10 */
ODR; ? ? ? ? ? ? ? ? /*Address offset: 0x14 */
BSRR; ? ? ? ? ? ? ?/*Address offset: 0x18 */
LCKR; ? ? ? ? ? ? ?/*Address offset: 0x1C */
第一種方式:對地址進行宏定義
#define GPIOA_BASE ( (unsigned int ) 0x48000000 ) #define GPIOA_ODR ( GPIOA_BASE + 0x14 )讀操作 val = *(unsigned int *) GPIOA_ODR ;寫操作 *(unsigned int *) GPIOA_ODR = val ;改進
#define GPIOA_ODR ( *(unsigned int *) ( GPIOA_BASE + 0x14 ))val = GPIOA_ODR ; //讀 GPIOA_ODR = val ; //寫第二種方式:用結構體封裝寄存器
用上面的方法去定義地址,還是稍顯繁瑣、根據我們每一類外設對應的寄存器組地址都是連續增長的特點,我們引入 C 語言中的結構體語法對寄存器進行封裝
typedef struct { uint32_t MODER; /*Address offset: 0x00 */ uint32_t OTYPER; /*Address offset: 0x04 */ uint32_t OSPEEDR; /*Address offset: 0x08 */ uint32_t PUPDR; /*Address offset: 0x0C */ uint32_t IDR; /*Address offset: 0x10 */ uint32_t ODR; /*Address offset: 0x14 */ uint32_t BSRR; /*Address offset: 0x18 */ uint32_t LCKR; /*Address offset: 0x1C */ } GPIO_TypeDef;#define GPIOA_BASE ( (unsigned int ) 0x48000000 ) #define GPIOA ((GPIO_TypeDef *) GPIOA_BASE)注:我們訪問GPIOA的控制寄存器組時、直接使用宏定義好
? ? ? ? GPIO_TypeDef 類型的指針,而且指針指向 GPIOA端口的首地址,這樣我們直接用宏GPIOA訪問改外設的任意一個寄存器
? ? ? ? GPIOA->MODER ? ? = ?0x20 ;
? ? ? ? GPIOA->OSPEEDR ?= ?0x16 ;
STM32F0啟動文件分析
內容概要:
STM32F0啟動模式
C語言程序內存排布
啟動文件startup_stm32f051.s分析
STM32F0的啟動模式:
注:Cortex-M0 的程序映像通常是從地址 0x00000000 開始的、系統復位后,處理器首先讀取向量表中的前兩個字(8 個字節),第一個字存入 MSP,第二個字為復位向量,它表示程序執行的起始地址(復位處理)
根據啟動模式的不同,用戶閃存、系統閃存和SRAM都 可以映射到0x0的低端地址; ? ? ?
我們的板子boot0直接接地,因此啟動區域為flash啟動
C語言內存排布:
注:棧的作用是用于局部變量,函數調用,函數形參等的開銷 ? ? ? ?
? ? ? ? 堆主要用來動態內存的分配
STM32F051啟動文件分析:
源碼及分析過程鏈接:https://pan.baidu.com/s/1R7ggGedaR4Zsxhzeis_8vg 密碼:7060
注:使用keil打開最佳
?
總結
以上是生活随笔為你收集整理的物联网之STM32开发一(基础知识)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 几个常用的ASP木马
- 下一篇: 精彩回顾 | 一文盘点2021年中小企业