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的详细介绍:
架构和特性:
性能:
指令集和代码密度:
低功耗设计:
嵌入式特性:
适用领域:
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主控总线之间的访问仲裁,仲裁利用轮换算法,保证各个总线之间的有序访问,从而确保工作正常。
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 |
小类 | 说明 | |
---|---|---|
内核存储器 | 内核相关寄存器 | 包含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
总线 | 基地址 | 偏移量 |
---|---|---|
APB1 | 0X4000 0000 | 0 |
APB2 | 0X4001 0000 | 0X1 0000 |
AHB | 0X4001 8000 | 0X1 8000 |
所属总线 | 外设 | 基地址 | 偏移量 |
---|---|---|---|
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 |
所属总线 | 所属外设 | 寄存器 | 地址 | 偏移量 |
---|---|---|---|---|
APB2 (0X4001 0000) | GPIOA 0X4001 0800 | GPIOA_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