STM32學習筆記——寄存器映射
存儲器映射
- 總線基地址
總線名稱 | 總線基地址 |
---|---|
APB1 | 0x4000 0000 |
APB2 | 0x4001 0000 |
AHB | 0x4000 8000 |
- GPIO基地址
GPIO端口掛在總線APB2上
端口名稱 | 端口基地址 |
---|---|
GPIOA | 0x4001 0800 |
GPIOB | 0x4001 0C00 |
GPIOC | 0x4001 1000 |
GPIOD | 0x4001 1400 |
GPIOE | 0x4001 1800 |
GPIOF | 0x4001 1C00 |
GPIOG | 0x4001 2000 |
每個端口的基地址相差0x400
- GPIOx端口的寄存器列表
以GPIOB端口爲例
寄存器名稱 | 寄存器基地址 | 偏移地址 |
---|---|---|
GPIOB_CRL | 0x4001 0C00 | 0x00 |
GPIOB_CRH | 0x4001 0C00 | 0x04 |
GPIOB_IDR | 0x4001 0C00 | 0x08 |
GPIOB_ODR | 0x4001 0C00 | 0x0C |
GPIOB_BSRR | 0x4001 0C00 | 0x10 |
GPIOB_BRR | 0x4001 0C00 | 0x14 |
GPIOB_LCKR | 0x4001 0C00 | 0x18 |
每個寄存器地址相差0x04
GPIOB端口寄存器描述——使PB0輸出0/1
宏定義方式
#define PERIPH_BASE ((unsigned int)0x40000000)
#define APB2PERIPH_BASE (PERIPH_BASE + 0x00010000)
#define GPIO_BASE (APB2PERIPH_BASE + 0x0C00)
#define GPIO_ODR *(unisgned int*)(GPIO_BASE + 0x0C)
//PB0輸出低電平
GPIO_ODR &= ~(1<<0);
//PB0輸出高電平
GPIO_ODR |= (1<<0)
(GPIO_BASE + 0x0C)對應GPIO_ODR寄存器地址
(unsigned int*) 將(GPIO_BASE + 0x0C)強制轉化爲指針
(*)指針操作,指向GPIO_ODR地址
結構體封裝
typedef unsigned int uint32_t; /*無符號32位變量*/
typedef unsigned short int uint16_t; /*無符號16位變量*/
/*GPIO寄存器列表*/
typedef struct{
uint32_t CRL; /*地址偏移0x00*/
uint32_t CRH; /*地址偏移0x04*/
uint32_t IDR; /*地址偏移0x08*/
uint32_t ODR; /*地址偏移0x0C*/
uint32_t BSRR; /*地址偏移0x10*/
uint32_t BRR; /*地址偏移0x14*/
uint32_t LCKR; /*地址偏移0x18*/
}GPIO_TypeDef;
GPIO_TypeDef* GPIOx;
GPIOx = GPIO_BASE;
GPIO->ODR = 0xFFFFE;