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.

[参考译文] TM4C123GH6PZ:CAN 启用闪存引导加载程序问题

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/783313/tm4c123gh6pz-can-enabled-flash-bootloader-questions

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

我有一个具有上述 Tiva 部件的定制板。  我们有一个应用程序目前正在生产中且可靠。  目标是实现一个闪存引导加载程序、此加载程序将允许通过 CAN 总线(这是电路板上的主要通信链路)进行应用更新。   

我的目标是通过以下几个步骤来实现这一点:

1. 使用 TivaWare 示例中的 TI serial_boot 示例开始。  

2.验证 引导加载程序 是否将控制权移交给应用程序和应用程序是否正常工作。

3.通过串行对应用程序进行编程

3.使用 serial_boot 示例作为基准、修改引导加载程序以使用 CAN 总线代替串行。

问题是、我不能超过步骤1。  已修改引导加载程序和应用程序以反映正确的存储器空间。   

boot_serial 工程中的 bl_config.h 文件已修改为包括:

#define VTABLE vstart_address  0x2800

#define APP_START_ADDRESS    0x2800

应用程序中的 tm4c123gh6pz_startup.cmd 文件被修改:

#define APP_BASE_ADDR 0x00002800
#define RAM_BASE_ADDR 0x20000000

存储器

闪存(RX):origin = APP_BASE_ADDR,length = 0x0003d800
SRAM (rwx):origin = 0x20000000,length = 0x00008000

/*以下命令行选项作为 CCS 项目的一部分进行设置。 *
/*如果您使用命令行构建,或者出于某种原因想要*/
/*在此处定义它们,您可以根据需要取消注释并修改这些行。 *
/*如果您使用 CCS 进行构建、最好进行任何这样的构建*/
/*对 CCS 项目进行修改并将此文件保留为单独文件。 *
/**//
/*--heap_size=0 */
/*--stack_size=256 */
/*--library=rtsv7M4_T_le_eabi.lib */

/*内存中的段分配*/

部分

.intvecs:> APP_BASE_ADDR
.text:> FLASH
.const:> FLASH
.cinit:>闪存
.pinit:> FLASH
init_array:> FLASH

.vtable:> RAM_BASE_ADDR
.data :> SRAM
.bss:> SRAM
.sysmem:> SRAM
.stack:> SRAM

使用 UniFlash 应用程序、我将 boot_serial.bin 加载到地址0x0000、将应用加载到地址0x2800

我的预期是引导加载程序将会运行、没有串行输入、并将控制权转移到起始地址0x2800处的应用程序、但并非如此。  我将其基于板上的 LED 指示灯、该指示灯在应用程序初始化时立即亮起。

我的问题是:

1.我的期望是否不正确?  我是否遗漏了什么?  示例 boot_serial 是否应该不会启动应用程序?

调试引导加载程序的最佳方法是什么?  我使用 CCS7作为开发环境和 XDS2xx USB 仿真器。

