这些偏移用于查阅 STM32F107xB/xC 的 GPIO、RCC、USART、TIM 和 ADC。它们是内存映射外设寄存器,不能与 CPU 的 R0、LR、PC 等核心寄存器混为一谈。
先确认器件与地址基准
跳转到“先确认器件与地址基准”历史记录写过“STM32F107ZET6”,但 STM32F105/107 数据手册列出的 F107 是128/256 KB Flash、64或100引脚系列;该名称不符合手册中的器件范围。应根据实物丝印、原理图和订货型号确认器件,不擅自将其改认成另一颗芯片。
这里的十六进制数都是相对于相应外设实例基址的字节偏移,不是完整地址。例如 GPIOA 和 GPIOB 的 ODR 偏移相同,但基址不同。基址、字段定义、访问宽度和外设是否存在,应同时对照 RM0008与所选器件头文件。偏移正确不代表随意写入该地址就是正确的初始化步骤。
GPIO:端口配置与输入输出
跳转到“GPIO:端口配置与输入输出”CRL 对应端口引脚0~7,CRH 对应8~15;IDR 与 ODR 分别反映输入和输出数据。BSRR 的置位/复位字段与 BRR 的复位用途应按手册使用,不能把所有寄存器都当作普通 RAM 任意读改写。以下布局属于 STM32F1,不能替代其他系列的 MODER 等布局。
| 寄存器名称 | 地址偏移 | 详细介绍 |
|---|---|---|
| GPIOx_CRL | 0x00 | 配置低 8 位 GPIO 引脚 |
| GPIOx_CRH | 0x04 | 配置高 8 位 GPIO 引脚 |
| GPIOx_IDR | 0x08 | 输入数据寄存器 |
| GPIOx_ODR | 0x0C | 输出数据寄存器 |
| GPIOx_BSRR | 0x10 | 位设置/重置寄存器 |
| GPIOx_BRR | 0x14 | 位重置寄存器 |
| GPIOx_LCKR | 0x18 | 配置锁定寄存器 |
RCC:互联型时钟与复位
跳转到“RCC:互联型时钟与复位”表中所有偏移都相对于 RCC 基址。STM32F105/107 的互联型 RCC 还包含 AHB 复位与 CFGR2 等寄存器;使用时应选择 RM0008 的互联型章节,不能只套用普通 F103 时钟树。
| 寄存器名称 | 地址偏移 | 详细介绍 |
|---|---|---|
| RCC_CR | 0x00 | 控制寄存器 |
| RCC_CFGR | 0x04 | 时钟配置寄存器 |
| RCC_CIR | 0x08 | 时钟中断寄存器 |
| RCC_APB2RSTR | 0x0C | APB2 外设复位寄存器 |
| RCC_APB1RSTR | 0x10 | APB1 外设复位寄存器 |
| RCC_AHBENR | 0x14 | AHB 外设时钟使能寄存器 |
| RCC_APB2ENR | 0x18 | APB2 外设时钟使能寄存器 |
| RCC_APB1ENR | 0x1C | APB1 外设时钟使能寄存器 |
| RCC_BDCR | 0x20 | 备用域控制寄存器 |
| RCC_CSR | 0x24 | 控制/状态寄存器 |
| RCC_AHBRSTR | 0x28 | AHB 外设复位寄存器 |
| RCC_CFGR2 | 0x2C | 互联型附加时钟配置寄存器 |
USART:状态、数据与通信参数
跳转到“USART:状态、数据与通信参数”下表对应 USART1~3 的布局。GTPR 用于保护时间和预分频,不是通用计时器寄存器;UART4/5 的功能子集不能仅凭共享的 C 结构体推断。SR 与 DR 的访问还可能参与状态清除序列,要按具体标志说明操作。
| 寄存器名称 | 地址偏移 | 详细介绍 |
|---|---|---|
| USART_SR | 0x00 | 状态寄存器 |
| USART_DR | 0x04 | 数据寄存器 |
| USART_BRR | 0x08 | 波特率寄存器 |
| USART_CR1 | 0x0C | 控制寄存器 1 |
| USART_CR2 | 0x10 | 控制寄存器 2 |
| USART_CR3 | 0x14 | 控制寄存器 3 |
| USART_GTPR | 0x18 | 保护时间和预分频寄存器 |
TIM:按具体定时器选择寄存器
跳转到“TIM:按具体定时器选择寄存器”以下列出原速查中的通用定时器主要项目,可用于对照 TIM2~5。TIM1 的高级控制布局还涉及 RCR、BDTR 等;TIM6/7 是基本定时器,不具有这张表中的全部捕获比较功能。共享 TIM_TypeDef 中有某个成员,不表示所有 TIM 实例都实现它。表中的空隙也不能当作可以使用的寄存器。
| 寄存器名称 | 地址偏移 | 详细介绍 |
|---|---|---|
| TIMx_CR1 | 0x00 | 控制寄存器 1 |
| TIMx_CR2 | 0x04 | 控制寄存器 2 |
| TIMx_SMCR | 0x08 | 从模式控制寄存器 |
| TIMx_DIER | 0x0C | DMA/中断使能寄存器 |
| TIMx_SR | 0x10 | 状态寄存器 |
| TIMx_EGR | 0x14 | 事件生成寄存器 |
| TIMx_CCMR1 | 0x18 | 捕获/比较模式寄存器 1 |
| TIMx_CCMR2 | 0x1C | 捕获/比较模式寄存器 2 |
| TIMx_CCER | 0x20 | 捕获/比较使能寄存器 |
| TIMx_CNT | 0x24 | 计数寄存器 |
| TIMx_PSC | 0x28 | 预分频器 |
| TIMx_ARR | 0x2C | 自动重装载寄存器 |
| TIMx_CCR1 | 0x34 | 捕获/比较寄存器 1 |
| TIMx_CCR2 | 0x38 | 捕获/比较寄存器 2 |
| TIMx_CCR3 | 0x3C | 捕获/比较寄存器 3 |
| TIMx_CCR4 | 0x40 | 捕获/比较寄存器 4 |
| TIMx_DCR | 0x48 | DMA 控制寄存器 |
| TIMx_DMAR | 0x4C | DMA 突发访问寄存器 |
ADC:规则组与注入组
跳转到“ADC:规则组与注入组”STM32F107 的 ADC1/ADC2 使用以下偏移。SQR 配置规则序列,JSQR 配置注入序列;JOFR 是注入通道偏移,JDR 保存注入转换数据。序列编码、对齐方式、转换触发与状态清除规则需要继续查对应字段说明。
| 寄存器名称 | 地址偏移 | 详细介绍 |
|---|---|---|
| ADC_SR | 0x00 | 状态寄存器 |
| ADC_CR1 | 0x04 | 控制寄存器 1 |
| ADC_CR2 | 0x08 | 控制寄存器 2 |
| ADC_SMPR1 | 0x0C | 采样时间寄存器 1 |
| ADC_SMPR2 | 0x10 | 采样时间寄存器 2 |
| ADC_JOFR1 | 0x14 | 注入通道数据偏移寄存器 1 |
| ADC_JOFR2 | 0x18 | 注入通道数据偏移寄存器 2 |
| ADC_JOFR3 | 0x1C | 注入通道数据偏移寄存器 3 |
| ADC_JOFR4 | 0x20 | 注入通道数据偏移寄存器 4 |
| ADC_HTR | 0x24 | 高位阈值寄存器 |
| ADC_LTR | 0x28 | 低位阈值寄存器 |
| ADC_SQR1 | 0x2C | 常规序列寄存器 1 |
| ADC_SQR2 | 0x30 | 常规序列寄存器 2 |
| ADC_SQR3 | 0x34 | 常规序列寄存器 3 |
| ADC_JSQR | 0x38 | 注入序列寄存器 |
| ADC_JDR1 | 0x3C | 注入数据寄存器 1 |
| ADC_JDR2 | 0x40 | 注入数据寄存器 2 |
| ADC_JDR3 | 0x44 | 注入数据寄存器 3 |
| ADC_JDR4 | 0x48 | 注入数据寄存器 4 |
| ADC_DR | 0x4C | 数据寄存器 |
用器件头文件核对布局
跳转到“用器件头文件核对布局”ST 的 stm32f107xc.h定义了对应外设结构。下面只做编译期布局检查,不访问设备寄存器;工程需要配置相应 CMSIS 与器件头文件搜索路径。
#include <stddef.h>#include "stm32f107xc.h"
_Static_assert(offsetof(GPIO_TypeDef, ODR) == 0x0C, "GPIO ODR offset");_Static_assert(offsetof(RCC_TypeDef, CFGR2) == 0x2C, "RCC CFGR2 offset");_Static_assert(offsetof(USART_TypeDef, GTPR) == 0x18, "USART GTPR offset");_Static_assert(offsetof(TIM_TypeDef, CCR1) == 0x34, "TIM CCR1 offset");_Static_assert(offsetof(ADC_TypeDef, DR) == 0x4C, "ADC DR offset");结构偏移检查只能核对布局。位字段意义、保留位处理、时钟使能、复位状态以及电路条件,还要分别验证。