场景
比如有以下寄存器0111 0110-》1011 0110
想把func1(2bit)赋值成10,一般这样写:
data = reg;
data |= (1<<7);
data &= ~(1<<6);
reg = data;
位域操作
有位域就可以这样操作
1.在h文件定义寄存器
#define REG_ADDR 0x15U
typedef struct {
uint8_t func1 : 2;
uint8_t func2 : 1;
uint8_t func3 : 1;
uint8_t func4 : 1;
uint8_t func5 : 3;
} reg_t;
typedef enum {
FUNC1_ENUM0 = 0,
FUNC1_ENUM1 = 1,
FUNC1_ERR = 2, /*不存在*/
} func1_enum;
typedef enum {
FUNC2_ENUM0 = 0,
FUNC2_ENUM1 = 1,
} func2_enum;
...
2.在c文件按功能赋值相应位
int reg_func1_set(func1_enum val)
{
reg_t data;
int ret;
ret = dev_read_bytes(REG_ADDR,&data,1);
if(ret == 0)
{
data.func1 = (uint8_t)val;
ret = dev_write_bytes(REG_ADDR,&data,1);
}
return ret;
}
int reg_func1_get(func1_enum *val)
{
reg_t data;
int ret;
ret = dev_read_bytes(REG_ADDR,&data,1);
switch (data.func1) {
case FUNC1_ENUM0:
*val = FUNC1_ENUM0;
break;
case FUNC1_ENUM1:
*val = FUNC1_ENUM1;
break;
default:
*val = FUNC1_ERR;
break;
}
return ret;
}
。。。