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擦除。我将我的“共享区域”移到了一个特定的扇区,每次我想在上面写东西时都必须擦除它。
我的问题解决了。
对于上下文,我正在为我的 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擦除。我将我的“共享区域”移到了一个特定的扇区,每次我想在上面写东西时都必须擦除它。
我的问题解决了。