F4系统架构
8个主控总线+7个被控总线
主控总线
- Cortex-M4内核 I总线
- Cortex-M4内核 D总线
- Cortex-M4内核 S总线
- DMA1存储器总线
- DMA2存储器总线
- DMA2外设总线
- 以太网DMA总线
- USB OTG HS DMA总线
被控总线
- 内部FLASH ICode总线
- 内部FLASH DCode总线
- 主要内部SRAM1(112KB)
- 辅助内部SRAM2(16KB)
- 辅助内部SRAM3(64KB)(适用于F42xxx和F43xxx)
- AHB1外设(包括AHB-APB总线桥和APB外设)
- AHB2外设
- FSMC
- 主控总线
- 被控总线
CCM RAM:只能存数据,优点访问速度快,缺点不支持DMA
总线时钟频率:
- AHB1/2:168/180MHz(Max)
- APB1:42/45MHz(Max)
- APB2:84/90MHz(Max)
FSMC主要用于扩展外部存储器
STM32的寻址范围
32位的单片机有32根地址线(每根地址线有两种状态:导通或不导通)
单片机内存地址访问的存储单元是按字节编址的(而不是bit)
STM32寻址大小:232=4G(字节)
寻址范围:0x00000000~0xFFFFFFFF
存储器映射
存储器指可以存储数据的设备,本身没有地址信息,对存储器分配地址的过程称为存储器映射。
存储器功能划分(F1为例),ST将4G(232)地址空间分成8个块
- Block0:Code(FLASH)—— 0x0000 0000 ~ 0x1FFF FFFF(512MB)
- Block1:SRAM —— 0x2000 0000 ~ 0x3FFF FFFF(512MB)
- Block2:片上外设 —— 0x4000 0000 ~ 0x5FFF FFFF(512MB)
- Block7:Cortex M3内部外设 —— 0xE000 0000 ~ 0xFFFF FFFF(512MB)
寄存器映射
寄存器是单片机内部一种特殊的内存,可以实现对单片机各个功能的控制。
寄存器就是单片机内部的控制机构
STM32寄存器分类
寄存器是特殊的存储器,给寄存器地址命名的过程,就叫寄存器映射。
寄存器地址计算
为了方便编写代码及使用,我们将寄存器地址分为三个部分:
- 总线基地址
- 外设基于总线基地址的偏移量
- 寄存器相对于外设基地址的偏移量
APB1总线的基地址,也叫外设基地址
GPIOA_ODR寄存器地址计算过程:
- 获取外设挂在哪个总线上面?查系统结构图
- 获取总线基地址,APB2总线基地址:0x4001 0000
- 获取外设地址偏移量,GPIOA相对APB2总线偏移量是:0x800
- 获取寄存器地址偏移量,ODR相对GPIOA外设基地址的偏移量是:0x0C
typedef struct
{
__IO uint32_t CRL;
__IO uint32_t CRH;
...
}GPIO_TypeDef;
GPIOA_BASE:0x4001 0800
#define GPIOA (GPIO_TypeDef *)GPIOA_BASE
GPIOA->ODR = 0XFFFF;
STM32F103xe.h主要组成部分
- 中断编号定义:定义IRQn_Type枚举类型,包含STM32F103内部所有中断编号(中断号),方便后续编写代码。
- 外设寄存器结构体类型定义:以外设为单位,使用结构体类型定义每个外设所有寄存器,方便寄存器映射。
- 寄存器映射:1、定义总线地址和外设基地址。2、使用外设结构体类型定义将外设基地址强制转换成结构体指针,完成寄存器映射。
- 寄存器位定义:定义外设寄存器每个功能位的位置及掩码。
- 外设判定:判断某个外设是否合法(即是否存在该外设)。