STM32F745-HAL_闪存_程序未永久写入闪存

STM32F745-HAL_闪存_程序未永久写入闪存,stm32,hal,stm32f7,Stm32,Hal,Stm32f7,我正在使用HAL_FLASH_Program()将uuid编程到特定地址。我可以通过读取同一地址来验证它是否成功写入。但是,如果我关闭MCU的电源,该地址的内存将恢复到原始值。如果我直接通过ST Link向它写入,那么它将永久保留 有人知道为什么吗?在使用HAL_FLASH_Program()写入之前,是否需要擦除内存位置?我使用的是STM32F745 我的代码非常简单: #define UUID_ADDR (0x080FFFFB) uint16_t uuid 0x1234 HAL_F

我正在使用HAL_FLASH_Program()将uuid编程到特定地址。我可以通过读取同一地址来验证它是否成功写入。但是,如果我关闭MCU的电源,该地址的内存将恢复到原始值。如果我直接通过ST Link向它写入,那么它将永久保留

有人知道为什么吗?在使用HAL_FLASH_Program()写入之前,是否需要擦除内存位置?我使用的是STM32F745

我的代码非常简单:

#define UUID_ADDR      (0x080FFFFB)
uint16_t uuid 0x1234
HAL_FLASH_Program(FLASH_TYPEPROGRAM_HALFWORD, UUID_ADDR, uuid);

谢谢

闪存要求要写入的扇区必须处于擦除状态才能写入

为此,在使写入持久化之前,您需要一些额外的步骤

下面是一个如何操作的示例,但请确保地址符合您的目的,这里只是一个通用代码:

HAL_StatusTypeDef将半字写入闪存(uint32扇区、uint32地址、void*数据){
HAL_StatusTypeDef status=HAL_FLASH_Unlock();
uint32_t错误=0;
//确保此结构与芯片的数据表匹配
FLASH_橡皮擦初始化类型定义FLASH_橡皮擦初始化结构={
.TypeErase=闪存\u TypeErase\u扇区,
.扇区=扇区,
.nb=1,
.VoltagRange=闪光电压范围3
};
//在将其写入闪存之前清除所有标志
__HAL_闪烁_清除_标志(闪烁_标志_EOP |闪烁_标志_操作|
FLASH_FLAG|WRPERR | FLASH_FLAG|PGAERR | FLAG|PGSERR |);
如果(状态!=正常)
返回状态;
//首先执行擦除
HAL_flashx_Erase(&FLASH_EraseInitStruct,&error);
如果(错误)
返回-1;
//现在扇区已被擦除,我们可以对其进行写入
状态=HAL_FLASH_程序(FLASH_类型程序_半字、地址、数据);
如果(状态!=正常)
返回状态;
HAL_FLASH_Unlock();
返回状态;
}

我用Stm32F417做了一个测试。我查阅了STM32F6xx的参考手册。这似乎很相似

擦除闪存

void eraseFlash()
{
    //  Disable prefetch memory
    __HAL_FLASH_PREFETCH_BUFFER_DISABLE();

    //  Flash 5 wait state.
    //  Check the Number of wait states according to CPU clock
    //  In my case, HCLK = 168MHz, Need FLASH_LATENCY_5
    if (FLASH_LATENCY_5 == __HAL_FLASH_GET_LATENCY())
        __HAL_FLASH_SET_LATENCY( FLASH_LATENCY_5 );

    //  Lock the memory to make sure to write the FLASH_OPT_KEYn in OPTKEYR
    HAL_FLASH_Lock();

    //  Clean all flags except FLASH_FLAG_BSY
    __HAL_FLASH_CLEAR_FLAG( FLASH_FLAG_EOP | FLASH_FLAG_OPERR | FLASH_FLAG_WRPERR | FLASH_FLAG_PGAERR | FLASH_FLAG_PGSERR );

    //  Write the FLASH_OPT_KEYn in OPTKEYR to access the memory
  HAL_FLASH_Unlock();

  //    Timeout of 500ms for the operation. Check if the FLASH_FLAG_BSY.
  FLASH_WaitForLastOperation( 500 );

  //    Write the Sector.
  //    STM32F40/41 have 11 sectors. 5 sectors of 16K, 1 x 64K, 7 x 128K
  //    Each STM32 has a different memory organisation
  //    The voltage range will selection the type to erase the memory
  //    FLASH_VOLTAGE_RANGE_3 erases by WORD
  FLASH_Erase_Sector(  FLASH_SECTOR_1,  FLASH_VOLTAGE_RANGE_3);

  FLASH_WaitForLastOperation( 500 );

    HAL_FLASH_Lock();
    //  The memory is erased from that point
}
将数据写入闪存

uint32_t writeFlashData()
{
    __HAL_FLASH_PREFETCH_BUFFER_ENABLE();

    // Flash 5 wait state
    if (FLASH_LATENCY_5 == __HAL_FLASH_GET_LATENCY())
        __HAL_FLASH_SET_LATENCY( FLASH_LATENCY_5 );

    HAL_FLASH_Lock();
  HAL_FLASH_Unlock();

    //  Clean all flags except FLASH_FLAG_BSY
    __HAL_FLASH_CLEAR_FLAG( FLASH_FLAG_EOP | FLASH_FLAG_OPERR | FLASH_FLAG_WRPERR | FLASH_FLAG_PGAERR | FLASH_FLAG_PGSERR );

  /* Wait for last operation to be completed */
  FLASH_WaitForLastOperation((uint32_t)500);
  //    To check the state of this operation, we must declare
  //    extern FLASH_ProcessTypeDef pFlash;
  if (pFlash.ErrorCode != 0)
    return pFlash.ErrorCode;
  // Make sure the address match the FLASH_SECTOR_1.
  // The Memroy Organisation gives the address of each sector of memory
  HAL_FLASH_Program( FLASH_TYPEPROGRAM_WORD, 0x8004000, 0xAC1234AC );
  HAL_FLASH_Program( FLASH_TYPEPROGRAM_WORD, 0x8004004, 0xCA1234CA );
  // The return code must be 0, otherwise, there is an error
  return pFlash.ErrorCode;
}
闪光灯可与中断一起使用。必须在擦除或写入数据之前设置中断

HAL_NVIC_SetPriority(FLASH_IRQn, 0, 0);
HAL_NVIC_EnableIRQ(FLASH_IRQn);
然后,闪光灯必须这样设置

  FLASH->CR |=  FLASH_CR_EOPIE;
  HAL_FLASH_Program( FLASH_TYPEPROGRAM_WORD, 0x8004000, 0xAC1234AC );
在中断例程中,必须重置某些标志

void FLASH_IRQHandler(void)
{
  FLASH->CR &= ~FLASH_CR_PG;
  FLASH->CR &= ~FLASH_CR_EOPIE;
  FLASH->CR |= FLASH_CR_LOCK;
  FLASH->SR = (FLASH_FLAG_EOP | FLASH_FLAG_OPERR | FLASH_FLAG_WRPERR | FLASH_FLAG_PGAERR | FLASH_FLAG_PGSERR);
}

该问题涉及STM32F7,因此使用STM32F4进行测试和检查STM32F6参考手册可能与STM32F7的实际情况无关。STM32F6与其他哪些微控制器系列相似?F4还是F7?