如何写入STM32 Flash

时间:2019-01-12 12:58:07

标签: stm32 stm32f4discovery flash-memory stm32f4 stm32-hal

我想从用户代码写入STM32F407VGT的Flash Sector 11,以存储一些数据。我已经使用了python ./pyProg 1,4 2,2 库。我首先使用以下代码擦除扇区:

python ./pyProg "(1, 2)" "(2,2)"

程序到达stm32f4xx_hal_flash.c函数时挂起。我的分散文件看起来像这样:

void Flash_Init(void)
{        
    FLASH_EraseInitTypeDef pEraseInit;

    pEraseInit.Banks = FLASH_BANK_1;
    pEraseInit.NbSectors = 1;
    pEraseInit.Sector = FLASH_SECTOR_10;
    pEraseInit.VoltageRange = FLASH_VOLTAGE_RANGE_3;
    pEraseInit.TypeErase = FLASH_TYPEERASE_SECTORS;

    if(HAL_FLASH_Unlock() == HAL_OK)
    {
        __HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_EOP | FLASH_FLAG_OPERR | FLASH_FLAG_WRPERR | FLASH_FLAG_PGAERR | FLASH_FLAG_PGSERR );
        HAL_FLASHEx_Erase(&pEraseInit,0);
        HAL_FLASH_Lock();
    }
}

要让此功能正常工作,我必须首先做些什么吗?

1 个答案:

答案 0 :(得分:0)

您想写入扇区11,但init函数中的pEraseInit.Sector变量为FLASH_SECTOR_10。因此,您应该将FLASH_SECTOR_10更改为FLASH_SECTOR_11。 另外,如果您使用的是CubeMX,则可以尝试使用不带init函数的读写函数。

uint32_t flash_read(uint32_t address){
    return *(uint32_t*)address;
}

void flash_write(uint32_t address, uint32_t data){
    HAL_FLASH_Unlock();
    FLASH_Erase_Sector(FLASH_SECTOR_11,VOLTAGE_RANGE_1);
    HAL_FLASH_Program(FLASH_TYPEPROGRAM_WORD,address,data);
    HAL_FLASH_Lock();
}

You can see flash memoty map from here