Arm 8个16位数据中只有6个写入STM32闪存

Arm 8个16位数据中只有6个写入STM32闪存,arm,stm32,microcontroller,stm32f4,flash-memory,Arm,Stm32,Microcontroller,Stm32f4,Flash Memory,我试图将8段16位数据写入STM32F410闪存,特别是从地址0x0801_1000开始的第4个扇区。我所做的唯一初始化包括更改FLASH->ACR |=FLASH_ACR_LATENCY_3WS因为HCLK为100MHz,输入电压应在3.3V左右 以下是我到目前为止将所有数据写入闪存的代码: /* Each segment will store 16-bit data */ #define BASE_ADDRESS ((uint32_t)0x8011000) #defi

我试图将8段16位数据写入STM32F410闪存,特别是从地址0x0801_1000开始的第4个扇区。我所做的唯一初始化包括更改
FLASH->ACR |=FLASH_ACR_LATENCY_3WS因为HCLK为100MHz,输入电压应在3.3V左右

以下是我到目前为止将所有数据写入闪存的代码:

/* Each segment will store 16-bit data */
#define BASE_ADDRESS            ((uint32_t)0x8011000)

#define ADDRESS_1               ((uint32_t)BASE_ADDRESS)
#define ADDRESS_2               ((uint32_t)ADDRESS_1 + 0x04)
#define ADDRESS_3               ((uint32_t)ADDRESS_2 + 0x04)
#define ADDRESS_4               ((uint32_t)ADDRESS_3 + 0x04)
#define ADDRESS_5               ((uint32_t)ADDRESS_4 + 0x04)
#define ADDRESS_6               ((uint32_t)ADDRESS_5 + 0x04)
#define ADDRESS_7               ((uint32_t)ADDRESS_6 + 0x04)
#define ADDRESS_8               ((uint32_t)ADDRESS_7 + 0x04)


void FLASH_MassWrite(void)
{
    /* Stop timer interrupts */
    HAL_LPTIM_Counter_Stop_IT(&hlptim1);
    
    HAL_FLASH_Unlock();
    __HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_EOP|FLASH_FLAG_OPERR|FLASH_FLAG_WRPERR|FLASH_FLAG_PGAERR|FLASH_FLAG_PGSERR);
    FLASH_Erase_Sector(FLASH_SECTOR_4, VOLTAGE_RANGE_4);
    HAL_FLASH_Program(FLASH_TYPEPROGRAM_WORD, ADDRESS_1, (uint16_t)0xABCD);
    HAL_FLASH_Program(FLASH_TYPEPROGRAM_WORD, ADDRESS_2, (uint16_t)0x1234);
    HAL_FLASH_Program(FLASH_TYPEPROGRAM_WORD, ADDRESS_3, (uint16_t)0x5678);
    HAL_FLASH_Program(FLASH_TYPEPROGRAM_WORD, ADDRESS_4, (uint16_t)0x4321);
    HAL_FLASH_Program(FLASH_TYPEPROGRAM_WORD, ADDRESS_5, (uint16_t)0x8765);
    HAL_FLASH_Program(FLASH_TYPEPROGRAM_WORD, ADDRESS_6, (uint16_t)0xFEDC);
    HAL_FLASH_Program(FLASH_TYPEPROGRAM_WORD, ADDRESS_7, (uint16_t)0xBA98);
    HAL_FLASH_Program(FLASH_TYPEPROGRAM_WORD, ADDRESS_8, (uint16_t)0xAABB);
    HAL_FLASH_Lock();
    
    /* Resume timer interrupts */
    HAL_LPTIM_Counter_Start_IT(&hlptim1, 199);          
}
由于STM32F410无法写入前两个地址(0x801100和0x8011004),因此上述方法对我来说无法正常工作。如果我更改地址,使其开始写入0x8011008,则前3个16位数据未正确写入。我还尝试将其更改为
FLASH\u TYPEPROGRAM\u HALFWORD
,以便以16位块写入,但没有任何区别

这是包含我记忆区域内容的屏幕截图。请注意,16位数据的最后6个条目按正确顺序正确写入:

以下是显示闪存状态寄存器的屏幕截图:

要将数据可靠地写入STM32闪存,我缺少哪一步?我正在尝试一次写入多个数据,因为我计划存储一些数据量。我在想,如果我计划存储几个字节的数据,我可能需要一次存储所有字节,因为在将数据写入闪存扇区4的某个地址之前,需要进行大规模擦除,这意味着擦除以前在不同地址上存储/写入/保存的数据


谢谢大家!

检查
HAL\u FLASH*()
函数的返回值。@kkrambo我试着检查返回值,它们似乎都返回
HAL\u OK
。我浏览了STM32Cube示例,发现使用了
HAL\u flashx\u Erase(&pEraseInit,&SectorError)
而不是
FLASH\u Erase\u Sector(FLASH\u Sector\u 4,VOLTAGE\u RANGE\u 4)
。当使用
HAL\u flashx\u Erase()。