GPIO 值到字节
GPIO value to Byte
我想做一个简单的转换器。
理论上很简单,但我不知道如何实现它。
所以,这就是我想做的:
首先,我将从微控制器读取我的 GPIO 值,数量为 8。
现在,我有 8 字节的 GPIO 值,从 GPIO 1 到 GPIO 8。
但是,如何将它们转换成一个字节?
像这样:11111000
(8 个字节 - 之前),变成 11111000/0xFA
(1 个字节 - 之后)?
我尝试使用移位,像这样:
a = GPIO1, a = a << 7 |
b = GPIO2, b = b << 6 |
.
.
h = GPIO8
uint8_t i = a + b + c + d + e + f + g + h
不幸的是,它不起作用。
我做错了吗?
任何建议将不胜感激。
实现此目的的一个好方法是结合使用 struct
和 union
。使用 union
,您可以通过两种不同的方式访问同一内存。例如:
union gpio_type {
uint8_t data;
struct raw {
unsigned int b0 :1;
unsigned int b1 :1;
unsigned int b2 :1;
unsigned int b3 :1;
unsigned int b4 :1;
unsigned int b5 :1;
unsigned int b6 :1;
unsigned int b7 :1;
};
};
在结构内部使用 unsigned int b0 :1;
,您将 b0
定义为 unsigned int
类型,但仅使用 1 位。如果对所有 8 个 GPIO 位执行此操作 b0 ... b7
,则总大小为 8 位,与 uint8_t
的大小相同。现在 data
和 raw
将使用相同的内存,但您可以通过任一变量访问内存。有了它,您可以将原始 GPIO 值写入结构的位,然后访问整个数据字节。
例如,让我们创建此联合的实例并访问 uint8_t
数据或单个位:
union gpio_type my_gpio_reg;
my_gpio_reg.data = 0xA0; % Set whole reg to 0xA0
my_gpio_reg.raw.b0 = 1; % Set the last bit to 1 ==> 0xA1
我想做一个简单的转换器。 理论上很简单,但我不知道如何实现它。 所以,这就是我想做的: 首先,我将从微控制器读取我的 GPIO 值,数量为 8。 现在,我有 8 字节的 GPIO 值,从 GPIO 1 到 GPIO 8。
但是,如何将它们转换成一个字节?
像这样:11111000
(8 个字节 - 之前),变成 11111000/0xFA
(1 个字节 - 之后)?
我尝试使用移位,像这样:
a = GPIO1, a = a << 7 |
b = GPIO2, b = b << 6 |
.
.
h = GPIO8
uint8_t i = a + b + c + d + e + f + g + h
不幸的是,它不起作用。 我做错了吗? 任何建议将不胜感激。
实现此目的的一个好方法是结合使用 struct
和 union
。使用 union
,您可以通过两种不同的方式访问同一内存。例如:
union gpio_type {
uint8_t data;
struct raw {
unsigned int b0 :1;
unsigned int b1 :1;
unsigned int b2 :1;
unsigned int b3 :1;
unsigned int b4 :1;
unsigned int b5 :1;
unsigned int b6 :1;
unsigned int b7 :1;
};
};
在结构内部使用 unsigned int b0 :1;
,您将 b0
定义为 unsigned int
类型,但仅使用 1 位。如果对所有 8 个 GPIO 位执行此操作 b0 ... b7
,则总大小为 8 位,与 uint8_t
的大小相同。现在 data
和 raw
将使用相同的内存,但您可以通过任一变量访问内存。有了它,您可以将原始 GPIO 值写入结构的位,然后访问整个数据字节。
例如,让我们创建此联合的实例并访问 uint8_t
数据或单个位:
union gpio_type my_gpio_reg;
my_gpio_reg.data = 0xA0; % Set whole reg to 0xA0
my_gpio_reg.raw.b0 = 1; % Set the last bit to 1 ==> 0xA1