杰发科技AC7840——如何把结构体数据写到Dflash中

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可以看到。

相关推荐
学嵌入式的小杨同学1 天前
STM32 进阶封神之路(二十二):DMA 实战全攻略 ——ADC 采集 + 串口收发 + 内存复制(库函数 + 代码落地)
c++·stm32·单片机·嵌入式硬件·mcu·硬件架构·pcb
学嵌入式的小杨同学1 天前
STM32 进阶封神之路(二十一):DMA 深度解析 —— 从直接内存访问到无 CPU 干预数据传输(底层原理 + 寄存器配置)
stm32·单片机·嵌入式硬件·mcu·硬件架构·硬件工程·智能硬件
学嵌入式的小杨同学2 天前
STM32 进阶封神之路(十九):ADC 深度解析 —— 从模拟信号到数字转换(底层原理 + 寄存器配置)
c++·stm32·单片机·嵌入式硬件·mcu·架构·硬件架构
jianqiang.xue2 天前
ESP32-P4 看门狗复位全解析:HP_SYS_HP_WDT_RESET 故障排查实战
单片机·mcu·esp32·idf
woshihonghonga2 天前
解决Eclipse的Copilot终端依赖问题
stm32·mcu·eclipse·copilot·ai编程
嵌入式老菜鸟qq1252427733 天前
关于S2-LP休眠
单片机·嵌入式硬件·mcu·射频工程
学嵌入式的小杨同学3 天前
STM32 进阶封神之路(十八):RTC 实战全攻略 —— 时间设置 + 秒中断 + 串口更新 + 闹钟功能(库函数 + 代码落地)
c++·stm32·单片机·嵌入式硬件·mcu·架构·硬件架构
学嵌入式的小杨同学3 天前
STM32 进阶封神之路(十七):RTC 实时时钟深度解析 —— 从时钟源到寄存器配置(底层原理 + 面试重点)
c++·stm32·单片机·嵌入式硬件·mcu·硬件架构·pcb
EVERSPIN4 天前
32位MCU副屏方案
mcu·32位mcu
学嵌入式的小杨同学4 天前
STM32 进阶封神之路(十五):DHT11 单总线实战 —— 温湿度检测从时序解析到代码落地(库函数 + 寄存器)
vscode·stm32·单片机·嵌入式硬件·mcu·智能硬件·pcb工艺