WTZSSoftWare/Src/FlashRW.c

54 lines
1.4 KiB
C

#include "main.h"
#include "stm32h7xx_hal.h"
void Store_Data_To_Flash(float *data, uint32_t size);
void Read_Data_From_Flash(float *data, uint32_t size);
void Store_Data_To_Flash(float *data, uint32_t size)
{
HAL_StatusTypeDef status;
FLASH_EraseInitTypeDef erase_init;
uint32_t page_error;
// 解锁Flash
HAL_FLASH_Unlock();
// 初始化擦除结构体
// erase_init.TypeErase = FLASH_TYPEERASE_SECTORS;
erase_init.Banks = FLASH_BANK_1; // For dual bank STM32H7 devices, select the appropriate bank
erase_init.Sector = FLASH_SECTOR_2; // Specify the starting sector
erase_init.NbSectors = (size * sizeof(float) + FLASH_SECTOR_SIZE - 1) / FLASH_SECTOR_SIZE; // 计算需要擦除的Flash扇区数
// 擦除Flash扇区
status = HAL_FLASHEx_Erase(&erase_init, &page_error);
if(status != HAL_OK)
{
// 擦除失败处理
}
// 将数据写入Flash
for (uint32_t i = 0; i < size; i++)
{
status = HAL_FLASH_Program(FLASH_TYPEPROGRAM_FLASHWORD, FLASH_DATA_ADDRESS + i * sizeof(float), *((uint32_t *)(data + i)));
if(status != HAL_OK)
{
// 写入失败处理
}
}
// 上锁Flash
HAL_FLASH_Lock();
}
void Read_Data_From_Flash(float *data, uint32_t size)
{
// 从Flash中读取数据
for (uint32_t i = 0; i < size; i ++)
{
data[i] = *(uint32_t *)(FLASH_DATA_ADDRESS + i);
}
}