STM32F0 I2C HAL 将结构体保存到 I2C EEPROM

dan*_*stm 3 c microcontroller struct stm32 eeprom

我需要保存一个结构:

struct {
  uint16_t value;
  uint16_t flag;
} status;
Run Code Online (Sandbox Code Playgroud)

使用外部 I2C EEPROM

HAL_StatusTypeDef HAL_I2C_Mem_Write (I2C_HandleTypeDef * hi2c, uint16_t DevAddress, uint16_t MemAddress, uint16_t MemAddSize, uint8_t * pData, uint16_t Size, uint32_t Timeout)
Run Code Online (Sandbox Code Playgroud)

功能

你能建议我一个正确的方法来做到这一点吗?

Ben*_*ics 5

如果仔细观察所有存储简单字节的数据类型,区别在于字节的解释方式。

基本上,您需要一个uint8_t* pData指向缓冲区的指针和要传输的字节数 ( uint16_t Size)。因此,将结构指针转换uint8_t*为使用sizeof().

这是一个模拟,请原谅我糟糕的测试环境(ints和unsigned chars)。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef struct {
  int value;
  int flag;
} status;

int main(void) {

    status stat;
    stat.value = 15;
    stat.flag = 1;

    int size = sizeof(status);                            // number of bytes to be sent
    unsigned char* pData;                                 // (uint8_t*) unsigned char* pointer to data

    unsigned char eeprom[size];                           // simulated EEPROM
    unsigned char pDataReceived[size];                    // for read back from EEPROM test
    status* read_back;                                    // for read back from EEPROM test

    printf("%d %d\n", stat.value, stat.flag);             // verify data in original format

    pData = (unsigned char*)(&stat);                      // cast data pointer to (uint8_t*) unsigned char*
    printf("%d %d\n", ((status*)pData)->value, ((status*)pData)->flag);   // verify data after cast

    memcpy(eeprom, pData, size);                          // I2C write bytes simulation
    printf("%d %d\n", ((status*)eeprom)->value, ((status*)eeprom)->flag); // verify data in simulated EEPROM

    memcpy(pDataReceived, eeprom, size);                  // I2C read bytes simulation
    read_back = (status*)(pDataReceived);                 // cast back to struct type
    printf("%d %d\n", read_back->value, read_back->flag); // verify received data in original format

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

写例子:

struct status stat;
// operations on the struct
uint8_t* addressOfStruct= (uint8_t*)(&stat);
uint16_t sizeOfStruct  = sizeof(status);

HAL_StatusTypeDef HAL_I2C_Mem_Write (&hi2c, DevAddress, MemAddress, MemAddSize, addressOfStruct, sizeOfStruct, 100);
Run Code Online (Sandbox Code Playgroud)

阅读示例:

struct status* read;
uint16_t sizeOfBuffer = sizeof(status);
uint8_t receiveBuffer[sizeOfBuffer];

HAL_StatusTypeDef HAL_I2C_Mem_Read (&hi2c, DevAddress, MemAddress, MemAddSize, receiveBuffer, sizeOfBuffer, 100);

read = (status*)(receiveBuffer); // or copy or move the data
Run Code Online (Sandbox Code Playgroud)