Bootstrap

三、C语言对寄存器的封装

目录

1、封装总线和外设基地址

2、 封装寄存器列表

3、修改寄存器的位操作方法

3.1、把变量的某位清零

3.2、把变量的某几个连续位清零

3.3、对变量的某几位进行赋值

3.4、对变量的某位取反

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的外设基地址,最后在外设基地址上加入各寄存器的地址偏移, 得到特定寄存器的地址。一旦有了具体地址,就可以用指针进行读写操作。


                
      
;