STM32F103的GPIO

文章目录

STM32F103的地址

GPIO 都是挂载在 APB2 总线之上。

STM32F103的GPIOA的地址推算

(出自STM32F103开发指南P127)

GPIOA 的 7 个寄存器都是 32 位的,所以每个寄存器占有 4个地址,一共占用 28 个地址,地址偏移范围为(000h~01Bh)。

因为 GPIO 都是挂载在 APB2 总线之上,所以它的基地址是由 APB2 总线的基地址+GPIOA 在 APB2 总线上的偏移地址决定的。

打开 stm32f10x.h 定位到 GPIO_TypeDef 定义处:

c 复制代码
typedef struct
{
__IO uint32_t CRL;
__IO uint32_t CRH;
__IO uint32_t IDR;
__IO uint32_t ODR;
__IO uint32_t BSRR;
__IO uint32_t BRR;
__IO uint32_t LCKR;
} GPIO_TypeDef;

然后定位到:

c 复制代码
#define GPIOA ((GPIO_TypeDef *) GPIOA_BASE)

可以看出,GPIOA 是将 GPIOA_BASE 强制转换为 GPIO_TypeDef 指针,

GPIOA 指向地址 GPIOA_BASE,GPIOA_BASE 存放的数据类型为 GPIO_TypeDef。

查看 GPIOA_BASE的宏定义:

c 复制代码
#define GPIOA_BASE (APB2PERIPH_BASE + 0x0800)

依次类推,可以找到最顶层:

c 复制代码
#define APB2PERIPH_BASE (PERIPH_BASE + 0x10000)
#define PERIPH_BASE ((uint32_t)0x40000000)

所以我们便可以算出 GPIOA 的基地址位:

c 复制代码
GPIOA_BASE= 0x40000000+0x10000+0x0800=0x40010800

GPIOA 的各个寄存器对于 GPIOA 基地址的偏移地址,所以我们自然可以算出来每个寄存器的地址。

GPIOA 的寄存器的地址=GPIOA 基地址+寄存器相对 GPIOA 基地址的偏移值

那就是结构体存储的成员他们的地址是连续的

相关推荐
&AtTiTuDe;1 小时前
如何使用IIC外设(硬件IIC)
经验分享·笔记·stm32·单片机·嵌入式硬件·硬件工程
LightningJie1 小时前
STM32(十五):I2C通信
stm32·单片机·嵌入式硬件
辰哥单片机设计2 小时前
4×4矩阵键盘详解(STM32)
stm32·单片机·嵌入式硬件·矩阵·计算机外设·传感器
xuhc_zd2 小时前
STM32外设-0.96寸OLED显示屏
stm32·单片机
安科瑞刘鸿鹏2 小时前
分布式光伏发电系统如何确保电能质量达到并网要求?
服务器·网络·分布式·嵌入式硬件·能源
侥幸哥f2 小时前
GD32F103单片机-EXTI外部中断
单片机·gd32·exti
HeiLongMada3 小时前
从边缘设备到云端平台,合宙DTU&RTU打造无缝物联网解决方案
嵌入式硬件·物联网·硬件工程·pcb工艺
QQ19284999065 小时前
基于STM32无刷直流电机调速蓝牙APP无线监测控制系统
stm32·嵌入式硬件·mongodb
OH五星上将5 小时前
OpenHarmony(鸿蒙南向开发)——标准系统方案之瑞芯微RK3568移植案例(下)
linux·驱动开发·嵌入式硬件·harmonyos·openharmony·鸿蒙开发·系统移植
好家伙VCC9 小时前
STM32与51单片机的区别:是否应该直接学习STM32?
stm32·学习·51单片机