54 lines
1.5 KiB
C
54 lines
1.5 KiB
C
#include "user_flash.h"
|
||
|
||
/* 写入原始数据 ---------------------------------------------*/
|
||
HAL_StatusTypeDef flash_write_data(uint32_t addr, uint8_t *data, uint16_t size)
|
||
{
|
||
HAL_StatusTypeDef status = HAL_OK;
|
||
uint32_t i;
|
||
uint32_t write_addr = addr;
|
||
FLASH_EraseInitTypeDef erase_init;
|
||
uint32_t sector_error;
|
||
|
||
// 1. 解锁Flash
|
||
HAL_FLASH_Unlock();
|
||
|
||
// 2. 擦除目标扇区
|
||
erase_init.TypeErase = FLASH_TYPEERASE_SECTORS;
|
||
erase_init.Sector = FLASH_USER_SECTOR;
|
||
erase_init.NbSectors = 1; // 擦除1个扇区
|
||
erase_init.VoltageRange = FLASH_VOLTAGE_RANGE_3; // 根据电压范围选择
|
||
|
||
// 执行擦除操作
|
||
if (HAL_FLASHEx_Erase(&erase_init, §or_error) != HAL_OK)
|
||
{
|
||
status = HAL_ERROR;
|
||
goto exit;
|
||
}
|
||
|
||
// 3. 写入数据
|
||
for (i = 0; i < size; i += 4)
|
||
{ // 以32位(4字节)为单位写入
|
||
uint32_t data_to_write = *(uint32_t *)(data + i);
|
||
|
||
if (HAL_FLASH_Program(FLASH_TYPEPROGRAM_WORD,
|
||
write_addr,
|
||
data_to_write) != HAL_OK)
|
||
{
|
||
status = HAL_ERROR;
|
||
break;
|
||
}
|
||
write_addr += 4; // 地址递增
|
||
}
|
||
|
||
exit:
|
||
// 4. 锁定Flash
|
||
HAL_FLASH_Lock();
|
||
return status;
|
||
}
|
||
|
||
/* 读取原始数据 ---------------------------------------------*/
|
||
void flash_read_data(uint32_t addr, uint8_t *data, uint32_t size)
|
||
{
|
||
memcpy(data, (uint32_t *)addr, size);
|
||
}
|