我正在使用 CodeWarrior V10.6 中的摩托罗拉 HCS08 µCU,我正在尝试创建一个extern
包含来自现有寄存器的位的位域。在 µCU 标头中创建位域的方式就像
typedef unsigned char byte;
typedef union {
byte Byte;
struct {
byte PTAD0 :1;
byte PTAD1 :1;
byte PTAD2 :1;
byte PTAD3 :1;
byte PTAD4 :1;
byte PTAD5 :1;
byte PTAD6 :1;
byte PTAD7 :1;
} Bits;
} PTADSTR;
extern volatile PTADSTR _PTAD @0x00000000;
#define PTAD _PTAD.Byte
#define PTAD_PTAD0 _PTAD.Bits.PTAD0
#define PTAD_PTAD1 _PTAD.Bits.PTAD1
#define PTAD_PTAD2 _PTAD.Bits.PTAD2
#define PTAD_PTAD3 _PTAD.Bits.PTAD3
#define PTAD_PTAD4 _PTAD.Bits.PTAD4
#define PTAD_PTAD5 _PTAD.Bits.PTAD5
#define PTAD_PTAD6 _PTAD.Bits.PTAD6
#define PTAD_PTAD7 _PTAD.Bits.PTAD7
例如,这将使寄存器值通过PTAD = 0x01
、 或更改PTAD_PTAD0 = 1
。这个定义对于 PTAD, PTBD, PTCD, ... PTGD 基本相同,唯一改变的是地址。
我尝试从以前的现有变量中创建自定义位域是
typedef union {
byte Byte;
struct {
byte *DB0;
byte *DB1;
byte *DB2;
byte *DB3;
byte *DB4;
byte *DB5;
byte *DB6;
byte *DB7;
} Bits;
} LCDDSTR;
我会将位域创建并初始化为LCDDSTR lcd = {{&PTGD_PTGD6, &PTBD_PTBD5, ...}}
,因为由于某种原因,如何根据 C 编程语言标准初始化结构中LCDSTR lcd = {*.Bits.DB0 = &PTGD_PTGD6, *.Bits.DB1 = &PTBD_PTBD5, ...}
的初始化(将其视为结构,请再次纠正我)中的建议不适用于此编译器(它确实适用于在线编译器)。
但是,正如您所看到的,我正在对位进行分组,并且(如果可以的话)我将能够通过执行*lcd.Bits.DB0 = 1
或类似的操作来更改实际寄存器的值,但如果我这样做lcd.Byte = 0x00
,我会改变中包含的内存地址的最后一个(我认为)字节lcd.Bits.DB0
,你知道,因为结构实际上并不包含数据,而是包含指针。
我将如何继续实现能够包含和修改来自多个寄存器的位的结构?(我想这里的问题是,在内存中,这些位不是一个接一个的,我想这会更容易)。甚至可能吗?我希望是的。