1. 程式人生 > 其它 >實戰技能分享,各種資料型別的SPI, UART, I2C,FDCAN等方式的通訊傳輸以及儲存到EEPROM, Flash等裝置的簡易實現方法

實戰技能分享,各種資料型別的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程式設計手冊:

F3和F4程式設計手冊:

F7和H7程式設計手冊:

各種資料型別程式設計EEPROM,SPI Flash等儲存器的簡易方法

一般這些儲存器都是位元組程式設計,寫入浮點等資料型別時不太方便。

這裡分享一個方法,定義一個結構體,將各種資料型別封裝進去:

寫入的時候採用下面方式:

讀取時可以採用下面方式:

各種資料型別的SPI,UART,I2C,FDCAN等傳輸問題

這裡我們以串列埠通訊為例,比如主機要傳送如下格式資料給從機:

我們可以做一個如下結構體格式:

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雙堆疊等)
http://www.armbbs.cn/forum.php?mod=viewthread&tid=109400

2、推薦一種超簡單的硬體位帶bitband操作方法,讓變數,暫存器控制,IO訪問更便捷,無需使用者計算位置
http://www.armbbs.cn/forum.php?mod=viewthread&tid=109508

微信公眾號:armfly_com 安富萊論壇:www.armbbs.cn 安富萊淘寶:https://armfly.taobao.com