使用 HAL 在 STM32f407 发现中将数据存储读/写到闪存中

Posted

技术标签:

【中文标题】使用 HAL 在 STM32f407 发现中将数据存储读/写到闪存中【英文标题】:Read/write data storage into Flash Memory in STM32f407 discovery using HAL 【发布时间】:2016-08-04 13:53:08 【问题描述】:

我正在尝试将数据存储在闪存(非易失性存储器)中以供进一步检索。这样当电源关闭再打开时,我就可以从内存中读取数据。

uint32_t address = 0x0800C000;
uint64_t data = 0x01;
HAL_FLASH_Unlock();
HAL_FLASH_Program(TYPEPROGRAM_WORD, address, data);
HAL_FLASH_Lock();

但是我无法将数据存储在这个位置,我不知道为什么?是否有任何函数可以从 HAL 中的这个位置读回数据??

【问题讨论】:

另见Allocating memory in Flash for user data (STM32F4 HAL) 【参考方案1】:

你必须先擦除Flash,然后才能写入新数据

/*
* write data to internal flash
* return: value if OK, 0 if Error
*/
uint32_t WriteToFlash(uint32_t address, uint32_t value)

    uint32_t PAGEError = 0;
    uint32_t result = 0;

    /* Unlock the Flash to enable the flash control register access *************/
    HAL_FLASH_Unlock();

    /* Erase the user Flash area */
    EraseInitStruct.TypeErase   = FLASH_TYPEERASE_PAGES;
    EraseInitStruct.PageAddress = FLASH_USER_START_ADDR; //User defined addr
    EraseInitStruct.NbPages     = 1;

    if (HAL_FLASHEx_Erase(&EraseInitStruct, &PAGEError) != HAL_OK)
    
        HAL_FLASH_Lock();
        return 0;
    

    /* Program the user Flash area word by word */
    if (HAL_FLASH_Program(FLASH_TYPEPROGRAM_WORD, address, value) != HAL_OK)
    
        HAL_FLASH_Lock();
        return 0;
    

    /* Lock the Flash to disable the flash control register access (recommended
     to protect the FLASH memory against possible unwanted operation) *********/
    HAL_FLASH_Lock();

    /* Check if the programmed data is OK */
    result = *(__IO uint32_t *)address;

    if(result != value)
        return 0;

    return result;

【讨论】:

以上是关于使用 HAL 在 STM32f407 发现中将数据存储读/写到闪存中的主要内容,如果未能解决你的问题,请参考以下文章

STM32F4 HAL库开发 -- STM32F407引脚图

STM32F4 HAL库开发 -- STM32F407引脚图

STM32F407开发板用户手册第23章 STM32F407的USART串口基础知识和HAL库API

HAL STM32F407ZGT6 FreeRTOS

我们不能在 stm32 F407VG 的 ISR 中使用 HAL_Delay()

使用HAL对STM32F407ZGT6单片机移植FreeRTOS(参考正点原子)