STM32H7,HAL_FLASH_Program 函数的奇怪行为

STM32H7, weird behavior of HAL_FLASH_Program function

对于上下文,我正在为我的 STM32H743XI 编写引导加载程序,因为我想通过 USB 擦除和上传代码而不使用引脚。

所以我的引导加载程序从 0x08000000 开始,它的大小是 21kB(第一个扇区 128kB 的 17%),我想 read/write 扇区末尾的数据将与我的应用程序共享.当我说扇区结束时,它是扇区的最后 10kB,这意味着我从 0x0801D800 开始 R/W。

我想要 R/W 的结构是 8x32 位,因为如果我理解得很好,这是 STM32H74x/5X 设备上 WORD 的大小。

这是我的结构:

typedef struct
{
    int32_t     BootLoaderMode;
    int32_t     StartingPartition;
    int32_t     AppStartingError;
    int32_t     temp4;
    int32_t     temp5;
    int32_t     temp6;
    int32_t     temp7;
    int32_t     temp8;

} ExchangeWord_1;

我有一个指向已分配结构的指针:

ExchangeWord_1* m_ExchangeWord_1 = (ExchangeWord_1*)malloc(sizeof(ExchangeWord_1));

在写入之前,我使用以下方法解锁内存:

HAL_FLASH_Unlock();
HAL_FLASH_OB_Unlock();

写操作看起来像(id=0,第二个参数是我分配的结构):

void writeExchangeWord(uint16_t id, ExchangeWord_1* exchangeWord )
{
   //unlock function

    uint32_t flash_address = (0x0801D800+id*32);
    uint32_t data_address = (uint32_t)exchangeWord;
    HAL_FLASH_Program(FLASH_TYPEPROGRAM_FLASHWORD, flash_address, data_address);

    //lock function
}

那我锁内存:

HAL_FLASH_Lock();
HAL_FLASH_OB_Lock();

所以第一次调用它运行良好,调试器在我查看内存时确认它:

[首次调用闪存][1]: https://i.stack.imgur.com/cH9fI.png

但是在下一次调用时内存被0填充,更奇怪的是在第三次调用时它是从0x0801D800开始的多个单词被0填充。

我的结构地址对齐良好(m_ExchangeWord_1 = 0x20001D60)。

我错过了什么?我需要清除一些标志 before/after 写作吗?

好吧,似乎不可能在同一个地址连续写入两次,我在某处读到,如果我们想多次写入而不允许我们只允许从 1 切换到 0擦除。我将我的“共享区域”移到了一个特定的扇区,每次我想在上面写东西时都必须擦除它。

我的问题解决了。