目录
1、封装总线和外设基地址
把总线基地址和外设基地址都以相应的宏定义起来,总线或者外设都以他们的名字作为宏名。
/* 外设基地址 */
#define PERIPH_BASE ((unsigned int)0x40000000)
/* 总线基地址 */
#define APB1PERIPH_BASE PERIPH_BASE
#define APB2PERIPH_BASE (PERIPH_BASE + 0x00010000)
#define AHB1PERIPH_BASE (PERIPH_BASE + 0x00020000)
#define AHB2PERIPH_BASE (PERIPH_BASE + 0x10000000)
/* GPIO外设基地址 */
#define GPIOA_BASE (AHB1PERIPH_BASE + 0x0000)
#define GPIOB_BASE (AHB1PERIPH_BASE + 0x0400)
#define GPIOC_BASE (AHB1PERIPH_BASE + 0x0800)
#define GPIOD_BASE (AHB1PERIPH_BASE + 0x0C00)
#define GPIOE_BASE (AHB1PERIPH_BASE + 0x1000)
#define GPIOF_BASE (AHB1PERIPH_BASE + 0x1400)
#define GPIOG_BASE (AHB1PERIPH_BASE + 0x1800)
#define GPIOH_BASE (AHB1PERIPH_BASE + 0x1C00)
/* 寄存器基地址,以GPIOF为例 */
#define GPIOF_MODER (GPIOF_BASE+0x00)
#define GPIOF_OTYPER (GPIOF_BASE+0x04)
#define GPIOF_OSPEEDR (GPIOF_BASE+0x08)
#define GPIOF_PUPDR (GPIOF_BASE+0x0C)
#define GPIOF_IDR (GPIOF_BASE+0x10)
#define GPIOF_ODR (GPIOF_BASE+0x14)
#define GPIOF_BSRR (GPIOF_BASE+0x18)
#define GPIOF_LCKR (GPIOF_BASE+0x1C)
#define GPIOF_AFRL (GPIOF_BASE+0x20)
#define GPIOF_AFRH (GPIOF_BASE+0x24)
首先定义了 “片上外设”基地址PERIPH_BASE,接着在PERIPH_BASE上加入各个总线的地址偏移, 得到APB1、APB2、AHB1和AHB2总线的基地址APB1PERIPH_BASE、APB2PERIPH_BASE,AHB1PERIPH_BASE和AHB2PERIPH_BASE。 然后在AHB1总线基地址上加上GPIO外设的地址偏移,得到GPIOA~GPIOH的外设基地址,最后在外设基地址上加入各寄存器的地址偏移, 得到特定寄存器的地址。一旦有了具体地址,就可以用指针进行读写操作。