1. 結構體數據被存放在Pflash中
正常情況下,可以看到全局變量的結構體數據被存放在Pflash中
數字部分存在RAM中
2. 最小編程單位
8字節編程,因此如果結構體存放在Dfalsh中,進行寫操作,需要寫8字節的倍數
第一種辦法:
測試之后,Dflash存儲結構體數據,讀寫沒問題。pflash中還有字符串數據,這個應該還要想辦法解掉。
// 定義8字節對齊的配置結構體
typedef struct {uint8_t chipModel[12]; // 芯片型號字符串(AC7840X_HC32F460等)uint16_t configVersion; // 配置版本號uint32_t deviceId; // 設備IDuint16_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; // 注意:初始值不會自動存入DFlashvoid 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可以看到。