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.

[参考译文] CC1311P3:使用引导加载程序中的计时器时发生编程故障

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

https://e2e.ti.com/support/wireless-connectivity/sub-1-ghz-group/sub-1-ghz/f/sub-1-ghz-forum/1515155/cc1311p3-program-fault-when-using-timer-in-bootloader

器件型号:CC1311P3

工具/软件:

我正在 CC1311P3上实现引导加载程序。  我使用 Timer0作为计时器来触发 LED 闪烁、以便知道引导加载程序(或应用程序)何时运行。  我注意到、当我使用计时器并跳转到应用程序时、系统转至故障处理程序。  即使在跳转到应用程序之前在引导加载程序中调用 Timer_STOP()和 Timer_Close()、也会发生这种情况。  如果我删除引导加载程序中的 Timer_*调用、则应用程序似乎可以正常运行。

可以修复此问题、以便使用引导加载程序中的计时器吗?

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

    您好、David:

    您是从我们的一个示例开始的吗? 此外、您使用的是什么 SDK 版本、以及什么编译器?

    此致、

    Arthur

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

    引导加载程序和应用程序基本上都完成了。  我从示例开始、但它们现在比它们更复杂一些。

    simplelink_cc13xx_cc26xx_sdk_7_41_00_17

    TI-CGT-armllvm_4.0.2.LTS (在 ccs2011下)

    我使用引导加载程序工程生成了 CCFG。  引导加载程序存储在 0x00050000、CCFG 已将闪存矢量表的地址设置为 0x00050000。

    我使用我在论坛上找到的此函数跳转到应用程序(加载到0x2000中、有一个图像标头存储在0x0中):

    void jumpToPrgEntry(uint32_t *vectorTable)
    {   /* Reset the SP with the value stored at vector_table[0] */
        __asm volatile ("MSR msp, %0" : : "r" (vectorTable[0]) : );
    
        /* Jump to the Reset Handler address at vector_table[1] */
        ( (void (*)(void)) (*(vectorTable + 1)) )();
    }
    
    ...
    
    // Jump to app
    jumpToPrgEntry((uint32_t*)0x2000);

    我认为有趣的是、我们不需要像在其他 CPU 上那样在 NVIC 中设置 VTOR。  可能是因为 ROM 处理了许多 IRQ?

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

    David、

    您能共享核心寄存器的转储吗? 我想看看 你们看到了什么样的例外情况。

    此外、您是否在引导加载程序中使用 TI-RTOS 或根本没有 RTOS?

    在我们的 mcuboot 示例中、请注意、我们还会重置栈指针:

    此致、

    Arthur

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

    我使用 No RTOS。  调用 Timer_STOP()后 FaultISR 内的寄存器的屏幕截图。

    调用 Timer_STOP()时出现故障。  如果我注释掉 Timer_STOP()和 Timer_Close()、引导加载程序会继续跳转函数、但在应用程序中会出现故障。  计时器 API 中似乎出现问题。

    关于跳转代码、您引用的汇编代码和我的 C 代码看起来是等效的。

    关于 VTOR、每个映像(引导加载程序和应用程序)都应有自己的矢量表。  通常、您将 VTOR 指向要运行的映像的表、或在映像的初始化代码期间对其进行设置。  仅设置 MSP/PC 与设置 VTOR 不同。  在这种情况下、我必须假设(a) SimpleLink / ROM 驱动程序初始化代码正在处理 VTOR、或(B)向量在 ROM 代码中设置为地址(因此、应用程序与引导加载程序的地址不会发生变化)。  这两个中的任何一个都正确吗?

    显然、IRQ 适用于引导加载程序和 APP 中的计时器和 UART、因此我必须假设矢量指向 ROM 或其他通用处理程序。  我想这会让问题回到计时器 API 问题上来。

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

    此外、CPU_SCS 可能有所帮助:

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

    我把它弄清楚了。  我需要为 Timer_CLOSE ()和 Timer_STOP ()提供 Timer_Handle 句柄。  我提供了 CONFIG_TIMER_0、这只是一个索引、而不是实际句柄。  可以关闭该窗口。