我使用arm-none-eabi-gcc 5.3为STM32L4生成二进制文件。我使用bootloader来闪存程序。问题是我无法确定我是否会闪烁整个文件。我没有任何CRC可用。 Flash在0x80000000
和0x80040000
上启动(2个银行用于引导加载程序和主程序)。目前我假设如果0x80040004在0x80040000
和0x80080000
之间,则程序闪烁。但是如何检查程序是否有效?我无法找到应该写在flash上的二进制文件的大小,所以我可以查看最后几个整数。
这是BIN的前几个字节(抱歉,不能发布整个文件):
未编程的最后一个字节是0x80051C00
(程序有72704个字节)。
答案 0 :(得分:1)
最可能的错误是传输过程中数据连接丢失,因此图像只是部分写入。尽管您的传输协议应包含某种数据完整性检查,但一旦收到数据,编程错误的可能性可能微不足道。为此,您可以简单地验证十六进制文件记录的校验和,或使用具有CRC错误检查的协议,例如XMODEM-CRC或XMODEM-1K。
确保不尝试启动部分加载的应用程序映像很简单。没有必要按地址顺序对闪存进行编程,甚至不需要按照数据到达的顺序对闪存进行编程。鉴于此情况,当收到0x80040004
处的复位向量数据时,将其保留在RAM中并对其进行最后编程。这样,如果编程没有完成,复位向量值将始终为0xFFFFFFFF:
的伪代码:
WHILE receiving data
IF program_address in range
// Write all data except address at reset vector
IF program_address == 0x80040004
start_address = program_data
ELSE
write( program_address, program_data )
ENDIF
ENDIF
ENDWHILE
// Write reset vector *LAST*
write( 0x80040004, start_address )
然后在启动代码中:
IF @0x80040004 == 0xFFFFFFFFFF
NO APPLICATION - DO SOMETHING!
ELSE
START APPLICATION
ENDIF