1. 结构体数据被存放在Pflash中
正常情况下,可以看到全局变量的结构体数据被存放在Pflash中


数字部分存在RAM中

2. 最小编程单位
8字节编程,因此如果结构体存放在Dfalsh中,进行写操作,需要写8字节的倍数

第一种办法:
测试之后,Dflash存储结构体数据,读写没问题。pflash中还有字符串数据,这个应该还要想办法解掉。
cpp
// 定义8字节对齐的配置结构体
typedef struct {
uint8_t chipModel[12]; // 芯片型号字符串(AC7840X_HC32F460等)
uint16_t configVersion; // 配置版本号
uint32_t deviceId; // 设备ID
uint16_t configFlags; // 配置标志
uint8_t opMode; // 操作模式
uint8_t reserved1; // 保留字节(用于对齐)
uint32_t calibration[2]; // 校准数据
uint16_t checksum; // 校验和
uint8_t reserved2[14]; // 保留字节(确保总大小为32字节)
} __attribute__((packed, aligned(8))) DeviceData; // 强制8字节对齐
// 将结构体转换为字节流
void DeviceData_to_bytes(const DeviceData* data, uint8_t* buffer) {
memcpy(buffer, data, 40);
}
// 从字节流恢复结构体
void bytes_to_DeviceData(const uint8_t* buffer, DeviceData* data) {
memcpy(data, buffer, 40);
}
__attribute__((section("dflash_data")))
DeviceData new_data; // 注意:初始值不会自动存入DFlash
void initDefaultConfig(DeviceData* config) {
memset(config, 0, sizeof(DeviceData));
strncpy((char*)config->chipModel, "AC78406HGLA", 11);
config->configVersion = 0x0100;
config->deviceId = 0x6666;
config->configFlags = 0x7777;
config->opMode = 0x03;
config->calibration[0] = 0x88888888;
config->calibration[1] = 0x99999999;
config->checksum = 0x1234;
}
void Job_DflashDataWrite(void)
{
initDefaultConfig(&new_data);
DeviceData_to_bytes(&new_data,g_wBuff);
status_t ret = STATUS_SUCCESS;
FLASH_DRV_UnlockCtrl();
FLASH_DRV_EraseBlock(&g_Flash_Config, TestDflashWriteAddress);
FLASH_DRV_Program(&g_Flash_Config, TestDflashWriteAddress, 40, g_wBuff);
FLASH_DRV_LockCtrl();
ret = 100;
}
DeviceData read_data;
void Job_DflashDataRead(void)
{
uint16_t i = 0;
uint8_t DflashReadBuf[TestSize] = {0};
FLASH_DRV_Read(&g_Flash_Config,TestDflashWriteAddress, DflashReadBuf,40); /*!< ???????*/
bytes_to_DeviceData(DflashReadBuf,&read_data);
i = 100;
}
Job_DflashDataWrite();
Job_DflashDataRead();
第二种办法:


注意:
pack没有加DFlash算法,在keil中看不到数据,直接看hex可以看到。