![](https://csdnimg.cn/release/download_crawler_static/86797336/bg3.jpg)
对于寄存器操作,比较常见或者比较简单的方法是按位进行掩码。这种方法的好处是简
便,容易上手,但不好的地方是代码复用能力差,难 以 读懂,需要结合 datasheet 阅读代码。
而联合体与位域方式操作寄存器的好处是,代码复用能力强,主程序简单易懂,可以同时对
寄存器整体进行操作或者对单个位进行操作。
掩码方式操作寄存器:
主要包括了读取(test)、置位(set)、清零(clear)和反转(toggle)操作
Test bit:与掩码(mask)相与(&)
例如:测试 0x4C 中第 4 位是否为 1
0x4C 01001100
& &
result 00001000
setting bits:|=(相应位为 1)
clearing bits:&=(相应位为 0)(也可以相应位为 1 再~取反)
toggling bits:^=(相应位为 1)
掩码宏:方便函数式生成掩码
#define BIT(X) (1<<(X)) //宏参数
#define STATUS BIT(22)//生成第 22 位的掩码
联合体与位域方式操作寄存器:
例如本例中的控制寄存器 GPFCON 的联合体如下
typedef union {
volatile unsigned int reg;//寄存器整体对象,方便对寄存器整体进行操作
struct {//寄存器位域结构,方便对单独引脚对象进行操作
volatile unsigned int GPF0_CON : 2;
volatile unsigned int GPF1_CON : 2;
volatile unsigned int GPF2_CON : 2;
volatile unsigned int GPF3_CON : 2;
volatile unsigned int GPF4_CON : 2;
volatile unsigned int GPF5_CON : 2;
volatile unsigned int GPF6_CON : 2;
volatile unsigned int GPF7_CON : 2;
volatile unsigned int reserved : 16;//高 16 位保留
}bits;
}GPFCON_r,*GPFCON_p;
联合体 Union 的好处是其定义的各个变量之间并不是独立的,而是可以相互覆盖的关
系。如果我们在联合体中同时定义了一个 int 类型和一个 char 类型,那么他们的关系就是这
样子的