在处理嵌入
STM32G0B0CE (v13.0) 和 STM32G0B1RE (v9.2) MCU 系统内存中的 I2C 引导加载程序时,我们注意到一个奇怪的行为。
引导加载程序的 Write Memory (0x31) 和 No-Stretch Write Memory (0x32) 命令似乎不适用于至少 8 字节对齐的地址。在 4 字节对齐地址上发出的命令由引导加载程序确认(在最后一次 I2C 读取命令时收到 ACK 字节 (0x79)),但数据永远不会写入
记忆。操作的大小似乎并没有改变这种行为。例如,引导加载程序在 0x08000004 上确认写入内存命令,但从未真正将其写入闪存,即使它之前已被擦除。该地址上的读取内存命令 (0x11) 返回 0xFF 字节,这表明闪存尚未被编程。
另一方面,如果我们尝试使用 16 字节的有效负载对 0x08000000 执行写操作,则一切正常(因此,地址 0x08000004 也被写入)。
在非 4 字节或 8 字节对齐的地址(例如 0x08000002)上写入内存命令不起作用:命令的最后一次 I2C 读取失败,因为引导加载程序 NAK I2C 读取。我们无法获得此类命令的 ACK (0x79)、NAK (0x1F) 或 Busy (0x76) 字节。
在 Linux 上,stm32flash 可以使用以下命令行重现此问题:
- $ stm32flash /dev/i2c-X -w /path/to/fw.bin -v -F 254:254
使用此命令,固件一次写入 0xFC 字节,这意味着一半的写入操作静默失败,因为其中一半不在 8 字节对齐的地址上。
传递给写入内存命令的地址是否有任何限制,或者这是引导加载程序中的错误?