STM32-02-STM32基础知识
STM32基础知识
1. STM32F103系统架构
-
STM32F103
STM32F103是ST公司基于ARM授权Cortex M3内核而设计的一款芯片,而Cortex M内核使用的是ARM v7-M架构,是为了替代老旧的单片机而量身定做的一个内核,具有低成本、低功耗、实时性好、中断响应快、处理效率高等特点。
-
架构、内核、芯片 的关系:
架构:(ARMv7-M) Cortex-M3内核采用了ARMv7-M架构,这是ARM体系结构中专门用于嵌入式微控制器的一个子集。
内核:(Cortex-M3) 属于ARM Cortex-M系列,这个系列是ARM架构的一部分,专门设计用于嵌入式系统。
芯片:内含集成电路的硅片。 -
举例:
架构:ARMv7-M
内核:Cortex-M3
芯片:STM32F103ZET6 -
ARMv7-M是ARM体系结构中用于嵌入式微控制器的一个子集。以下是ARMv7-M架构的一些特点:
-
32位架构: ARMv7-M是一种32位体系结构,意味着它的寄存器和数据通路都是32位宽度。这提供了更大的寻址空间和更高的数据处理能力,相对于一些早期的8位或16位处理器而言更适合处理复杂的任务。
-
Thumb-2指令集: ARMv7-M体系结构采用了Thumb-2指令集,它是ARM指令集的一个升级版本。Thumb-2指令集提供了更好的代码密度,同时保持了与传统ARM指令集相比较的性能优势。这对于嵌入式系统中有限的存储资源非常有利。
-
低功耗设计: ARMv7-M体系结构专门针对低功耗和嵌入式应用进行了优化。这使得基于ARMv7-M的微控制器能够在电池供电或功耗敏感的应用中发挥优势。
-
嵌入式特性: ARMv7-M体系结构是为嵌入式系统设计的,因此它考虑了嵌入式应用的一些特殊要求,例如实时性、可靠性和实时中断处理。
总体而言,ARMv7-M是ARM在嵌入式领域的一种高度优化的体系结构,为微控制器提供了高性能、低功耗和紧凑的代码执行能力。Cortex-M系列处理器,如Cortex-M3、Cortex-M4等,都采用了ARMv7-M体系结构。
-
-
Cortex-M3指的是ARM Cortex-M系列中的一种处理器内核。以下是对Cortex-M3的详细介绍:
-
架构和特性:
- ARM Cortex-M系列: Cortex-M系列是ARM针对嵌入式系统设计的32位RISC处理器系列。它专注于低功耗、高性能、实时性和成本效益。
- Cortex-M3特性: Cortex-M3是Cortex-M系列中的一员,具有单一、高效的3级流水线架构。它支持Thumb-2指令集,提供了更好的代码密度和性能。
-
性能:
- 时钟频率: Cortex-M3可以运行在不同的时钟频率,具体取决于实际芯片的设计。典型的时钟频率范围在几十MHz到几百MHz之间。
- 处理能力: 它具有较高的性能,适用于许多嵌入式应用,包括工业控制、汽车电子、消费电子等。
-
指令集和代码密度:
- Thumb-2指令集: Cortex-M3采用Thumb-2指令集,它是ARM指令集的一种变体,结合了16位Thumb指令和32位ARM指令。这提供了更好的代码密度和性能。
-
低功耗设计:
- 低功耗模式: Cortex-M3支持多种低功耗模式,使其适用于电池供电的移动设备和其他对功耗敏感的应用。
-
嵌入式特性:
- 实时性: Cortex-M3专为实时操作系统和实时嵌入式应用设计,具有快速中断响应和低延迟的特性。
- 可靠性: 高可靠性是嵌入式系统的一个重要特征,Cortex-M3的设计考虑了这一点。
-
适用领域:
- Cortex-M3广泛应用于各种嵌入式系统,包括传感器控制、工业自动化、医疗设备、汽车电子和消费电子等领域。
-
-
-
Cortex M3内核和芯片之间的关系?
由图可以看出,ARM公司提供Cortex-M3内核和调试系统,其它的东西(外设、存储器等)由芯片制造商设计开发,STM32F103芯片就是由ST公司设计的。
-
STM32F103ZET6系统架构
STM32F103的系统主要由:四个主动单元(可以主动发起通信,图中①区域)和四个被动单元(只能被驱动工作,图中②区域)组成:
主动单元 被动单元 Cortex M3内核 DCode总线(D-Bus) 内部 FLASH (硬盘) Cortex M3内核 System总线(S-Bus) 内部 SRAM (内存) 通用DMA总线,连接到DMA1 FSMC 通用DMA总线,连接到DMA2 AHB到APB的桥,它连接的所有APB外设 -
I Code 总线(I - Bus)
这是Cortex M3内核的指令总线,连接闪存指令接口(如:FLASH),用于获取指令。由于该总线功能单一,并没有直接连接到总线矩阵,因此被排除在主动单元之外。
-
D Code 总线 (D - Bus)
这是Cortex M3内核的数据总线,连接闪存存储器数据接口(如:SRAM、FLASH等),用于各种数据访问,如常量、变量等。
-
System 总线 (S - Bus)
这是Cortex M3内核的系统总线,连接所有外设(如:GPIO、SPI、IIC、TIM等),用于控制各种外设工作,如配置各种外设相关寄存器等。
-
DMA 总线
DMA是直接存储访问控制器,可以实现数据的自动搬运,整个过程不需要CPU处理。STM32F103ZET6有两个DMA控制器,可以实现内存到外设、外设到内存,内存到内存的数据传输。
-
内部 FLASH
内部FLASH即单片机的硬盘,用于代码/数据存储,CPU通过I Code总线经FLASH接口访问内部FLASH,FLASH最高访问速度是24Mhz,因此以72M速度访问时,需要插入2个时钟周期延迟。
-
内部 SRAM
内部SRAM即单片机的内存,用于数据存储,直接挂载在总线矩阵上面,CPU通过D Code总线实现0等待延时访问SRAM,最快总线频率可达72Mhz,从而保证高效高速的访问内存。
-
FSMC
FSMC即灵活的静态存储控制器,实际上就是一个外部总线接口,可以用来访问外部SRAM、NAND/NOR FLASH、LCD等。它也是直接挂在总线矩阵上面的,以方便CPU快速访问外挂器件。
-
AHB/APB 桥
AHB总线连接总线矩阵,同时通过2个APB桥连接APB1和APB2,AHB总线速度最大为 72Mhz,APB2总线速度最大也是72Mhz,但是APB1总线速度最大只能是36Mhz。这三个总线上面挂载了STM32内部绝大部分外设。
-
总线矩阵
总线矩阵协调内核系统总线和DMA主控总线之间的访问仲裁,仲裁利用轮换算法,保证各个总线之间的有序访问,从而确保工作正常。
-
2. STM32寻址范围
- STM32是一个32位单片机,可以访问4GB以内的存储空间(2^32=4GB),数据字节以小端模式存放在存储器中,数据的高字节保存在内存的高地址中,而数据的低字节保存在内存的低地址中。
3. 存储器映射
- 存储器本身是没有地址信息的,我们对存储器分配地址的过程就叫存储器映射。
ST把4GB空间分成8个块,每个块512MB,我们在学习的过程中,主要学习前面三个块,即 Block 0, Block 1, Block2.
存储块 | 功能 | 地址范围 |
---|---|---|
Block 0 | Code(FLASH) | 0x0000 0000 ~ 0x1FFF FFFF(512MB) |
Block 1 | SRAM | 0x2000 0000 ~ 0x3FFF FFFF(512MB) |
Block 2 | 片上外设 | 0x4000 0000 ~ 0x5FFF FFFF(512MB) |
Block 3 | FSMC Bank1&2 | 0x6000 0000 ~ 0x7FFF FFFF(512MB) |
Block 4 | FSMC Bank3&4 | 0x8000 0000 ~ 0x9FFF FFFF(512MB) |
Block 5 | FSMC寄存器 | 0xA000 0000 ~ 0xBFFF FFFF(512MB) |
Block 6 | 保留 | 0xC000 0000 ~ 0xDFFF FFFF(512MB) |
Block 7 | Cortex M3内部外设 | 0xE000 0000 ~ 0xFFFF FFFF(512MB) |
Block 0 功能划分
功能 | 地址范围 |
---|---|
FLASH或系统存储器别名区 | 0X0000 0000 ~ 0x0007 FFFF(512KB) |
保留 | 0X0008 0000 ~ 0x07FF FFFF |
用户FLASH,用于存储用户代码 | 0X0800 0000 ~ 0x0807 FFFF(512KB) |
保留 | 0X0808 0000 ~ 0x1FFF EFFF |
系统存储器,存储出厂Bootloader | 0X1FFF F000 ~ 0X1FFF F7FF(2KB) |
选项字节,配置读保护等 | 0X1FFF F800 ~ 0X1FFF F80F(16B) |
保留 | 0X1FFF F810 ~ 0X1FFF FFFF |
Block 1 功能划分
功能 | 地址范围 |
---|---|
SRAM | 0X2000 0000 ~ 0x2000 FFFF(64KB) |
保留 | 0X2001 0000 ~ 0x3FFF FFFF |
Block 2 功能划分
功能 | 地址范围 |
---|---|
APB1总线外设 | 0X4000 0000 ~ 0x4000 77FF |
保留 | 0X4000 7800 ~ 0x4000 FFFF |
APB2总线外设 | 0X4001 0000 ~ 0x4000 3FFF |
保留 | 0X4001 4000 ~ 0x4001 7FFF |
AHB总线外设 | 0X4001 8000 ~ 0x4002 33FF |
保留 | 0X4002 3400 ~ 0x5FFF FFFF |
4. 寄存器映射
- 给存储器分配地址的过程叫存储器映射,寄存器是一类特殊的存储器,它的每个位都有特定的功能,可以实现对外设/功能的控制,给寄存器的地址命名的过程就叫寄存器映射。
小类 | 说明 | |
---|---|---|
内核存储器 | 内核相关寄存器 | 包含R0~R15、xPSR、特殊功能寄存器等 |
中断控制寄存器 | 包含NVIC和SCB相关寄存器,NVIC有:ISER、ICER、ISPR、IP等; SCB有:VTOR、AIRCR、SCR等 | |
SysTick寄存器 | 包含CTRL、LOAD、VAL和CALIB四个寄存器 | |
内存保护寄存器 | 可选功能,STM32F103没有 | |
外设存储器 | 调试系统寄存器 | ETM、ITM、DWT、IPIU等相关寄存器 |
包含GPIO、UART、IIC、SPI、TIM、DMA、ADC、DAC、RTC、I/WWDG、PWR、CAN、USB等各种外设寄存器 |
-
相关说明:
-
① 寄存器名字
每个寄存器都有一个对应的名字,以简单表达其作用,并方便记忆,这里GPIOx_ODR表示寄存器英文名,x可以从A~E,说明有5个这样的寄存器。
-
② 寄存器偏移量及复位值
地址偏移量表示相对该外设基地址的偏移。
-
③ 寄存器位表
描述寄存器每一个位的作用(共32bit),rw代表可读可写。
-
④ 位功能描述
描述寄存器每个位的功能。
-
-
寄存器地址的计算
为了方便编写代码及使用,我们将寄存器地址分为三个部分:
- 总线基地址(BUS_BASE_ADDR)
- 外设基于总线基地址的偏移量(PERIPH_OFFSET)
- 寄存器相对外设基地址的偏移量(REG_OFFSET)
寄存器地址 = BUS_BASE_ADDR+ PERIPH_OFFSET + REG_OFFSET
- 总线基地址(PERIPH_OFFSET )
总线 基地址 偏移量 APB1 0X4000 0000 0 APB2 0X4001 0000 0X1 0000 AHB 0X4001 8000 0X1 8000 - GPIO外设基地址及偏移量(APB2PERIPH_BASE)
所属总线 外设 基地址 偏移量 APB2 (0X4001 0000) GPIOA 0X4001 0800 0X800 GPIOB 0X4001 0C00 0XC00 GPIOC 0X4001 1000 0X1000 GPIOD 0X4001 1400 0X1400 GPIOE 0X4001 1800 0X1800 GPIOF 0X4001 1C00 0X1C00 GPIOG 0X4001 2000 0X2000 - GPIOA外设基地址及偏移量(GPIOA_BASE)
所属总线 所属外设 寄存器 地址 偏移量 APB2
(0X4001 0000)GPIOA
0X4001 0800GPIOA_CRL 0X4001 0800 0X00 GPIOA_CRH 0X4001 0804 0X04 GPIOA_IDR 0X4001 0808 0X08 GPIOA_ODR 0X4001 080C 0X0C GPIOA_BSRR 0X4001 0810 0X10 GPIOA_BRR 0X4001 0814 0X14 GPIOA_LCKR 0X4001 0818 0X18 -
寄存器映射的三个步骤:
-
外设寄存器结构体类型定义
typedef struct { __IO uint32_t CRL; /* GPIO_CRL 寄存器,相对外设基地址偏移量:0X00 */ __IO uint32_t CRH; /* GPIO_CRH 寄存器,相对外设基地址偏移量:0X04 */ __IO uint32_t IDR; /* GPIO_IDR 寄存器,相对外设基地址偏移量:0X08 */ __IO uint32_t ODR; /* GPIO_ODR 寄存器,相对外设基地址偏移量:0X0C */ __IO uint32_t BSRR; /* GPIO_BSRR 寄存器,相对外设基地址偏移量:0X10 */ __IO uint32_t BRR; /* GPIO_BRR 寄存器,相对外设基地址偏移量:0X14 */ __IO uint32_t LCKR; /* GPIO_LCKR 寄存器,相对外设基地址偏移量:0X18 */ } GPIO_TypeDef;
-
外设基地址定义
#define PERIPH_BASE 0x40000000UL /* 外设基地址 */ #define APB1PERIPH_BASE PERIPH_BASE /* APB1 总线基地址 */ #define APB2PERIPH_BASE (PERIPH_BASE + 0x00010000UL) /* APB2 总线基地址 */ #define AHBPERIPH_BASE (PERIPH_BASE + 0x00020000UL) /* AHB 总线基地址 */ #define GPIOA_BASE (APB2PERIPH_BASE + 0x00000800UL) /* GPIOA 基地址 */ #define GPIOB_BASE (APB2PERIPH_BASE + 0x00000C00UL) /* GPIOB 基地址 */ #define GPIOC_BASE (APB2PERIPH_BASE + 0x00001000UL) /* GPIOC 基地址 */ #define GPIOD_BASE (APB2PERIPH_BASE + 0x00001400UL) /* GPIOD 基地址 */ #define GPIOE_BASE (APB2PERIPH_BASE + 0x00001800UL) /* GPIOE 基地址 */ #define GPIOF_BASE (APB2PERIPH_BASE + 0x00001C00UL) /* GPIOF 基地址 */ #define GPIOG_BASE (APB2PERIPH_BASE + 0x00002000UL) /* GPIOG 基地址 */
-
GPIO外设寄存器映射定义
#define GPIOA ((GPIO_TypeDef *)GPIOA_BASE) /* GPIOA 寄存器地址映射 */ #define GPIOB ((GPIO_TypeDef *)GPIOB_BASE) /* GPIOB 寄存器地址映射 */ #define GPIOC ((GPIO_TypeDef *)GPIOC_BASE) /* GPIOC 寄存器地址映射 */ #define GPIOD ((GPIO_TypeDef *)GPIOD_BASE) /* GPIOD 寄存器地址映射 */ #define GPIOE ((GPIO_TypeDef *)GPIOE_BASE) /* GPIOE 寄存器地址映射 */ #define GPIOF ((GPIO_TypeDef *)GPIOF_BASE) /* GPIOF 寄存器地址映射 */ #define GPIOG ((GPIO_TypeDef *)GPIOG_BASE) /* GPIOG 寄存器地址映射 */
-
声明:参考文献来源: 战舰STM32F103ZET6开发板资源包
- Cortex-M3权威指南(中文).pdf
- STM32F10xxx参考手册_V10(中文版).pdf
- STM32F103 战舰开发指南V1.3.pdf
- STM32F103ZET6(中文版).pdf
- 战舰V4 硬件参考手册_V1.0.pdf
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!