首页 > 其他分享 >[C语言]使用联合体和结构体 巧妙处理寄存器数据上位机读写的方法

[C语言]使用联合体和结构体 巧妙处理寄存器数据上位机读写的方法

时间:2024-11-28 10:57:57浏览次数:6  
标签:数据 读写 寄存器 uint8 C语言 printf array data

最近有在研究陀螺仪, 里面就有对不同寄存器做配置, 然后在读取一定地址的寄存器数据;

发现这种逻辑工程上经常有; 但是我接触到的代码基本都是通过一大堆宏定义去给他们寄存器地址命名,然后再自己读手册去搞配置;

其实在性能上这个操作挺好的, 但是我们似乎也没那么在意这几十个字节数据大多数时候;

所以我一直在琢磨一种更方便阅读的方法, 可以让我们通过阅读代码就知道具体的操作,而不需要查表看手册;

在功能解构后, 我们对函数其实只关注两个问题, 地址和数据; 所以我们可以封装一个函数, write(address, data); read(address,data);

以表明这个函数是对某个寄存器地址的数据读/写;

为了消除宏的存在,和更好的灵活使用寄存器 我采用结构体定义一个结构, 然后用联合体将它跟一个二维数组绑定, 数组第一列为寄存器地址,第二列为其数据:
大概长下面的样子:

 这样可以让代码的可读性增加;

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

// 独立定义结构体
typedef struct
{
  uint8_t 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;

  // 通过结构体成员来设置数据
  u.data.a = 10;
  u.data.b = 20;
  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;
}

 

标签:数据,读写,寄存器,uint8,C语言,printf,array,data
From: https://www.cnblogs.com/chentuze/p/18573807

相关文章

  • C语言(运算符及位运算)
    运算符算术运算符基本的算术运算符+、-:正负值运算符(单目运算符)。+、-、*、/、%:加减乘除取余运算符(双目运算符)注意:进行除法运算的时候,除数是不能为0的。这些算术运算符的运算顺序与数学上的运算顺序相同。表达式和运算符的优先级与结合性算术表达式:是指用算术运算符......
  • C语言(流程控制)
    算法著名计算机科学家沃思提出了一个公式:数据结构+算法=程序数据结构:对数据的描述算法:对操作步骤的描述算法定义广义的说,未解决一个问题而采取的方法和有限的步骤,就称为“算法”例如:将⼤象放⼊冰箱的算法就可以如下描述:打开冰箱⻔-把⼤象装进去-关闭冰箱⻔算......
  • C语言 -运算符
    运算符各类数值型数据间的混合运算整型、实型、字符型数据间可以进行混合运算运算时,参加运算的两个数据如果类型不同,则首先将其类型转换成一致再运算,转换规则是:将优先级低的类型转换到优先级高的类型,被称作自动类型转换(小转大——不会损失数据)。大类型类型变量名=......
  • 初识c语言+getchar()和putchar()相关知识
    编译和链接C语言是一门编译型计算机语言,源代码都是文本文件,本身无法执行,必须通过编译器的编译和链接器的链接生成二进制的可执行文件才能执行。一个工程一般多个源文件组成。1.每个源文件(.c)单独经过编译器处理生成对应的目标文件(.obj为后缀的文件)。2.多个目标文件和库......
  • C语言学习笔记-4
    四、控制语句1.选择控制语句1、if语句1)if(){语句1;语句2;}如果条件成立执行大括号里的所有语句,不成立的话大括号里的语句不执行2)if(条件表达式){}else{}如果if的条件成立,执行if后面{}内的语句,否则执行else后的语句3)if(条件表达式1)......
  • C语言——指针初阶(一)
    目录一.什么是指针???     指针是什么?        指针变量:        总结:        总结:二.指针和指针类型指针+-整数:        总结:指针的解引用总结:三.野指针如何规避野指针往期回顾:一.什么是指针???     指针是什么? ......
  • C语言中对文件的输入输出
    在c中的文件操作通过读的形式,打开文件用FILE打开用FILE*类型的指针接受文件指针的首地址并且我们可以用读或写的方式打开文件使用r来读取文件当然也要判断是否读取文件成功,若读取成功fopen会传出指针,若失败则会传出空指针,所以要判断读取是否成功当然,当文件不存在时使用r会......
  • 零基础C语言-插入排序
    插入排序插入排序是排序算法当中一种很基础的算法,同时他也我们日常生活当中所见到最多的排序。比如我们在拿扑克牌的时候,所用的排序方法就是将手中刚刚拿到的牌放入一个比前边大后边小的位置,直接插入进去,这就是插入排序。所以我们要对插入排序进行实现我们就要进行代码......
  • C语言实例之10求0-10000中的水仙花数
    1.水仙花数的描述水仙花数(Narcissisticnumber)也被称作自恋数、自幂数等。它是指一个三位数,其各位数字的立方和等于该数本身。例如,153是一个水仙花数,因为13......
  • 【C语言】· 第五讲 · Printf 与 Scanf 学习笔记
    Printf与Scanf一、printf1、 基本⽤法printf()的作⽤是将参数⽂本输出到屏幕。它名字⾥⾯的f代表format(格式化),表⽰可以定制输出⽂本的格式。printf()不会在⾏尾⾃动添加换⾏符,运⾏结束后,光标就停留在输出结束的地⽅,不会⾃动换⾏。为了让光标移到下⼀⾏的开头......