This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] TM4C123FE6PM:TM4C123FE6PM 引导加载程序

Guru**** 2387830 points
Other Parts Discussed in Thread: UNIFLASH, TM4C123FE6PM
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/699929/tm4c123fe6pm-tm4c123fe6pm-bootloader

器件型号:TM4C123FE6PM
主题中讨论的其他器件:UNIFLASH

您好!

我在这方面花了很多时间、我希望得到比阅读手册更详细的答案、因为我已经多次查看过该示例、因为这就是所有这些内容的基础。

我有一个基于 boot_loader 示例编写的闪存引导加载程序。  我有一个 Windows 应用程序与它通信并更新固件。

这是我的项目的结构、boot_serial 是引导加载程序、QTIM 是应用程序。

我已经在地址0x00000000处设置了引导加载程序、在地址0x00000000处设置了应用程序、用于调试 cmd、在版本 cmd 中设置了应用程序基址0x00004000。   

当我运行应用程序时、它会正确与引导加载程序进行通信和更新、当我使用 Uniflash 进行更新后读取存储器时、这里是引导加载程序部分和应用部分:

引导加载程序映射文件中的 SP 位于引导加载程序的复位矢量、而 QTIM 的 SP 位于地址4000。

更新后、电路板完全无法正常工作。  如果我加载应用程序的调试版本、一切运行正常。  如果我(通过 CCS)加载引导加载程序并刷写固件、则所有这些文件都位于正确的位置。  我要刷写的文件是应用程序的发布版本、基于映射文件、地址与在 Uniflash 中为 SP 写入的内容一致。

是否有任何关于问题可能是什么或我应该测试什么的建议?


谢谢、

Dustin

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    添加到这里。 当闪存更新完成时、我从串行端口中配置器件、这意味着它进入了引导加载程序、当我连接到电路板更新程序时、会作出响应、这意味着它仍然在引导加载程序中、而不是在应用程序中、因此是用于检查有效应用程序的代码 如果图像不能正常工作、则图像完整并退出。 来源:
    使用 Uniflash 检查内存区域:
    //
    //查看第一个位置是0xffffffffff 还是不是这样的位置
    //看起来像堆栈指针,或者第二个位置是0xffffffff 或
    //看起来不像复位矢量的内容。
    //
    pui32App =(uint32_t *) app_start_address;
    if ((pui32App[0]= 0xffffffff)||
    ((pui32App[0]& 0xFF00000)!= 0x20000000)||
    (pui32App[1]=0xffffffff)||
    ((pui32App[1]和0xfff00001)!= 0x00000001))

    退货(1);

    应退出、因为它不在 APP_START_ADDRESS 中


    uint32_t
    CheckForceUpdate (空)

    #ifdef CHECK_CRC
    uint32_t ui32Retcode;
    #endif

    #ifdef BL_CHECK_UPDATE_FN_HOOK
    //
    //如果连接了更新检查函数,请调用应用程序来确定
    //如何继续。
    //
    return (bl_check_update_fn_hook ());
    其他
    uint32_t * pui32App;

    #ifdef ENABLE_UPDATE_CHECK
    G_ui32Forced = 0;
    #endif

    //
    //查看第一个位置是0xffffffffff 还是不是这样的位置
    //看起来像堆栈指针,或者第二个位置是0xffffffff 或
    //看起来不像复位矢量的内容。
    //
    pui32App =(uint32_t *) app_start_address;
    if ((pui32App[0]= 0xffffffff)||
    ((pui32App[0]& 0xFF00000)!= 0x20000000)||
    (pui32App[1]=0xffffffff)||
    ((pui32App[1]和0xfff00001)!= 0x00000001))

    退货(1);


    //
    //如果需要,扫描图像以查找嵌入的 CRC 并确保它
    //匹配图像的当前 CRC。
    //
    #ifdef CHECK_CRC
    InitCRC32Table();
    ui32Retcode = CheckImageCRC32 (pui32App);

    //
    //如果定义了 enforce_crc,则仅在 CRC 为时引导映像
    //显示在图像信息标题和计算值中
    //匹配标头中的值。 如果未定义 enforce_crc、我们
    //如果 CRC 良好,但标头的长度字段也是如此
    //为零(通常表示正在运行的编译后处理步骤
    // binpack 以添加长度,并且未运行头的 CRC)。
    //
    #ifdef enforce_crc
    if (ui32Retcode!= CHECK_CRC_OK)
    其他
    if ((ui32Retcode!= CHECK_CRC_OK)&&(ui32Retcode!= CHECK_CRC_NO_LENGTH))
    #endif

    //
    // CRC32图像检查失败,表明图像是
    //损坏(或未正确嵌入 CRC)。 无论采用哪种方式、
    //未通过更新检查并强制引导加载程序保留控制权。
    //
    退货(2);

    #endif

    #ifdef ENABLE_UPDATE_CHECK
    //
    //如果配置了简单的 GPIO 检查,则确定是否强制执行
    //更新。
    //
    return (CheckGPIOForceUpdate());
    其他
    //
    //不需要 GPIO 检查,因此,如果我们到达这里,就会有一个有效的映像
    //不需要更新。
    //
    返回(0);
    #endif
    #endif
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Dustin、您好!

    首先、您声明的可用闪存空间远远大于您的 MCU 的功能。 十六进制40000表示262,144字节的可用存储器、但 TM4C123FE6PM 是128kB 闪存器件。 请修复该长度、以首先匹配您的 MCU 功能。 如果尝试访问不存在的内存、可能会出现问题。

    现在、您已经说明了以下内容:

    [报价用户="Dustin 凯恩斯">我已在地址0x00000000设置引导加载程序、并在地址0x00000000设置应用程序以进行调试命令、并在版本 cmd 的版本中设置应用程序基址0x00004000。   [/报价]

    我希望确保我更好地理解这一点。

    情况1)发布版本、使用引导加载程序、通过引导加载程序加载的代码具有0x00004000的 app_BASE、应从0x00004000开始执行

    情况2)调试版本、未使用引导加载程序、应用程序代码设置为0x00000000、运行正常

    我是否正确理解这两个案例以及每个案例的地址如何变化?

    串行引导加载程序使用的接口是什么? USB? UARTTM

    您提到自定义应用程序正在下载代码、您如何验证自定义应用程序正在正确执行其工作?

    现在、根据问题演示、我可以看到问题出现在自定义应用程序或引导加载程序中、因此尝试缩小根本原因的范围将大有裨益。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    拉尔夫
    我修复了在对新映像进行编程之前清除闪存时遇到的一系列问题以及未意识到的错误。 完成此操作后、一切都正常。
    谢谢、
    Dustin
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    尊敬的 Dustin:

    感谢您的更新、很高兴听到您的一切正常! 然后、我将继续、关闭这个线程。