實戰技能分享,各種資料型別的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