以下是基于 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 是按页写入的,如果要写入的地址不在一个页内,就需要先擦除该页,然后再写入数据。

STM32 内部 Flash 读写代码示例 - 基于 STM32CubeMX 和 HAL 库

原文地址: http://www.cveoy.top/t/topic/nJar 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录