【问题标题】:STM32H7, weird behavior of HAL_FLASH_Program functionSTM32H7,HAL_FLASH_Program 函数的奇怪行为
【发布时间】:2021-07-29 00:01:23
【问题描述】:

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

所以我的引导加载程序从 0x08000000 开始,它的大小是 21kB(128kB 的第一个扇区的 17%),我想在扇区末尾读取/写入数据,这些数据将与我的应用程序共享。当我说扇区结束时,它是扇区的最后 10kB,这意味着我从 0x0801D800 开始 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,第二个参数是我分配的struct):

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)。

我错过了什么?我需要在写作之前/之后清除一些标志吗?

谢谢(=;

【问题讨论】:

  • 警告:我没有指定芯片的手册:但是,寄存器列表中通常有一个“忙”指示器,并且锁定/解锁操作不是即时的,因此需要确保内置外设在更改其锁定/解锁状态之前并不忙(在解锁以写入数据时类似,并且写入数据需要特定的操作序列

标签: c memory stm32 write flash-memory


【解决方案1】:

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

我的问题解决了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-06-03
    • 2011-06-14
    • 2020-01-31
    • 2014-05-24
    • 1970-01-01
    • 2023-03-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多