- 简单介绍结构体
定义结构体,一般是对有相同属性的元素或成员的归纳,比如电机的电气特性:驱动电压、驱动电流、运行速度;还有比如系统报警类:过压报警、过流报警、欠压报警
本人常用格式
typedef struct
{
u8 Volt;//成员变量
u8 Curr;
u16 Speed;
}Motor_InitTypeDef;
当然,还有其它的格式,可以自行查找
使用方法:
Motor_InitTypeDef Motor_InitStre;//定义结构体变量
Motor_InitStre. Volt=23;//引用成员变量
2.位域
定义位域,本人理解是,一方面是为了节省内存空间,另一方面为了计算快速、方便
示例:
u8 a:1;//a占字节的bit0
u8 b:2; //b占字节的bit2- bit1
u8 c:5; //c占字节的bit7- bit3
注意:
(1)位域不能跨字节,如u8 a:9;这是错误的
(2)如果一个字节的剩余位小于下一个要定义的位长度,那么下一个位域将从新的字节开始
如u8 a:4;
u8 b:5
5+4>8,则b从新的字节开始
位域一般使用在结构体中,如下:
typedef struct
{
u8 a:1;//成员变量
u8 b:1;
u8 c:1;
}Alarm_InitTypeDef;
使用方法如下:
Alarm_InitTypeDef Alarm_InitStre; //定义结构体变量
Alarm_InitStre.a=1;//赋值1或0
3.联合体
联合体成员共用一段内存,一般联合体成员的数据类型是相同的,但也有不同的,这个就要根据实际内存存放格式决定了(大小端模式),这里不再介绍
本人常用格式
typedef union
{
u8 a;//
u8 b;
u8 c;
}Data_InitTypeDef;
使用方法如下:
Data_InitTypeDef Data_InitStre;
Data_InitStre.a=15;
4.联合体与结构体、位域一起使用
这里直接先举例说明,本人常用2种情况
- 是存储u16位数据(32位数据类似)
typedef struct
{
u8 data_low;//低8位数据
u8 data_high;//高8位数据
}Data_InitTypeDef;
typedef union
{
u16 data_all;//16位数据
Data_InitTypeDef Data_InitStre;//定义结构体变量
}Un_Data_ InitTypeDef;
Un_Data_ InitTypeDef Un_Data_ InitStre;//定义联合体变量
Data_InitStre. data_low=0x02;
Data_InitStre. data_high=0x02;
Data=Un_Data_ InitStre. data_all;//这里就等于结构体成员高低字节相加
//那么Data=0x0202
2.报警标志
有的产品中有很多报警标志,如果每个报警都占用一个字节会占用很多内存,而且不方便计算,故而使用结构体+位域+联合体
示例代码如下:
typedef struct
{
u8 a:1;
u8 b:1;
u8 c:1;
u8 d:1;
}Alram_InitTypeDef;
typedef union
{
U8 Alarm _all;
Alram_InitTypeDef Alarm_InitStre;//定义结构体变量
}Un_Alarm_ InitTypeDef;
Un_Alarm_ InitTypeDef Un_Alarm_ InitStre;
Alarm_InitStre.a=1;
Alarm_InitStre.b=0;
Alarm_InitStre.c=1;
Alarm_InitStre.d=0;
Alarm=Un_Alarm_ InitStre. Alarm _all;// Alarm=0x05即=0101,是abcd的位组合