具有寄存器的枚举和按位运算符

时间:2017-11-08 03:30:43

标签: c embedded

我们都习惯了这种操作寄存器:

SomeRegister |= (1 << What_ever_bit_I_wanna_change ) // we do this for changing a specific bit to one without changing the others.

SomeRegister &= ~(1 << What_ever_bit_I_wanna_change ) // we do this for changing a specific bit to zero without changing the others.

我打算使用相同的范例,但是使用枚举,如下所示:

typedef enum  {
Acc_2g  (Something to change only the desired bits in the related register that I don't know how to do),
Acc_4g (Something to change only the desired bits in the related register that I don't know how to do)
}Res;

知道如何在枚举中使用按位运算符吗?

1 个答案:

答案 0 :(得分:2)

枚举只是一组整数常量,它们不能在运行时对数据执行操作。例如,您可以定义:

typedef enum  
{
    Acc_2g = 1 << 2,
    Acc_4g = 1 << 4
} Res ;

这不会“改变”问题中请求的任何位。你仍然需要使用相同的习语:

SomeRegister |= Acc_2g ;
SomeRegister &= ~(Acc_4g) ;  

您可能需要的是具有位字段的结构。但请注意,如果目的是访问某些硬件寄存器中的特定位,则需要查阅编译器的文档,了解它如何在位顺序和填充方面打包位字段 - 这些是依赖于实现/目标的,但是这个当寄存器也是目标特定时,不一定要避免。

例如,对于某些假设的8位寄存器:

typedef union
{
    uint8_t byte;

    struct
    {
         uint8_t bit012 : 3;
         uint8_t bit34  : 2;
         uint8_t bit5   : 1;
         uint8_t bit6   : 1;
         uint8_t bit7   : 1;
    } bits ;

} registerType;

然后,此类型可用于创建指向寄存器的指针:

registerType *pReg = (registerType*)0x00008000;

寄存器可以作为位字段访问:

pReg->bits.bit5 = 1;
pReg->bits.bit012 = 7;

或者作为整个寄存器:

pReg->byte = 0x55;

例如,可以通过为单个外设的所有寄存器定义结构来进一步发展。