首先要清楚的一点,所有操作,最终目的都是操作寄存器
一,对比51单片机和STM32对寄存器的操作
1)51单片机:
sfr P0=0x80;
P0=0x00;
2)STM32:
GPIOA->ODR=0x00000000
二,以GPIOA为例说明STM32寄存器和名称的映射:
GPIOA下的某个寄存器,挂载在GPIOA下,地址为GPIOA基地址+偏移量
GPIOA挂载在APB2总线,地址为APB2总线基地址+GPIOA偏移量
ABP2挂载加外设基地址,地址为外设基地址+ABP2偏移量
源码中可以找到:
#define PERIPH_BASE ((uint32_t)0x40000000)
#define APB2PERIPH_BASE (PERIPH_BASE + 0x10000)
#define GPIOA_BASE (APB2PERIPH_BASE + 0x0800)
#define GPIOA ((GPIO_TypeDef*)GPIOA_BASE)
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;
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
在STM32手册中:GPIO寄存器地址映像如下:
如此,实现STM32寄存器名称和地址之间的映射关系