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.

[参考译文] CC2652R7:使用自定义引导加载程序设置应用程序复位矢量

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

https://e2e.ti.com/support/wireless-connectivity/bluetooth-group/bluetooth/f/bluetooth-forum/1469779/cc2652r7-setting-the-application-reset-vector-with-a-custom-bootloader

器件型号:CC2652R7
主题中讨论的其他器件: SysConfig

工具与软件:

我 在 定制板上有一个使用 CC2652R7与 SDK 6.30 和自定义引导加载程序的项目。  应用项目基于 simplePeripheral TI-RTOS 示例、而引导加载程序基于 no-RTOS nvsExternal 示例。  引导加载程序执行其操作、然后使用对 jumpToPrgEntry (0x00000000)的调用跳转到应用程序;

void jumpToPrgEntry(uint32_t prgEntry)
{
    static uint32_t temp;
    temp = prgEntry;
    // Reset the stack pointer,
    temp +=4;
    asm(" LDR SP, [R0, #0x0] ");
    ((void (*)(void))(*((uint32_t*)temp)))();
}

此过程正常运行、应用程序代码运行。  当我们为引导加载程序下载新版本以进行安装时, 应用程序会调用  SysCtrlSystemReset(); 这是不起作用的部分,我确信它与重置矢量的配置方式有关。  我一直在尝试更改应用程序的复位矢量以指向引导加载程序、并显示了各种结果、我想要的都不是一个。  我已经让它只是重新启动应用程序(跳过引导加载程序)、我已经让它在 FaultISR 中挂起、我已经让它在 WaitHibProdNext()中挂起、但我从来没有让它自己返回到引导加载程序。  我要指出的是、我知道"halt in boot"、即使在下电上电后、也会在调试器上发生挂起。  借助调试器、如果我在 CCS 中按 CPU 复位按钮、它会在应用程序代码中进入_c_int00 ()、但如果我单击复位按钮、它会进入引导加载程序中的 main ()。

似乎有6个不同的地方来定义所有这些东西,我找不到任何文档,实际上指定了哪一个控制什么。  我可以附加链接器命令文件、但有人能向我解释一下所有这些文件实际上有什么作用吗?

  1. 连接器命令文件:
    1. 应用程序和引导加载程序:
      1. /*保留中断矢量表变量*/
        --retain=g_pfnVectors.
  2. 连接器命令文件:
    1.  应用:
      1. /*覆盖默认入口点。 */
        -- entry_point 重新设置 ISR
    2. 引导加载程序:
      1. /*覆盖默认入口点。 */
        -- entry_point resetisr
    3. 请注意、这些函数是不同的函数、大小写不同、TI 在其各自的 示例项目中的其他部分进行了定义
  3. 连接器命令文件:
    1. 应用程序(FLASH_START = 0x00000000:
      1. 部分中)

        .intvecs :> flash_start
    2. 引导加载程序(BOOTLOAD_BASE = 0x000AA100):
      1. 部分中)

        intvecs :> bootload_base
  4. 连接器命令文件:
    1. 应用:
      1. -u_c_int00
        -保留"*(.resetVecs )"
        -- retain "*(.vecs)"

        部分中)

        .resetVecs:加载> 0
        .vecs:载入> 0x20000000、类型=无载入
        .ramVecs:> SRAM、type = NoLoad、align (256)
        }

    2. 引导加载程序:
      1.  除.resetVecs 外相同:load > bootload_BASE
  5. SysConfig GUI 编辑器
    1. "Device Configuration"
      1. "设置闪存矢量表的地址"
  6. SysConfig 文本文件
    1. 仅限应用、来自示例工程:
      1. hwi.resetVectorAddress = system.utils.BIGINT ("00000090"、16);

