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.

[参考译文] F28M35H52C:UART 在函数调用后停止工作

Guru**** 2538930 points
Other Parts Discussed in Thread: C2000WARE

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/965671/f28m35h52c-uart-stops-working-after-function-call

器件型号:F28M35H52C
主题中讨论的其他器件:C2000WARE

我一直在从事一个项目、在 M3和 C28主程序之上添加了一个引导加载程序。 我遇到的问题是通过 UART 与计算机上的另一个程序进行通信。  

当前、M3引导加载程序会启动并等待一段时间、以便通过 UART 从外部程序接收命令、或者超时、并通过函数指针跳转到另一个加载的主程序

当 M3引导加载程序收到命令时、它会输入条件并通过 UART 响应外部程序

此部件工作正常

然后、通过 memcpy 将一些函数移动到从 RAM 执行、并通过函数调用加载新的主程序

一旦进入函数调用、UART 就不再像在引导加载程序中继续与外部程序通信那样输出到示波器。 UART 寄存器看上去一切正常、并且似乎已打开所有正确的位、以显示 UART 处于启用状态。 不过、引导加载程序或函数调用中的 UARTDR 在转至 UART TX 函数时不会显示寄存器中的任何内容。  

我发现的其他一些问题可能与此相关  

  • SCB_FAULT_STAT 寄存器上的模糊总线错误、一旦我在 ACTLR 寄存器上打开写高速缓存、就会显示一个精确的总线错误、该错误的验证地址为0x4000000C、即 WDT0中断清除。 这会升级为硬故障、并使我进入故障 ISR 以永久循环。
  • 当我向被调用的函数添加一个额外的 while (1)、以将新程序加载到垃圾邮件 UART 写入时、它基本上会导致程序在该点之前不再正常运行、尽管函数调用处于某个条件下、在外部程序发送之前不应输入该条件 它的命令。  

我希望这是足够的信息、请随意询问您认为有助于解决此问题的任何其他事项。  

谢谢、  

Steven

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

    您好、Steve、

    [引用用户="Steven Buuck"]当转过 UART TX 函数时,引导加载程序或函数调用中的 UARTDR 都不会显示寄存器中的任何内容。

    您的意思是 UARTDR 寄存器中没有错误位被置位、还是数据位为0?  

    [引用 USER="Steven Buuck"> SCB_FAULT_STAT 寄存器上的模糊总线错误、一旦我在 ACTLR 寄存器上打开写缓存、就会发现一个精确的总线错误、该错误的验证地址为0x4000000C、即 WDT0中断清除。 这将升级为硬故障、并使我进入故障 ISR 以永久循环。

    这是在您的新主程序期间发生的、还是在您整个过程中的哪个时间点进入故障 ISR?

    此致、

    Marlyn

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

    UARTDR 中的所有位都为零、我认为这是用于数据的。 不过、其他 UART 寄存器似乎没有错误。  

    这似乎在调用看门狗函数时发生。 最值得注意的是 UART 写入函数、该函数在 UART 忙时向看门狗提供数据。 在引导加载程序中、我只是从 UART 写入中删除了该函数调用、并且能够使 UART 函数正常运行。

    这不能解决何时调用加载程序函数的问题。 至于1、我不认为可以从加载程序中删除看门狗功能;第二、 当我从加载程序函数文件中的本地 UART 写入中删除了相同的看门狗功能时、它无法解决 UART 写入未显示在示波器上的问题。  

    此外、对于我在最初帖子中的以下陈述:

    然后、通过 memcpy 将一些函数移动到从 RAM 执行、并通过函数调用加载新的主程序

    我没有提到移动到 RAM 的函数包括:

    • 加载程序函数所在文件中 UART 写入的单独本地实例
    • 在 UART 发生故障时进入的加载程序函数

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

    Steven、

    当您说一些函数被复制到 RAM 以运行时。 假设您已将这些子段的链接器 cmd 文件更新为如下所示:

    func:{}负载= CMBANK0_SECTOR0 | CMBANK0_SECTOR1、
    run = SRAM、
    Load_start (funcLoadStart)、
    load_size (funcLoadSize)、
    load_end (funcLoadEnd)、
    run_start (funcRunStart)、
    run_size (funcRunSize)、
    run_end (funcRunEnd)

    在主函数中、您使用 memcpy (&funcRunStart、&funcLoadStart、(size_t)&funcLoadSize);

    您的初始查询指出您存在永久循环的硬故障。 由于您已启用看门狗、您是否已更新 NMI ISR 以适当处理看门狗溢出。 如果软件无法处理 NMI、NMIWD 模块将触发 CM 复位。

    您可以尝试在禁用看门狗的情况下运行程序(sysctl_disableWatchdog();)一次,以查看您是否遇到相同的问题。 我怀疑它不仅是 UART、而且是整个程序卡在 NMI ISR 中。

    您还可以参阅 C2000Ware 中的 watchdog_ex1_NMI_handling ex (C2000Ware_3_03_00_00\driverlib\f2838x\examples\cm\watchdog)

    谢谢、

    Yashwant  

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

    您好、Yashwant、  

    我在 CMD 文件中有一组类似的指令。

    第{

    函数:load = sector_A、

            运行= C3 load_start (funcsLoadStart)、

        load_size (funcsLoadSize)、

        RUN_START (funcsRunStart)

        对齐(0x10)

    并使用相同的 memcpy:


    memcpy (&funcsRunStart、&funcsLoadStart、(size_t)&funcsLoadSize);


    确实、对于看起来似乎是看门狗错误的情况、我最终在 ISR 中进入了一个无限循环。 我不会在 NMI ISR 中结束
    但在中

    //
    //这是处理器收到故障时调用的代码
    //中断。 这只是进入一个无限循环、从而保持系统状态
    //供调试器检查。
    //
    静态空
    FaultISR (void){

    //输入无限循环。
    while (1)


    NMI SR 中断当前也设置为上述 ISR、当前只循环无限。

    我尝试使用禁用看门狗  

    SysCtlPeripheralDisable (SYSCTL_Periph_WDOG1);
    SysCtlPeripheralDisable (SYSCTL_Periph_WDOG0);  

     这仍然无法解决 UART 或故障 ISR 循环中的结束问题

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

    Steven、

    我只是想把下面的问题缩小一点。

    发生故障时、您可以分享 SCB 寄存器状态的屏幕截图。

    一旦程序处于故障 ISR 中、您可以检查堆栈指针寄存器值。 转到 CCS 内存浏览器中的 SP 地址。 在 Stack 中检查最新的“指令”地址。

    转到 CCS 的"Disassembly"视图中的该指令。 在这里、您可以看到导致错误的代码行。  可能是无效的存储器访问。 尝试注释该行并重新运行程序。

    此致、

    Yashwant

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

    您好、Yashwant、  

    在进入具有写缓存关闭功能的故障 ISR 后、SCB 寄存器如下图所示。 在禁用写入缓存之前、它会给我一个不精确的总线错误或者在 SCB_FAULT_ADDR 为0xE000EDF8的 SCB_FAULT_STAT 中提供0x00000400、我认为这是一个已验证的地址

    至于 SP  

    和导致故障的汇编代码行  

    我将进入该阶段  

    在这一点上、应将1写入0x4000000C 以清除中断、而是将我发送到故障 ISR 的200078AE 行。  

    谢谢

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

    Steven、

             许多主题专家正在休假、他们需要一两周才能回来。 感谢您在过渡期间的耐心。  

    话虽如此、如果这是软件问题、我们的支持/调试能力将非常有限。