You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

84 lines
2.0 KiB

#include "flash_operation.h"
static void Flash_InitInternal(void)
{
HAL_FLASH_Unlock();
__HAL_FLASH_SET_LATENCY(FLASH_LATENCY_4);
__HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_ALL_ERRORS);
}
static uint32_t GetFlashPage(uint32_t address)
{
return (address - FLASH_BASE_ADDRESS) / FLASH_PAGE_SIZE;
}
HAL_StatusTypeDef WriteParametersToFlash(int16_t *parameters)
{
HAL_StatusTypeDef status = HAL_OK;
uint32_t flash_address = DATA_FLASH_ADDRESS;
uint32_t primask_bit;
primask_bit = __get_PRIMASK();
__disable_irq();
Flash_InitInternal();
/* 擦除Flash页 */
FLASH_EraseInitTypeDef erase_init;
uint32_t page_error = 0;
erase_init.TypeErase = FLASH_TYPEERASE_PAGES;
erase_init.Banks = FLASH_BANK_1;
erase_init.Page = GetFlashPage(DATA_FLASH_ADDRESS);
erase_init.NbPages = 1;
if (HAL_FLASHEx_Erase(&erase_init, &page_error) != HAL_OK)
{
HAL_FLASH_Lock();
if (!primask_bit) __enable_irq();
return HAL_ERROR;
}
/* 每次写入64位数据(4个int16_t)*/
for (int i = 0; i < PARAM_COUNT; i++)
{
if (i % 4 == 0)
{
uint64_t combined_data = 0;
for (int j = 0; j < 4 && (i + j) < PARAM_COUNT; j++)
{
combined_data |= ((uint64_t)((uint16_t)parameters[i + j]) << (j * 16));
}
if (HAL_FLASH_Program(FLASH_TYPEPROGRAM_DOUBLEWORD,
flash_address + (i * sizeof(int16_t)),
combined_data) != HAL_OK)
{
status = HAL_ERROR;
break;
}
}
}
HAL_FLASH_Lock();
if (!primask_bit) __enable_irq();
return status;
}
void ReadParametersFromFlash(int16_t *parameters)
{
uint32_t flash_address = DATA_FLASH_ADDRESS;
Flash_InitInternal();
for (int i = 0; i < PARAM_COUNT; i++)
{
parameters[i] = *(int16_t *)(flash_address + (i * sizeof(int16_t)));
}
HAL_FLASH_Lock();
}