当一个寄存器有不同位域时,我们需要给不同位域赋值。如何赋值方便呢?下面有两种方法,总结一下。个人觉得位域写法更简洁。
整体寄存器法
typedef struct StrNa {
uint32_t reg1; // reg1[31:16]=位域1, reg1[15:0]=位域2
} StrNa_t;
- 整体赋值时直接赋值:
StrNa_t strNa = 0x55aa55aa;
- 位域赋值时分4步:
uint32_t temp;
StrNa_t strNa = 0x0;
temp = strNa; // 1 赋给中间变量
temp &= 0x0000ffff; // 2 位与操作对要赋值的位域清零
temp |= (num << 15); // 3 位或操作来赋值
strNa = temp; // 4 值传递给结构体
位域寄存器法
typedef struct StrNa {
//uint32_t reg1; // reg1[31:16]=位域1, reg1[15:0]=位域2
union reg1 {
struct r1 {
uint32_t wei1 : 16;
uint32_t wei2 : 16;
} r1_t;
uint32_t reg;
} reg1_e;
} StrNa_t;
- 整体赋值时使用reg直接赋值:
StrNa_t strNa->reg1_e.reg = 0x55aa55aa; - 位域赋值时使用r1直接赋值:
strNa->r1_t.wei1 = num;
个人推荐此种写法