STM32结构体在FLASH中的存取代码
时间: 2024-05-08 16:19:07 浏览: 24
以下是一个简单的例子,演示如何在STM32中使用结构体将数据存储在FLASH中:
```
#include "stm32f4xx.h"
#include <string.h>
#define FLASH_START_ADDRESS ((uint32_t)0x08000000) // Flash起始地址
#define USER_DATA_ADDRESS ((uint32_t)0x08010000) // 用户数据在Flash中的地址
#define USER_DATA_SIZE sizeof(UserData_t) // 用户数据的大小
typedef struct {
uint32_t id;
char name[20];
float score;
} UserData_t;
UserData_t UserData = {12345, "John Doe", 85.5};
void WriteUserDataToFlash(void) {
uint32_t i;
FLASH_Status status;
uint32_t address = USER_DATA_ADDRESS;
uint16_t* data = (uint16_t*)&UserData;
// 擦除Flash中的数据
FLASH_Unlock();
FLASH_ClearFlag(FLASH_FLAG_EOP | FLASH_FLAG_OPERR | FLASH_FLAG_WRPERR | FLASH_FLAG_PGAERR | FLASH_FLAG_PGPERR | FLASH_FLAG_PGSERR);
FLASH_EraseSector(FLASH_Sector_7, VoltageRange_3);
// 将数据写入Flash中
for (i = 0; i < USER_DATA_SIZE / 2; i++) {
status = FLASH_ProgramHalfWord(address, data[i]);
address += 2;
if (status != FLASH_COMPLETE) {
// 写入失败
break;
}
}
FLASH_Lock();
}
void ReadUserDataFromFlash(void) {
memcpy(&UserData, (void*)USER_DATA_ADDRESS, USER_DATA_SIZE);
}
int main(void) {
ReadUserDataFromFlash();
// 修改UserData中的数据
UserData.score = 90.0;
WriteUserDataToFlash();
while (1) {
// 程序主循环
}
}
```
这个例子中,我们定义了一个结构体 `UserData_t`,表示用户数据。我们将 `UserData` 对象初始化为 `{12345, "John Doe", 85.5}`,即“ID为12345,名字为John Doe,分数为85.5”。
我们将这个结构体存储在FLASH中,其地址为 `0x08010000`。我们使用 `memcpy` 函数从FLASH中读取数据,并使用 `FLASH_ProgramHalfWord` 函数将数据写入FLASH。在写入前,我们需要先擦除FLASH中的数据。
在程序运行时,我们先从FLASH中读取 `UserData` 对象,然后修改其中的分数,最后将修改后的数据写入FLASH中。
需要注意的是,写入FLASH时需要先解锁FLASH,写入完成后需要重新锁定FLASH。在写入FLASH时,需要注意写入的大小不能超过FLASH的扇区大小。在本例中,我们使用的是扇区7,其大小为128KB。在编写代码时,需要根据实际情况选择正确的扇区。