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 基地址的偏移值

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

相关推荐
二进制coder18 分钟前
深入浅出:I²C多路复用器PCA9546详解 - 解决地址冲突,扩展你的I²C总线
c语言·开发语言·单片机
Lhj06161 小时前
stm32 can错误中断不处理
stm32·单片机·嵌入式硬件
啃硬骨头2 小时前
AURIX-TC3xx-GTM详解六-DPLL(Digital PLL Module)
单片机·嵌入式硬件
hazy1k2 小时前
51单片机基础-RS485通信
stm32·单片机·嵌入式硬件·51单片机
三佛科技-134163842123 小时前
脱毛仪方案开发,家用激光毛仪/电动脱毛仪MCU方案设计
单片机·嵌入式硬件
阿川!3 小时前
嵌入式软件--STM32 SPI通信(上)
stm32·单片机·嵌入式硬件
芯岭3 小时前
内含32位MCU的无线收发芯片XL2422
单片机·嵌入式硬件·信息与通信·射频工程
宫瑾4 小时前
STM32USB学习
stm32·嵌入式硬件·学习
1379号监听员_5 小时前
嵌入式软件架构--按键消息队列3(测试)
开发语言·stm32·单片机·嵌入式硬件·架构
迎風吹頭髮5 小时前
Linux服务器编程实践57-功能强大的网络信息函数getaddrinfo:支持IPv4与IPv6
单片机·嵌入式硬件