首页 > 其他分享 >实战技能分享,各种数据类型的SPI, UART, I2C,FDCAN等方式的通信传输以及存储到EEPROM, Flash等设备的简易实现方法

实战技能分享,各种数据类型的SPI, UART, I2C,FDCAN等方式的通信传输以及存储到EEPROM, Flash等设备的简易实现方法

时间:2022-10-13 12:32:47浏览次数:61  
标签:UART 编程 数据类型 FDCAN uint8 endian 对齐

背景知识:

各种类型的数据传输和存储就涉及到大小端的问题,所以我们在开头把这个知识点做个说明。

实战技能分享,各种数据类型的SPI, UART, I2C,FDCAN等方式的通信传输以及存储到EEPROM, Flash等设备的简易实现方法_数据类型

 

首先要简单说下芯片的大小端问题,我们这里主要讨论Cortex-M内核。

权威指南的说明如下:
Support for little endian and big endian memory systems e The Cortex-M3 and Cortex-M4 processors can work with either little endian or big endian memory systems. In practice, a microcontroller product is normally designed with just one endian configuration.

M内核支持大端或者小端,实际应用中大部分内核都是小端。以STM32为例,全部都是小端,而且是芯片设计之初就固化进去的,不可修改。市面上其他厂家基本也都固化的小端格式。
F1编程手册:

实战技能分享,各种数据类型的SPI, UART, I2C,FDCAN等方式的通信传输以及存储到EEPROM, Flash等设备的简易实现方法_php_02

 

 

F3和F4编程手册:

实战技能分享,各种数据类型的SPI, UART, I2C,FDCAN等方式的通信传输以及存储到EEPROM, Flash等设备的简易实现方法_数据_03

 

 

F7和H7编程手册:

实战技能分享,各种数据类型的SPI, UART, I2C,FDCAN等方式的通信传输以及存储到EEPROM, Flash等设备的简易实现方法_php_04

 

 

各种数据类型编程EEPROM,SPI Flash等存储器的简易方法

一般这些存储器都是字节编程,写入浮点等数据类型时不太方便。

这里分享一个方法,定义一个结构体,将各种数据类型封装进去:

实战技能分享,各种数据类型的SPI, UART, I2C,FDCAN等方式的通信传输以及存储到EEPROM, Flash等设备的简易实现方法_数据类型_05

 

写入的时候采用下面方式:

实战技能分享,各种数据类型的SPI, UART, I2C,FDCAN等方式的通信传输以及存储到EEPROM, Flash等设备的简易实现方法_数据_06

 

读取时可以采用下面方式:

实战技能分享,各种数据类型的SPI, UART, I2C,FDCAN等方式的通信传输以及存储到EEPROM, Flash等设备的简易实现方法_数据类型_07

 

 

各种数据类型的SPI,UART,I2C,FDCAN等传输问题

这里我们以串口通信为例,比如主机要发送如下格式数据给从机:

实战技能分享,各种数据类型的SPI, UART, I2C,FDCAN等方式的通信传输以及存储到EEPROM, Flash等设备的简易实现方法_php_08

 

我们可以做一个如下结构体格式:

typedef struct
{
uint8_t ucStart;

uint16_t usCO2;
uint16_t usPM25;
uint16_t usHumidity;
float Temprature;
uint32_t ulParam;
uint8_t ucEnd1;
uint8_t ucEnd2;
}
UART_T;

UART_T g_tUartParam;

主机发送的时候我们就可以采用如下方法:

comSendBuf(COM1, (uint8_t *)&g_tUartParam, sizeof(UART_T));

从机工程也定义一个同样的结构体变量,比如我们把接收到一帧数据存到缓冲uint8_t buf[50]里面了。

我们就可以定义一个结构体指针变量:

UART_T *pUartParam;
pUartParam = (UART_T *)buf;

那么我们就可以pUartParam->usCO2,  pUartParam->Temprature等方式来访问,非常方便。


实战案例:

大家可以下载我们论坛置顶帖V5,V6或者V7板子出厂程序,里面都有相关代码参考。


补充拓展贴,特别是结构体对齐问题:

1、【烧脑技术贴】无法回避的字节对齐问题,从八个方向深入探讨(变量对齐,栈对齐,DMA对齐,结构体成对齐,Cache, RTOS双堆栈等)
2、推荐一种超简单的硬件位带bitband操作方法,让变量,寄存器控制,IO访问更便捷,无需用户计算位置

微信公众号:armfly_com



标签:UART,编程,数据类型,FDCAN,uint8,endian,对齐
From: https://blog.51cto.com/u_15785540/5753198

相关文章

  • GO语言基本数据类型
    Go语言-程序实体与关键字任何Go语言源码文件都由若干个程序实体组成的。在Go语言中,变量、常量、函数、结构体和接口被统称为“程序实体”,而它们的名字被统称为“标识符”。......
  • JTable实现Integer和Double数据类型的列,只能输入符合标准的值
    如下图,该列的数据类型为Integer类,则不能输入Double和字符串类型的内容如何设定表格的列的类型?publicDefaultTableModeltableModelInstance(){ returnnewDefa......
  • python基础-较复杂数据类型预览
    1.初识列表  列表就是队列;  列表是一种有序的,且内容可重复的数据类型;  用list代表列表,也可以用list()定义一个列表,同时定义列表可以直接使用[];  python中列......
  • 实验1c语言开发环境使用和数据类型,运算符和表达式
    1.试验任务1(1)在垂直方向上打印两个字符小人的源代码,以及运行结果截图 \\在垂直方向上打印两个字符小人#include<stdio.h>intmain(){printf("o\n");pr......
  • Java的基本数据类型
    Java的基本数据类型类型的转换类型转换主要分为强制类型转换以及自动转换数据类型的精密度由高到低必须使用强制类型转换精密度排序如下(由低到高)xxxxxxxxxx......
  • python基础--简单数据类型预览
    为了适应更多的使用场景,将数据划分为多种类型,每种类型都有各自的特点和使用场景,帮助计算机高效的处理和展示数据。(比如数字用于数学运算、字符串用于信息传递、页面文字展......
  • Redis 的快速介绍及其基本数据类型和操作
    Redis简介​​Redis​​是一个主要由开发者SalvatoreSanfilippo(Antirez)开发的开源内存数据结构存储器,用于改进其网站的可伸缩性,可以用作数据库、缓存和消息代理等,可以在......
  • 把sqlalchemy对象转化成json数据类型
    把sqlalchemy对象转化成json数据类型defto_json_all(msg:list):data=[]iftype(msg)==list:foriinrange(len(msg)):temp_dict......
  • 数据类型以及考试题讲解
    publicclassDemo02{publicstaticvoidmain(String[]args){//整数拓展进制二进制0b十进制八进制0十六进制0xint......
  • 基本数据类型:整数浮点数布尔值字符
    publicclassDemo02{publicstaticvoidmain(String[]args){//整数拓展进制二进制0b十进制八进制0十六进制0xinti1=12;......