我们都习惯了这种操作寄存器:
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;
知道如何在枚举中使用按位运算符吗?
枚举只是一组整数常量,它们不能在运行时对数据进行操作。例如,虽然您可以定义:
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;
例如,可以通过为单个外设的所有寄存器定义一个结构来更进一步。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句