单片机中的可位寻址是通过UNION实现的吗?

来源:百度知道 编辑:UC知道 时间:2024/05/17 01:03:23
typedef union {
byte Byte;
struct {
byte AM0 :1; /* Acceptance Mask Bit 0 */
byte AM1 :1; /* Acceptance Mask Bit 1 */
byte AM2 :1; /* Acceptance Mask Bit 2 */
byte AM3 :1; /* Acceptance Mask Bit 3 */
byte AM4 :1; /* Acceptance Mask Bit 4 */
byte AM5 :1; /* Acceptance Mask Bit 5 */
byte AM6 :1; /* Acceptance Mask Bit 6 */
byte AM7 :1; /* Acceptance Mask Bit 7 */
} Bits;
} CANIDMR5STR

如上所示,但是联合体的地址又是一致的,而位寻址里地址是分开的,望达人指点。

可以。
这是标准的ANSI C的实现方法,TI公司的代码就是基于这种方法来实现的。
这种方法可以按寄存器访问,也可以按位访问,比如
具体来说,
在联合体中的起始地址是一样的,也就是说,字节型变量Byte和结构体Bits的地址是同一个地址。但是在结构体内,是按照顺序排列的,AM0-AM7。这样,就实现了按位寻址和按字节寻址的方法。

具体应用可以这样使用:
volatile CANIDMR5STR* Regs = (byte *)REGESTER; /*REGISTER是所指向的寄存器的地址*/
Regs -> Byte = 0xFF;/*这是访问整个寄存器的方法*/

Regs -> Bits.AM0 = 0;/*这是按位访问的方法*/

51724991 群

byte AM0 :1;
这个“ :1 ” 是否是占一位的意思,以此类推就成了8个数据位了吧。