寄存器地址名称映射
写在前面:
对于MCU,一切低层配置都是配置寄存器
sfr P0=0x08;//P0映射到地址0x08
P0=0x00//往寄存器地址0x08赋值0x00
- STM32中的操作:
GPIOA->ODR=0x00000000;
以GPIOA为例说明STM32寄存器和名称的映射:
GPIOA下的某个寄存器,挂载在GPIOA下,地址为GPIOA基地址+偏移量
GPIOA挂载在APB2总线,地址为APB2总线基地址+GPIOA偏移量
ABP2挂载加外设基地址,地址为外设基地址+ABP2偏移量
代码为:
//外部总线基地址
#define PERIPH_BASE ((uint32_t)0x40000000)
//APB2基地址=外部总线基地址+偏移量
#define APB2PERIPH_BASE (PERIPH_BASE + 0x10000)
//GPIOA基地址=APB2基地址+偏移量
#define GPIOA_BASE (APB2PERIPH_BASE + 0x0800)
//GPIOA将地址顺序分配给7个32位寄存器(结构体分配)
#define GPIOA ((GPIO_TypeDef*)GPIOA_BASE)
//将寄存器地址映射到7个32位寄存器,分别控制
typedef struct
{
__IO unit32_t CRL;
__IO unit32_t CRH;
__IO unit32_t ODR;
__IO unit32_t IDR;
__IO unit32_t BSRR;
__IO unit32_t BRR;
__IO unit32_t LCKR;
}GPIO_TypeDef;
在STM32手册中:GPIO寄存器地址映像如下:
图中前两行写明寄存器及偏移值
综上所述
只有外围设备基地址是固定的,其他端口,外围设备总线,寄存器……等地址均由具体的地址偏移量层层递推而来(就如同此关系:外围设备基地址->外围设备总线->端口->寄存器)。
寄存器地址名称映射
写在前面:
对于MCU,一切低层配置都是配置寄存器
sfr P0=0x08;//P0映射到地址0x08
P0=0x00//往寄存器地址0x08赋值0x00
- STM32中的操作:
GPIOA->ODR=0x00000000;
以GPIOA为例说明STM32寄存器和名称的映射:
GPIOA下的某个寄存器,挂载在GPIOA下,地址为GPIOA基地址+偏移量
GPIOA挂载在APB2总线,地址为APB2总线基地址+GPIOA偏移量
ABP2挂载加外设基地址,地址为外设基地址+ABP2偏移量
代码为:
//外部总线基地址
#define PERIPH_BASE ((uint32_t)0x40000000)
//APB2基地址=外部总线基地址+偏移量
#define APB2PERIPH_BASE (PERIPH_BASE + 0x10000)
//GPIOA基地址=APB2基地址+偏移量
#define GPIOA_BASE (APB2PERIPH_BASE + 0x0800)
//GPIOA将地址顺序分配给7个32位寄存器(结构体分配)
#define GPIOA ((GPIO_TypeDef*)GPIOA_BASE)
//将寄存器地址映射到7个32位寄存器,分别控制
typedef struct
{
__IO unit32_t CRL;
__IO unit32_t CRH;
__IO unit32_t ODR;
__IO unit32_t IDR;
__IO unit32_t BSRR;
__IO unit32_t BRR;
__IO unit32_t LCKR;
}GPIO_TypeDef;
在STM32手册中:GPIO寄存器地址映像如下:
图中前两行写明寄存器及偏移值
综上所述
只有外围设备基地址是固定的,其他端口,外围设备总线,寄存器……等地址均由具体的地址偏移量层层递推而来(就如同此关系:外围设备基地址->外围设备总线->端口->寄存器)。
举报