【发布时间】: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