STM32 内部 Flash 读写代码示例 - 基于 STM32CubeMX 和 HAL 库
以下是基于 STM32CubeMX 和 HAL 库编写的读写内部 Flash 的代码示例:
读取 Flash 中的数据:
#define FLASH_START_ADDR ((uint32_t)0x08000000) // Flash起始地址
#define FLASH_PAGE_SIZE ((uint32_t)FLASH_PAGE_SIZE) // Flash页大小
uint32_t read_data_from_flash(uint32_t address)
{
uint32_t data = 0;
uint32_t flash_address = FLASH_START_ADDR + address; // 计算实际Flash地址
// 禁止所有中断
__disable_irq();
// 开启Flash读取
HAL_FLASH_Unlock();
// 读取数据
data = *(__IO uint32_t*)flash_address;
// 关闭Flash读取
HAL_FLASH_Lock();
// 使能所有中断
__enable_irq();
return data;
}
向 Flash 中写入数据:
#define FLASH_END_ADDR ((uint32_t)0x0807FFFF) // Flash结束地址
#define FLASH_PAGE_SIZE ((uint32_t)FLASH_PAGE_SIZE) // Flash页大小
HAL_StatusTypeDef write_data_to_flash(uint32_t address, uint32_t data)
{
HAL_StatusTypeDef status = HAL_ERROR;
uint32_t flash_address = FLASH_START_ADDR + address; // 计算实际Flash地址
uint32_t page_error = 0;
// 禁止所有中断
__disable_irq();
// 开启Flash写入
HAL_FLASH_Unlock();
// 写入数据
status = HAL_FLASH_Program(FLASH_TYPEPROGRAM_WORD, flash_address, data);
// 检查是否写入成功
if (status == HAL_OK)
{
// 检查是否需要擦除页
if (flash_address > FLASH_END_ADDR - FLASH_PAGE_SIZE)
{
// 擦除页
HAL_FLASHEx_Erase(&PageError, flash_address & ~(FLASH_PAGE_SIZE - 1));
}
}
// 关闭Flash写入
HAL_FLASH_Lock();
// 使能所有中断
__enable_irq();
return status;
}
注意:在写入 Flash 时,需要先检查要写入的地址是否在一个 Flash 页的范围内,如果不是,则需要先擦除该页。因为 Flash 是按页写入的,如果要写入的地址不在一个页内,就需要先擦除该页,然后再写入数据。
原文地址: http://www.cveoy.top/t/topic/nJar 著作权归作者所有。请勿转载和采集!