我正在努力想出一种干净的方法来重新定义一些寄存器位域,以便在我正在使用的芯片上使用。
例如,这是 CAN 配置寄存器之一的定义:
extern volatile near unsigned char BRGCON1;
extern volatile near struct {
unsigned BRP0:1;
unsigned BRP1:1;
unsigned BRP2:1;
unsigned BRP3:1;
unsigned BRP4:1;
unsigned BRP5:1;
unsigned SJW0:1;
unsigned SJW1:1;
} BRGCON1bits;
这些定义都不是很有帮助,因为我需要像下面这样分配 BRP 和 SJW:
struct
{
unsigned BRP:6;
unsigned SJW:2;
} GoodBRGbits;
以下是我做过的两次尝试:
尝试#1:
union
{
byte Value;
struct
{
unsigned Prescaler:6;
unsigned SynchronizedJumpWidth:2;
};
} BaudRateConfig1 = {NULL};
BaudRateConfig1.Prescaler = 5;
BRGCON1 = BaudRateConfig1.Value;
尝试#2:
static volatile near struct
{
unsigned Prescaler:6;
unsigned SynchronizedJumpWidth:2;
} *BaudRateConfig1 = (volatile near void*)&BRGCON1;
BaudRateConfig1->Prescaler = 5;
有没有“更清洁”的方法来完成我想做的事情?此外,我对尝试 #2 中近乎不稳定的演员感到有些恼火。是否有必要指定一个变量是近的?