WTZSSoftWare/Src/FlashRW.c

54 lines
1.4 KiB
C
Raw Permalink Normal View History

2025-09-29 02:42:07 +00:00
#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;
// <20><><EFBFBD><EFBFBD>Flash
HAL_FLASH_Unlock();
// <20><>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E1B9B9>
// 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; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Flash<73><68><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// <20><><EFBFBD><EFBFBD>Flash<73><68><EFBFBD><EFBFBD>
status = HAL_FLASHEx_Erase(&erase_init, &page_error);
if(status != HAL_OK)
{
// <20><><EFBFBD><EFBFBD>ʧ<EFBFBD>ܴ<EFBFBD><DCB4><EFBFBD>
}
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>д<EFBFBD><D0B4>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)
{
// д<><D0B4>ʧ<EFBFBD>ܴ<EFBFBD><DCB4><EFBFBD>
}
}
// <20><><EFBFBD><EFBFBD>Flash
HAL_FLASH_Lock();
}
void Read_Data_From_Flash(float *data, uint32_t size)
{
// <20><>Flash<73>ж<EFBFBD>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>
for (uint32_t i = 0; i < size; i ++)
{
data[i] = *(uint32_t *)(FLASH_DATA_ADDRESS + i);
}
}