在读写DRV8711芯片寄存器的时候,同一个寄存器地址,不同的位代表不同的功能,为了简化操作,相同地址的功能用一个联合体value(uint_16)定义,在联合体内,对不同的位的寄存器进行长度定义,
这样1个Value对应多个寄存器位的数值.(共用一个地址)
总结: 结构体中每个成员变量都占用一定的存储空间,联合体的所有成员变量共享同一块内存空间
因此,结构体的内存大小等于所有成员变量大小之和,而联合体的内存大小等于最大成员变量的大小。
对结构体成员变量的赋值和访问是分别的,而对联合体的成员变量的赋值和访问是相互影响的。
union {
uint16_t Value;
struct {
uint16_t ENBL : 1;
uint16_t RDIR : 1;
uint16_t RSTEP : 1;
uint16_t MODE : 4;
uint16_t EXTALL : 1;
uint16_t ISGAIN : 2;
uint16_t DTIME : 2;
};
} CTRL;
union {
uint16_t Value;
struct
{
uint16_t TORQUE : 8;
uint16_t SMPLTH : 3;
};
} TORQUE;
union {
uint16_t Value;
struct
{
uint16_t TOFF : 8;
uint16_t PWMMODE : 1;
};
} OFF;
union {
uint16_t Value;
struct
{
uint16_t TBLANK : 8;
uint16_t ABT : 1;
};
} BLANK;
union {
uint16_t Value;
struct
{
uint16_t TDECAY : 8;
uint16_t DECMOD : 3;
};
} DECAY;
union {
uint16_t Value;
struct
{
uint16_t SDTHR : 8;
uint16_t SDCNT : 2;
uint16_t VDIV : 2;
};
} STALL;
union {
uint16_t Value;
struct
{
uint16_t OCPTH : 2;
uint16_t OCPDEG : 2;
uint16_t TDRIVEN : 2;
uint16_t TDRIVEP : 2;
uint16_t IDRIVEN : 2;
uint16_t IDRIVEP : 2;
};
} DRIVE;
union {
uint16_t Value;
struct
{
uint16_t OTS : 1;
uint16_t AOCP : 1;
uint16_t BOCP : 1;
uint16_t APDF : 1;
uint16_t BPDF : 1;
uint16_t UVLO : 1;
uint16_t STD : 1;
uint16_t STDLAT : 1;
};
} STATUS;
} Reg;