谢谢!

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    第二个文件是 tm4c123gh6pz.cmd
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好 Brian、

    [引用 user="Brian Savage">我的预期是引导加载程序将会运行、没有串行输入、并且会在起始地址0x2800处将控制权转移给应用程序、但并非如此。  我将其基于板上的 LED 指示灯、该指示灯在应用程序初始化时立即亮起。

    这种理解是不正确的、首先检查应用程序位置、如果有应用程序、则只进入应用程序、因此您看到的是正确的。 如果已加载有效的应用程序、则需要触发引导加载程序。

    中应用程序下方的 boot_serial 仅在触发时或在加电时调用无效应用程序。 然后、当被调用时、它将对新应用程序进行编程、然后再次等待它被调用或应用程序无效。 此处介绍了启动时用于验证应用程序的检查:

    //
    //
    //应用程序的起始地址。 这必须是1024
    //字节的倍数(使其与页边界对齐)。 在
    //这个位置应该有一个矢量表、而矢量表(位于
    SRAM 中的堆栈、位于闪存中的复位矢量)的感知有效性被用作
    应用程序映像的//有效性的指示。
    //
    //启动加载程序的闪存映像不得大于此值。
    //
    //取决于:无
    //不包括:无
    //要求:无
    //
    //*********
    #define APP_START_ADDRESS 0x4000 

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    感谢您的回复。  那么、地址0x0000处的闪存引导加载程序和地址0x4000处的应用程序是否正确?   

    总体目标是应用程序运行、读取一个"程序模式"GPIO。  如果 GPIO 为低电平、则系统处于编程模式。  可能会更新多个 CAN 节点。  每个都有一条特定的"开始编程" CAN 消息、该消息将调用引导加载程序来更新该特定节点上的闪存。   

    我仍然无法启动应用程序。   

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    仅需澄清一下、如果在指定的应用程序起始地址加载了有效的应用程序、ROM 引导加载程序将"跳过"闪存引导加载程序? ROM 引导加载程序如何知道起始地址是什么?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好 Brian、

    ROM 引导加载程序将查找有效的复位矢量、如果看到一个矢量、则会将器件设置为从闪存执行、而是随后调用闪存引导加载程序。 然后、闪存引导加载程序将遵循我之前提到的行为、在这里它看到一个有效的应用程序、然后执行它。

    这就是闪存引导加载程序可通过 ROM 引导加载程序使用的方式、即使 ROM 引导加载程序支持某些串行接口。

    数据表中的这段摘录提供了有关 ROM 引导加载程序条件的更多详细信息:

    在上电复位(POR)和器件初始化发生后、硬件会根据闪存中是否存在应用以及 BOOTCFG 寄存器中 EN 位的状态从闪存或 ROM 加载堆栈指针。 如果闪存地址0x0000.0004包含一个已擦除的字(值0xFFFF.FFFF)或 BOOTCFG 寄存器的 EN 位清零、堆栈指针和复位向量指针分别从 ROM 地址0x0100.0000和0x0100.0004处加载。 引导加载程序执行并配置可用的引导从接口、并等待外部存储器加载其软件。 如果地址0x0000.0004处的 Flash 校验包含有效的复位向量值、并且 BOOTCFG 寄存器不指示引导加载程序、则引导序列会导致堆栈指针/从 Flash 提取复位向量。 加载该应用程序堆栈指针和复位矢量、处理器直接执行该应用程序。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    拉尔夫-

    我使用 boot_serial 示例进行初始测试(我们需要迁移到 CAN、而不是串行、但我只希望它立即启动我的应用。  今天我有更多的时间重新开始这项努力。  我发现、如果我将 boot_serial.bin 闪存(使用 UniFlash)地址0x0000、然后通过与0x0000处的.bin 文件进行比较来验证、它会成功返回。  然后、如果我将应用程序刷写到0x4000、我可以在该位置验证应用程序。  但是、如果我再返回到该点并尝试在0x0000验证 boot_serial.bin、则会失败。  Uniflash 输出:

    [14:20:01]开始启动会话操作。
    [14:20:04] Cortex_M4_0:GEL 输出:
    内存映射初始化完成

    [14:20:04]操作启动会话返回。
    [14:20:04]已从:C:\TivaWorkspace\cCPD_CCA\CPD_CCA.ccxml 加载目标配置
    [14:20:19]开始写入闪存操作。
    [14:20:21]在0x0上加载程序:C:\TivaWorkspace\boot_serial\Debug\boot_serial.bin
    [14:20:22]返回写入闪存存储器的操作。
    [14:20:33]开始验证闪存操作。
    [14:20:34]验证0x0处的程序:C:\TivaWorkspace\boot_serial\Debug\boot_serial.bin
    [14:20:34] Cortex_M4_0:C:\TivaWorkspace\boot_serial\Debug\boot_serial.bin 的程序验证成功

    [14:20:35]操作验证是否返回闪存。
    [14:20:44]开始写入闪存操作。
    [14:20:45]在0x4000处加载程序:C:\TivaWorkspace\CPD_CCA\Debug\102043.bin
    [14:20:48]返回写入闪存存储器的操作。
    [14:20:59]开始验证闪存操作。
    [14:21:00]在0x4000处验证程序:C:\TivaWorkspace\CPD_CCA\Debug\102043.bin
    [14:21:00] Cortex_M4_0:C:\TivaWorkspace\CPD_CCA\Debug\102043.bin 的程序验证成功

    [14:21:01]操作:验证是否返回闪存。
    [14:21:13]开始验证闪存操作。
    [14:21:14]在0x0处验证程序:C:\TivaWorkspace\boot_serial\Debug\boot_serial.bin
    [14:21:14]错误>> Cortex_M4_0:文件加载程序:验证失败:地址0x0000000000000000处的值不匹配请验证目标存储器和存储器映射。

    [14:21:14]文件:C:\TivaWorkspace\boot_serial\Debug\boot_serial.bin:发生数据验证错误、文件加载失败。
    [14:21:15]操作、验证是否返回闪存。

    UniFlash 是否清除/覆盖闪存中的引导加载程序?   

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好 Brian、

    啊、我在您的过程中看到了这个问题、听起来您是通过 ICDI 而不是通过引导加载程序加载应用程序。 您需要通过引导加载程序加载应用程序以避免擦除该应用程序、因此您需要重新启动板、然后通过串行方式而不是通过 ICDI 连接 Uniflash。 我曾认为您是通过引导加载程序上载应用程序的。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我通过 USB2xx 调试探针连接到 JTAG。 我的笔记本电脑上的设备管理器显示两个串行端口连接:
    XDS2xx 仿真器 CDC 串行端口(COM4)
    XDS2xx 用户 CDC 串行端口(COM 5)

    这些连接之一是否适合加载应用? 我正在尝试让它连接、但它无法正常工作。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    顺便说一下、这是一个定制的生产板。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好 Brian、

    因此、我的印象是、Uniflash 会在正确编程引导加载程序时调用引导加载程序、但看起来它的运行方式更像 CCS、根本不会尝试调用引导加载程序。 也许可以通过命令行执行此操作、但这对您要测试的内容来说并不实用。

    您能否使用我们的 LMFlash 编程器尝试这些测试? 您可以从以下位置下载: www.ti.com/.../LMFLASHPROGRAMR

    LMFlash Programmer 旨在对 TM4C MCU 进行编程、绝对支持串行引导加载程序、这就是多年来我一直使用 serial_boot 示例的方式。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我使用 UniFlash 对 boot_serial.bin 进行了编程、然后启动了 LM 闪存编程器、但它无法识别连接。 如上所示、我已尝试使用 COM4/5。 我是否正确地认为通过仿真器的 JTAG 连接中存在串行连接?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好 Brian、

    很抱歉、我非常专注于使用 LaunchPad 测试 Uniflash/LM 闪存问题、因此在使用定制板时、我没有从硬件角度考虑其他挑战。 通过 XDS200进行的 JTAG 连接不会连接到定制电路板上的串行引导加载程序、因为串行引导加载程序的重点是在没有 JTAG 探针的情况下对电路板进行编程。

    您需要从 PC 连接到 UART、这通常通过 FTDI 线缆完成。 我已经使用连接到 LM 闪存的 FTDI 线缆进行了测试、因此我知道这确实是可行的。 不过、如果您不打算在电路板上执行 UART 引导加载程序、并且没有该加载程序的连接、 然后、您可能需要考虑从 LaunchPad 开始、在该 LaunchPad 中、您可以通过 ICDI 访问 UART 引导加载程序、然后当您根据自己的喜好设置并了解有关引导加载程序过程的更多信息时、 然后、您可以移至测试定制板上的 CAN 引导加载程序。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    好的、我将后退一步、重新评估我的计划。 感谢你的帮助
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    很高兴为您提供帮助、很抱歉、我没有更快地为您提供重要信息。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    是否有一个有关调试引导加载程序的良好教程或线程、以及 Tiva?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好 Brian、

    我不知道有什么、我想不出我实际调试引导加载程序的时间了。 当配置正确时、它可以很好地工作、配置在第8节的 TIvaWare 引导加载程序指南中进行了介绍。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您能解释一下 UART 到 CAN 桥的功能/用途。  我知道我认为它应该做什么、但我正在阅读的某些内容对我来说毫无意义。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好 Brian、

    我还没有亲自使用过该功能、但请查看 Charles 的解释是否对 e2e.ti.com/.../2498842有所帮助