学过51单片机的小伙伴应该知道,bit这个变量,它为是C51编译器的一种扩充数据类型,利用它可定义一个位标量,但不能定义位指针,也不能定义位数组。它的值是一个二进制位,不是0就是1,类似一些高级语言中的Boolean类型中的True和False。
但是进一步学习32的小伙伴,发现STM32没有类似的扩展变量去做一个0、1变量,尤其是需要一种功能需要过多变量状态切换的时候。如果单独命令3/4个8bit变量或者16bit变量,那是极具浪费单片机性能的事情,而且还不好管理变量名称。
为此可以采用结构体和共联体的方式,去节约空间
如下采用的是16bit方式,改变0、1开关量。可以组合多种标志位(共联体)
//某个状态的结构体,相当于创建一个寄存器
//函数定义
struct Temp_BITS{
uint16_t temp0 :1;
uint16_t temp1 :1;
uint16_t temp2 :1;
uint16_t temp3 :1;
uint16_t temp4 :1;
uint16_t temp5 :1;
uint16_t temp6 :1;
uint16_t temp7 :1;
uint16_t temp8 :1;
uint16_t temp9 :1;
uint16_t temp10 :1;
uint16_t temp11 :1;
uint16_t temp12 :1;
uint16_t temp13 :1;
uint16_t temp14 :1;
uint16_t temp15 :1;
};
union Temp_REG {
uint16_t all;
struct Temp_BITS bit;
};
此为声明和用法
union Temp_REG tempFlag;
/*判断变量*/
tempFlag.bit.temp0=0;
{/*
功能1
*/
}
tempFlag.bit.temp0=1;
{/*
功能2
*/
}
tempFlag.bit.all=0x12;
//此可以赋值,作为某一个状态机的轮询
另一种结构体的用法,引用我在网上看到的一个例子,切记此刻结构体为两个字节,注意使用该方法,需要避坑,博主,没有仔细研究结构体所在空间大小,可能讲的有些出处
//声明
#include<stdio.h>
//结果:编译通过
//原因:常规形式(结构体占用两个字节)
typedef struct _tag_test1
{
char a:1;
char b:1;
char c:1;
char d:6;
}sTest1;
//结果:编译无法通过
//原因:d的位域长度10超过了char类型长度
/*
typedef struct _tag_test2
{
char a:1;
char b:1;
char c:1;
char d:10;
}sTest2;
*/
//结果:编译可通过
//原因:下面使用无名位域,且占8个字节
typedef struct _tag_test3
{
int a:1;
int b:1;
int :0;//无名位域
int c:1;
}sTest3;
int main(void)
{
printf("%d\n",sizeof(sTest1));
printf("%d\n",sizeof(sTest3));
}