STM32學習筆記——寄存器映射

存儲器映射

  1. 總線基地址
總線名稱 總線基地址
APB1 0x4000 0000
APB2 0x4001 0000
AHB 0x4000 8000
  1. 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

  1. 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;
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章