有这么多的参考向量,他们似乎有点矛盾,我甚至不知道最后一个,直到我找到了相关的问题,而尝试在这里首先搜索。  所有这些做什么、我实际需要哪些?

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

    Chris、您好!

    您要评估哪个版本的 SDK?  我正在使用 片外 BIM片外 Zigbee 开关 (也可以参考 BLE 简单外设版本)作为命令链接器文件参考。  这是一个很好的起点、因为它与目标具有相同的引导加载程序/应用程序设置。  您确定引导加载程序是唯一加载 CCFG 的项目吗?  对于 BIM、链接器命令文件不会与应用程序共享相同的包容性。

    -u_c_int00
    --retain "*(.resetVecs)"
    --retain "*(.vecs)"
    
    SECTIONS
    {
    .resetVecs: load > 0
    .vecs: load > 0x20000000, type = NOLOAD
    .ramVecs: > SRAM, type = NOLOAD, ALIGN(256)
    }

    进行比较可能值得、以确定是否存在任何明显的差异。  您还可以查看输出映射文件是否存在意外的部分重叠。  示例应用命令链接器文件还包含一个条目组:

      GROUP > ENTRY
      {
        .resetVecs LOAD_START(prgEntryAddr)
        .intvecs
        EntrySection
      }

    希望这对您有所帮助、
    Ryan

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

    我 在 定制板上有一个使用 CC2652R7与 SDK 6.30 和自定义引导加载程序的项目。  应用项目基于 simplePeripheral TI-RTOS 示例

    如前所述、SDK 版本为6.30。  如前所述、应用项目作为 BLE Simple 外设启动、其 链接器命令文件不仅仅只是一个引用;它只是稍作修改、以包含我们的引导加载程序存储器区域。

    我将看看这个片外 BIM 项目、但是与此同时、您能解释一下我列出的上面项目中的哪些项目实际上发挥了作用吗?  或者至少告诉我哪一个确定了 CPU 复位后 CPU 跳转到的位置?  肯定有人知道这种情况的实际来源。

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

    很抱歉缺少版本或者忘记包含 TI Arm Clang 编译器工具用户指南 链接器命令文件 说明。  引导项 由 CCFG 决定、因此此位置应由引导加载程序而不是应用程序写入、这一点很重要。

    此致、
    Ryan

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

    因此、我的向量和一切都正常。  如果我等待足够长的时间并以足够多不同的方式重新启动板、从那以后一切都可以正常运行。  我的引导加载程序正常工作、OTA 正常工作、应用程序可以重置为引导加载程序、引导加载程序可以按照预期全天通过多个版本更新来回跳转。

    但在调试器上运行一次、它再次停留在复位状态、直到我能够神奇地使它恢复到原来的状态。  我知道我最初说过"我要指出我知道'在引导中暂停'、即使在下电上电后也会发生挂起。"  但我回到"感知"部分、因为我的假设是、这 不是在启动时暂停、因为我认为在调试器下电上电可以清除这种情况。  显然我是错的,因为它绝对仍然在启动停止,从调试器断开,在移除和更换电池后。

    实际上、我怎样在引导中完全清除暂停?  这种"等待几个小时后重置47次"的策略无法继续。

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

    Chris、您好!

    我只是 在之前连接到 JTAG 调试器时才知道 HIB 来影响器件软件复位。  您所描述的内容(在断开 JTAG 连接后很难运行应用程序)听起来从定制硬件正确启动时很不稳定。  您是否有关于电源上升时间和 XTAL 晶体稳定性的任何详细信息?  使用专用电源(而非电池)时、系统是否更加稳定?  ROM 引导加载程序是否已启用、您能否确认引导加载使能引脚在启动时未激活?  我强烈建议您将设计提交给 SIMPLELINK-2-4GHz-design-reviews 、以进行进一步审查。

    此致、
    Ryan

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

    该板是合作伙伴的现有设计。  我们只是为它编写新的代码。

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

    感谢您提供的信息。  我假设此电路板不使用自定义引导加载程序的基本应用程序代码没有问题?  请比较 CCFG 在功能设置和中断设置之间的差异、这可能有助于确定任何差异。   

    此致、
    Ryan

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

    当存在 bootloader 时、CCFG 的唯一区别是 SysConfig 中指定的闪存矢量表地址。

    CCFG.setFlashVectorTable = true;
    CCFG.addressFlashVectorTable = 0x000A8100;

    当只运行应用程序时、对于普通的0x00000000复位向量、0xAFFEC 处的字节为00 00 00 00 00。

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

    而在仅应用程序版本上、无论是退出调试器会话还是自由运行、是否存在任何重启问题?   

    此"等待几个小时、重置47次"策略无法继续。

    这在任何方面(HIB 或其他方面)都不符合预期、因此我需要进一步了解功能 设置与故障设置之间的区别。  关于其价值、下面介绍了 从 BIM 到 SLA 应用程序部分的调试、这也应该与您的自定义引导加载程序相关。

    此致、
    Ryan

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

    我要告诉您、仅应用程序版本与使用引导加载程序的版本之间的行为没有区别。  它们都重置为各自预期的复位向量、但在完全相同的场景中被 WaitHibProdNext 捕获时除外。  功能和故障之间的差别完全独立于我在任一版本的代码映像设置中所做的任何事情、并且完全与调试器状态相关联。

    如果我只运行应用程序、它会在调试器上运行、从0x0开始、我可以对 IDE 中的应用程序进行 CPU 复位、或将其重新启动回0x0并再次运行;一切都将正常运行、直到它执行复位而不是由调试器启动。  软复位关闭调试器、或者在调试器是否仍然连接的情况下上电复位。  那么它不会运行。  如果我重新连接到"正在运行"的目标并暂停调试器、可以看到:


    无论我是在仍通过 LaunchPad 调试器运行的同时对电源进行下电上电、断开电路板与 LaunchPad JTAG 的连接同时仍在首先运行、还是在断开电路板与 LaunchPad JTAG 的连接然后再下电上电之前停止调试会话、都会发生这种情况。  然后、我可以循环供电、直到我的脸变蓝、但电路板将无法运行。  我 每次都会在 WaitHibProdNext 插上

    如果我运行引导加载程序+应用程序、它会在调试器上运行、从引导加载程序开始并跳转到应用程序、我可以 CPU 将其在 IDE 中复位回应用程序启动、或将其重新启动回引导加载程序并再次运行;一切都会正常运行、直到执行复位(调试器未初始化)。  软复位关闭调试器、或者在调试器是否仍然连接的情况下上电复位。  那么它不会运行。  如果我重新连接到"正在运行"的目标并暂停调试器、可以看到:

    无论我是在仍通过 LaunchPad 调试器运行的同时对电源进行下电上电、断开电路板与 LaunchPad JTAG 的连接同时仍在首先运行、还是在断开电路板与 LaunchPad JTAG 的连接然后再下电上电之前停止调试会话、都会发生这种情况。  然后、我可以循环供电、直到我的脸变蓝、但电路板将无法运行。  我每次都会在 WaitHibProdNext 插上。

    我发现什么似乎是一个确定性的"解决方案"。  不是我等了几个小时、重置47次、我等了多长时间、或者重置了多少次、都不重要。  最后一次使它最终工作的是 我重置它的方式,我现在意识到这只是因为我断开我的笔记本电脑,并在会议后与它返回.  但是、我一直在重复它:

    那么、您知道什么 起作用呢?  使 LaunchPad 调试器通过 JTAG 连接到目标板、但从运行 CCS 的 PC 上拔下 LaunchPad USB 电缆、然后将其插回。  然后我的电路板就处于离场状态、我可以拔下 JTAG 插头、每次后续软复位和下电上电都会正常工作。

    您能解释一下吗?

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

    我可以想象一下、这与自定义硬件 JTAG 线路寄生效应相关、从而导致错误的 JTAG 状态、该状态会根据硬件配置和修改的电缆而变化。  这就是我建议进行硬件设计审查的原因(尤其是在 TI LaunchPad 上不发生该行为时)。

    此致、
    Ryan

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

    可能还需要研究修改 targetConfigs/CC2652R7.ccxml 文件的 Target Configuration -> XDS110 USB Debug Probe -> Connection 属性(如"JTAG TCLK Frequency"和"cJTAG Mode")是否会影响 JTAG 连接并改善连接行为。

    此致、
    Ryan