让单个LED亮起来!一种联合体和结构体位域的应用

以前的时候总觉得C语言的联合体用处不大,直到看到别人其中的一个用法……

结构体的位域语法

1
2
3
4
5
6
7
8

#include <stdio.h>

struct {
uint8_t a:1; // 类型 用户标识符 :位域长度;
uint8_t b:4;
uint8_t c:3;
}bits;

几点说明:

    1. 位域不能跨两个存储单元,一个位域只能存储在同一个位域单元中
    1. 位域可以没有位域名,此时它只能用来填充或者调整下一个位域名的位置

联合体的语法

1
2
3
4
typedef union{
bits REG_Bits;
uint8_t REG;
}reg_typeDef;

典型用法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27

#include <stdio.h>
#include <stdint.h>

typedef struct{
uint8_t Pin_0:1;
uint8_t Pin_1:1;
uint8_t Pin_2:1;
uint8_t Pin_3:1;
uint8_t Pin_4:1;
uint8_t Pin_5:1;
uint8_t Pin_6:1;
uint8_t Pin_7:1;
}GPIO_Port_Bits;

typedef union{
GPIO_Port_Bits Bits;
uint8_t Port;
}GPIO_Port;

GPIO_Port *GPIOA = (uint8 *)(0x100000);

int main()
{
GPIOA->Bits.Pin_0 = 1;
return 0;
}

参考来源:吴越散民的博客-C语言中结构体的位域(bit-fields)

0%