signal_generator/User/system/user_flash.c

54 lines
1.5 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#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, &sector_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);
}