初识单片机

82 阅读1分钟

寄存器 

单片机的核心,就在于寄存器。单片机的一切操作,都要通过操作寄存器来实现。

所谓寄存器,就是一块被指定了特定功能的连续的内存。各个寄存器的基地址,就是它的内存地址,或者说,表明了该范围的内存地址的功能。

对于寄存器的操作,我们一般使用位运算。使用&= ~来置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速度

待续……