[C语言]使用联合体和结构体 巧妙处理寄存器数据上位机读写的方法
最近有在研究陀螺仪, 里面就有对不同寄存器做配置, 然后在读取一定地址的寄存器数据;
发现这种逻辑工程上经常有; 但是我接触到的代码基本都是通过一大堆宏定义去给他们寄存器地址命名,然后再自己读手册去搞配置;
其实在性能上这个操作挺好的, 但是我们似乎也没那么在意这几十个字节数据大多数时候;
所以我一直在琢磨一种更方便阅读的方法, 可以让我们通过阅读代码就知道具体的操作,而不需要查表看手册;
在功能解构后, 我们对函数其实只关注两个问题, 地址和数据; 所以我们可以封装一个函数, write(address, data); read(address,data);
以表明这个函数是对某个寄存器地址的数据读/写;
为了消除宏的存在,和更好的灵活使用寄存器 我采用结构体定义一个结构, 然后用联合体将它跟一个二维数组绑定, 数组第一列为寄存器地址,第二列为其数据:
大概长下面的样子:
这样可以让代码的可读性增加;
#include <stdint.h>
#include <stdio.h>
typedef struct
{
uint8_t bit0 : 1;
uint8_t bit1 : 1;
uint8_t bit2 : 1;
uint8_t bit3 : 1;
uint8_t bit4 : 1;
uint8_t bit5 : 1;
uint8_t bit6 : 1;
uint8_t bit7 : 1;
} _8bits;
// 独立定义结构体
typedef struct
{
_8bits a, b;
uint8_t c, d;
uint8_t e, f;
} MyStruct;
// 定义联合体,其中包含上面定义的结构体和一个3x2的二维数组
typedef union
{
MyStruct data;
uint8_t array[3][2];
} MyUnion;
int
main ()
{
MyUnion u;
uint8_t address = 0b01010101; // 示例地址数据
// 通过结构体成员来设置数据
u.data.a = *(_8bits *)&address;
u.data.b = *(_8bits *)&address;
u.data.c = 70;
u.data.d = 40;
u.data.e = 22;
u.data.f = 33;
// 通过二维数组来访问数据
printf ("array[0][0] = %d\n", u.array[0][0]);
printf ("array[0][1] = %d\n", u.array[0][1]);
printf ("array[1][0] = %d\n", u.array[1][0]);
printf ("array[1][1] = %d\n", u.array[1][1]);
printf ("array[2][0] = %d\n", u.array[2][0]);
printf ("array[2][1] = %d\n", u.array[2][1]);
return 0;
}