
STM32 拥有 32 位地址总线总共有个地址编号每个地址编号对应 1 字节存储单元整体寻址空间为 4GB。 硬件 32 位寄存器数据宽度为 32bit等价 4 字节因此占用4 个连续的地址编号。 地址编号仅作为定位索引本身不占用任何存储空间。1、AHB/APB 外设寄存器GPIO‑CRL、ODR、TIM 寄存器这类硬件规定只支持 32 位字访问。 你不能发出 8 位读 / 16 位读总线命令去访问外设寄存器的其中一个字节硬件会报错总线 HardFault。想拿到其中某一个字节先做 32 位读把整个 32 位寄存器全部读回来在 CPU 内部软件层面移位、掩码提取你想要的那一字节写的时候更特殊不能读改其中一个字节再写回去很多外设寄存器有写‑1 清零、写只生效的特殊位简单读‑改‑写会带来副作用。 比如 BSRR 寄存器高 16 位写 1 清零写 0 无作用如果你读改写会把复位位误触发。2、GPIOA/GPIOB/GPIOC 靠什么确定靠外设基地址STM32 的片上外设全部映射到4GB 地址空间每一组 GPIO (A/B/C/D/E) 都有独立的起始基地址。Cortex‑M3 是 32 位内核外设寄存器都是内存映射操作地址就是操作硬件寄存器。GPIOA_BASE 0x40010800 GPIOB_BASE 0x40010C00 GPIOC_BASE 0x40011000 GPIOD_BASE 0x40011400 GPIOE_BASE 0x40011800具体的访问地址基地址 偏移地址一组 GPIO16 个引脚Pin0~Pin15CRL偏移0x0032 位寄存器管理Pin0‑Pin7每个引脚占 4bitCNF [1:0]MODE [1:0]8 个引脚 ×4bit 32bit刚好填满。CRH偏移0x0432 位寄存器管理Pin8‑Pin15同样 8 个引脚 ×4bit 32bit。✅ 所以16 个引脚正好需要 2 个 32 位配置寄存器 CRL、CRH用来配置模式、CNF、速度 MODE。每组 GPIO 完整寄存器列表每组 GPIO 都有这一套地址 本组基地址 偏移寄存器偏移位宽作用CRL0x0032bitPin0‑7 模式配置CRH0x0432bitPin8‑15 模式配置IDR0x0832bit输入数据寄存器读引脚电平ODR0x0C32bit输出数据寄存器输出电平BSRR0x1032bit置位 / 复位推荐用来写输出避免中断冲突BRR0x1432bit专门复位引脚LCKR0x1832bit锁存 IO 配置3、STM32F1 GPIO 全部 7 个寄存器全称 缩写 偏移 解释每组 GPIOA/GPIOB/GPIOC 都独立拥有这 7 个 32 位寄存器GPIO组7个寄存器完整解释STM32F1每组GPIOA/GPIOB/GPIOC都各有一套基地址如GPIOA_BASE 0x40010800偏移就是在基地址之上加的字节数全部都是32位寄存器。1、CRL 偏移0x00 【端口配置低寄存器】全称GPIO Port Configuration Low register管控Pin0 ~ Pin7共8个引脚。 每个引脚占用4个 bitCNF[1:0]配置模式推挽 / 开漏 / 输入上拉等MODE[1:0]配置输出速度。 8 引脚 ×4bit 32bit刚好填满这个寄存器。 功能配置引脚方向、电气模式、输出最大速度。 可读可写。 例PA3占用 CRL 的 bit12‑bit15。2、CRH 偏移0x04 【端口配置高寄存器】全称GPIO Port Configuration High register管控 Pin8 ~ Pin158 个引脚。 结构和 CRL 完全一样每个引脚 4bitCNFMODE。 功能配置 8‑15 号引脚的模式、速度。 可读可写。 例PA12占用 CRH 的 bit16‑bit19。✔CRLCRH 只做模式配置不控制引脚高低电平。3、IDR 偏移0x08 【输入数据寄存器】全称GPIO Port Input Data Register32 位只用低 16 位 bit0‑bit15每一位对应一个 GPIO 引脚。 只读寄存器不能写。 作用读取外部引脚真实电平。bitx1引脚为高bitx0引脚为低。注意读的是芯片引脚上实际外部电平不是 ODR 输出值。输入模式下用它输出模式读 IDR 也可以读引脚真实电平。4、ODR 偏移0x0C 【输出数据寄存器】全称GPIO Port Output Data Register只用低 16 位 bit0‑bit15。 可读、可写。功能保存 GPIO 输出的目标电平。输出模式时寄存器 bit 为 1 引脚输出高bit 为 0 输出低。重要BSRR/BRR 最终硬件上就是修改 ODR 寄存器的值。 缺点直接操作 ODR 置位 / 清零需要读‑改‑写在中断嵌套场景下有风险。5、BSRR 偏移0x10 【置位 / 复位寄存器】全称GPIO Port Bit Set/Reset Register32 位只写寄存器读出来是垃圾禁止读取。bit0‑bit15低 16 位写1 → 把对应引脚置高写0无任何动作。bit16‑bit31高 16 位写1 → 把对应引脚拉低写0无任何动作。优点直接赋值不需要读‑改‑写中断安全。使用GPIOA-BSRR GPIO_Pin5;拉高只有PA5的 第5位即bit5被置1其他位为0因此其他位不受影响。GPIOA-BSRR GPIO_Pin516;拉低。6、BRR 偏移0x14 【复位寄存器】全称GPIO Port Bit Reset Register32 位只写寄存器。仅低 16 位有效写1对应引脚拉低写0无动作高 16 位无效。等价于 BSRR 的高 16 位功能。 工程一般优先用 BSRRBRR 用的比较少。7、LCKR 偏移0x18 【配置锁存寄存器】全称GPIO Port Configuration Lock Register用于锁定 GPIO 的 CRL/CRH 配置。按照特定写序列写入锁存序列GPIO 配置就被硬件锁死。锁死后CRL、CRH 将无法修改直到芯片复位。作用防止运行过程中意外改写 IO 配置增加固件健壮性。普通开发几乎不用。一句话速记CRL/CRH设置 IO 是什么模式、速度IDR读引脚外面真实电平只读ODR保存输出电平可读但有读改写风险BSRR置位复位只写中断安全BRR单纯复位引脚只写LCKR锁住 IO 配置防止误修改