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

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

相关推荐
liwulin05061 小时前
【ESP32-S3】通过ROS2使用YDLIDAR X2进行SLAM、自主导航方案选择
单片机·嵌入式硬件
Truffle7电子2 小时前
STM32理论 —— FreeRTOS:任务
stm32·嵌入式·rtos
廷华电子2 小时前
SSI接口板设计
stm32·电机控制
是翔仔呐2 小时前
第11章 显示外设驱动:I2C协议OLED屏、SPI协议LCD屏字符/图片/中文显示
c语言·开发语言·stm32·单片机·嵌入式硬件·学习·gitee
-凌凌漆-4 小时前
【嵌入式】FreeRTOS串口等待vTaskDelay()
嵌入式硬件
小昭在路上……5 小时前
GPIO端口引脚(位域)打包技巧笔记
单片机·嵌入式硬件
是翔仔呐5 小时前
第13章 SPI通信协议全解:底层时序、4种工作模式与W25Qxx Flash芯片读写实战
c语言·开发语言·stm32·单片机·嵌入式硬件·学习·gitee
悠哉悠哉愿意5 小时前
【单片机复习笔记】第十六届省赛复盘
笔记·单片机·嵌入式硬件
IT方大同5 小时前
RT_thread(RTOS实时操作系统)线程的创建与切换
c语言·开发语言·嵌入式硬件
是翔仔呐5 小时前
第14章 CAN总线通信全解:底层原理、帧结构与双机CAN通信实战
c语言·开发语言·stm32·单片机·嵌入式硬件·学习·gitee