STM32H7系列有些型号支持Dual-bank模式,可以在一个银行擦除的同时从另一个银行运行程序。不过具体到STM32H750XBHx是否支持Dual-bank需要确认其具体特性。如果支持,可以将程序和数据分开存储在不同的银行,实现无中断的数据更新。
示例代码
以下是一个简单的示例代码,展示如何在程序运行时保存数据到Flash中,并确保不擦除程序部分的Flash:
#include "stm32h7xx_hal.h"
// Flash存储地址(注意选择程序存储区之外的地址)
#define FLASH_USER_START_ADDR 0x08020000 // 根据具体情况选择合适地址
#define DATA_SIZE 128 // 数据大小(字节)
// 数据缓冲区
uint8_t data_to_save[DATA_SIZE];
uint8_t data_read[DATA_SIZE];
void Flash_Write(uint32_t address, uint8_t *data, uint32_t size) {
// 解锁Flash
HAL_FLASH_Unlock();
// 擦除Flash页
FLASH_EraseInitTypeDef EraseInitStruct;
uint32_t PageError;
EraseInitStruct.TypeErase = FLASH_TYPEERASE_PAGES;
EraseInitStruct.Banks = FLASH_BANK_1;
EraseInitStruct.Page = (address - FLASH_BASE) / FLASH_PAGE_SIZE;
EraseInitStruct.NbPages = 1;
if (HAL_FLASHEx_Erase(&EraseInitStruct, &PageError) != HAL_OK) {
// 处理擦除错误
}
// 写数据到Flash
for (uint32_t i = 0; i < size; i++) {
if (HAL_FLASH_Program(FLASH_TYPEPROGRAM_BYTE, address + i, data[i]) != HAL_OK) {
// 处理写入错误
}
}
// 锁定Flash
HAL_FLASH_Lock();
}
void Flash_Read(uint32_t address, uint8_t *data, uint32_t size) {
for (uint32_t i = 0; i < size; i++) {
data[i] = *(uint8_t*)(address + i);
}
}
int main(void) {
// 初始化HAL库
HAL_Init();
// 初始化数据
for (int i = 0; i < DATA_SIZE; i++) {
data_to_save[i] = i;
}
// 写数据到Flash
Flash_Write(FLASH_USER_START_ADDR, data_to_save, DATA_SIZE);
// 从Flash读取数据
Flash_Read(FLASH_USER_START_ADDR, data_read, DATA_SIZE);
// 比较数据
for (int i = 0; i < DATA_SIZE; i++) {
if (data_to_save[i] != data_read[i]) {
// 数据不匹配,处理错误
}
}
while (1) {
// 主循环
}
}
|