1. STM32F407ZGT6含义
首先明确下ARM和STM32之间的关系:ARM是英国芯片设计公司,ST是另芯片公司,ARM公司的开山之作为32位的嵌入式芯片,主要分为ARM7和ARM9,但是这只是芯片底层的核心架构,不具备外设功能,然后其出售内核的知识产权给其他公司,例如这里讲到的ST(意法半导体公司),其他公司在此内核基础上二次开发,搭建外围设备——IO、中断、串口等等。
ST | 意法半导体公司 |
---|---|
M | 微控制器 |
32 | 32位芯片 |
F | foundation |
407 | Cortex-M4、High-performance、DSP with FPU |
Z | 144 pins |
G | Code size 1024K |
T | QFP |
6 | temperature range -40 ~ +105 |
以下为其他代号的含义:
2. 存储器映射
怎么直观理解呢?有两个关键点.
一、存储器本身是没有地址的,就好比一幢大楼,里面有很多房间,但是这些房间一开始是没有房间号的,我们人为地按楼层次序给每个房间编号,才有了房间号,即每个房间的地址。同理,存储器内部有的只是一堆半导体元件,但是其与外部连接的总线在不同的电平序列下可以读取到特定储存单元的内容,所以我们人为地按总线中每一根地址线的电平高低给各个储存单元编号,于是每个储存单元就有了所谓的地址。
二、不同的外设在运行过程中会有数据和信息的交互,而每种不同的信息则存放在存储器的特定位置,因为芯片的硬件结构是固定的,所以信息存放的位置也是固定的。不同的地址段对应于不同的功能外设,就实现了映射。
STM32F407ZGT6最大可编址2^32 = 4G存储空间,平均划分为8块,依次为Block0、Block1 … Block7,以下为具体划分图:
重要的有三个:Block0、Block1、Block2
Blockx | function | address range |
---|---|---|
0 | SRAM(flash) | 0x0000 0000 ~ 0x1FFF FFFF |
CCM(64K) | 0x1000 0000 ~ 0x1000 FFFF | |
Flash(64K) | 0x0800 0000 ~ 0x080F FFFF | |
1 | SRAM | 0x2000 0000 ~ 0x2FFF FFFF |
SRAM(112K) | 0x0800 0000 ~ 0x080F FFFF | |
SRAM(16K) | 0x0800 0000 ~ 0x080F FFFF | |
2 | 片上外设 | 0x4000 0000 ~ 0x5FFF FFFF |
APB1 | 0x4000 0000 ~ | |
APB2 | 0x4001 0000 ~ | |
AHB1 | 0x4002 0000 ~ | |
AHB2 | 0x5000 0000 ~ |
3. GPIO
3.1 端口地址
GPIO挂接在AHB1上,其基址为0x4002 0000,所以可得GPIOA~GPIOI的各基址:
AHB1_BASE = 0x4002 0000
GPIOx_BASE | 基址偏移 |
---|---|
A | 0x0000 |
B | 0x0400 |
C | 0x0800 |
D | 0x0C00 |
E | 0x1000 |
F | 0x1400 |
G | 0x1800 |
H | 0x1C00 |
I | 0x2000 |
3.2 各IO的寄存器
每个IO都有9个32位寄存器:4个配置寄存器(_MODER / _TYPER / _SPEEDR / _PUPDR ),2个数据寄存器( _ODR / _IDR ),1个置复位寄存器( _BSRR ),1个状态锁存( _LCKR ),1个64位的状态复位存储器分为两个32位寄存器( _ANRL / _ANRH )
(1)GPIOx_MODER 端口模式
每两位定义一位口的工作模式,00、01、10、11
MODERy[1:0] | 功能描述 |
---|---|
00 | 输入(复位模式) |
01 | 通用输出 |
10 | 复用功能模式 |
11 | 模拟输入 |
(2)GPIOx_OTYPER 端口输出类型
只用到了低16位,每位对应一个IO位
OTy[0] | 功能描述 |
---|---|
0 | 推挽(复位) |
1 | 开漏 |
(3)GPIOx_OSPEEDR 端口输出速度
OSPEEDRy[1:0] | 功能描述 |
---|---|
00 | 2Mhz (低速) |
01 | 25Mhz (中速) |
10 | 100Mhz (快速) |
11 | 30 pF 时为 100 MHz(高速(15 pF 时为 80 MHz 输出(最大速度)) |
(4)GPIOx_PUPDR 端口上拉/下拉
PUPDRy[1:0] | 功能描述 |
---|---|
00 | 皆无 |
01 | 上拉 |
10 | 下拉 |
11 | 保留 |
(5)GPIOx_IDR 端口输入数据寄存器
用到了寄存器的低16位,每位对应IO的一位,只读
(6)GPIOx_ODR 端口输出数据寄存器
每位IO对应寄存器低16位,读写
(7)GPIOx_BSRR 置复位寄存器
高16位[31:16]为置位功能,低16位[15:0]位复位功能。
BSy | |
---|---|
0 | 无操作 |
1 | ODRy相应位置1 |
BRy | |
0 | 无操作 |
1 | ODRy相应位置0 |
(8)GPIOx_LCKR 配置锁定寄存器
(9)GPIOx_ANR 复用功能寄存器
复用功能寄存器实际上应该是一个64位的寄存器,因为一个16位的IO每位有16种复用功能,就需要4位进行配置,4*16 = 64。为了同前面的寄存器保持一致,把64位拆分为2个32位寄存器,ANRL和ANRH,前者配置IO[7:0],后者配置IO[15:8].
以上就是每个IO的全部寄存器了,除了对每个寄存器的使用外,还需注意的是在使用前要对IO进行时钟使能,RCC_AHB1用来配置外设时钟使能。