寄存器
单片机的核心,就在于寄存器。单片机的一切操作,都要通过操作寄存器来实现。
所谓寄存器,就是一块被指定了特定功能的连续的内存。各个寄存器的基地址,就是它的内存地址,或者说,表明了该范围的内存地址的功能。
对于寄存器的操作,我们一般使用位运算。使用&= ~来置0,使用|=来置1。但是,一般不会也没有必要直接使用内存地址来进行赋值,因为对代码的可读性与可移植性造成很大损害。
库函数
一般而言,我们会将必要的数据封装起来,为其赋予一个直观的名字。比如
/*外设基地址/起始地址*/
#define PERIPH_BASE ((unsigned int) 0x40000000)
/*总线基地址*/
#define APB1PERIPH_BASE PERIPH_BASE
#define APB2PERIPH_BASE (PERIPH_BASE + 0X00010000)
#define AHBPERIPH_BASE (PERIPH_BASE + 0X00018000)
/*GPIO口地址*/
#define GPIOA_BASE (APB2PERIPH_BASE + 0X0800)
诸如此类。
封装不仅仅能封装GPIO端口,一切我们需要用到的内容都可以进行封装。比如初始化GPIO端口寄存器,比如每个端口的寄存器:
typedef struct {
uint32_t CRL;
uint32_t CRH;
uint32_t IDR;
uint32_t ODR;
uint32_t BSRR;
uint32_t BRR;
uint32_t LCKR;
}GPIO_TypeDef;
//利用寄存器内存地址连续的特点,使用结构体存储
typedef struct{
uint16_t GPIO_Pin;
GPIOSpeed_Typedef GPIO_Speed;
uint16_t GPIO_Mode;
}GPIO_InitTypeDef;
typedef enum
{
GPIO_Speed_10MHz = 1,
GPIO_Speed_2MHz,
GPIO_Speed_50MHz
}GPIOSpeed_TypeDef;
//利用enum成员递增的特点定义GPIO速度
待续……