如何检查整个程序是否在ARM上闪现?

时间:2017-11-23 09:25:51

标签: c flash arm embedded

我使用arm-none-eabi-gcc 5.3为STM32L4生成二进制文件。我使用bootloader来闪存程序。问题是我无法确定我是否会闪烁整个文件。我没有任何CRC可用。 Flash在0x800000000x80040000上启动(2个银行用于引导加载程序和主程序)。目前我假设如果0x80040004在0x800400000x80080000之间,则程序闪烁。但是如何检查程序是否有效?我无法找到应该写在flash上​​的二进制文件的大小,所以我可以查看最后几个整数。

这是BIN的前几个字节(抱歉,不能发布整个文件): enter image description here 未编程的最后一个字节是0x80051C00(程序有72704个字节)。

1 个答案:

答案 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