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.

[参考译文] EK-TM4C123GXL:由应用中断和复位控制进行软复位

Guru**** 2446720 points


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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/631176/ek-tm4c123gxl-softreset-by-application-interrupt-and-reset-control

器件型号:EK-TM4C123GXL

如果应用程序中断和复位控制寄存器发出软复位信号、芯片有时会挂起。

顺便说一下、我修改了 Linux 内核代码"drivers/USB/serial/USB-serial-simple.c"、以便 USB ICDI 显示为 USB UART 串行、并且我使用此接口来调试和刷写 TM4C 套件。 我认为这不应该与软复位失败有任何关系。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    尊敬的 Dashi:
    发生挂起时、您正在运行什么程序? 当它挂起时、调试器仍然能够连接到 MCU? 如果您加载了不同的程序、您是否会看到相同的挂起?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    如果我中断对其进行调试并发出继续命令、则重置将继续。 在调试时,它在两个位置中的任何一个停止:复位矢量,或另一个地址0x01..... 如果需要、我可以获取准确的地址。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    尊敬的 Dashi:
    我想您之前的问题没有得到解答。 如果代码在复位矢量处停止、那么在您发出软件复位时不是您所期望的那样? 如果地址为0x01xxxxxx、则执行 TivaWare 库代码。 如果您单步执行、程序计数器是否继续更改?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    该程序是由我自己进行的测试。 可以  通过命令"git clone"从下载

    如果复位操作被卡住、我认为它将永远停止、因为如果复位成功、它将在闪烁的情况下重新启动。  但是当它挂起时、我可以使用 GNU gdb 中断它、当我发出 Continue 命令时、它将重新启动。

    我猜0x01xxx 位于 ROM 函数"ROM_SysCtlReset"、因此我将复位代码复制到我的程序中:

    静态内联 void tm4c_reset (void)

       uint32_t v;

       V = HWREG (NVIC_APINT)和0x0FFFF;
       HWREG (NVIC_APINT)= v|0x05fa0000|NVIC_APINT_SYSRESETREQ;
       while (1)
          ;

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

    如果电路板在上电后无法通过软复位进行复位、它将始终在软复位时挂起。 gdb 会话如下所示:

    (gdb)目标远程/dev/ttyUSB0
    使用/dev/ttyUSB0进行远程调试
    0x01001024英寸 ()
    (gdb) bt
    #0 0x01001024输入?? ()
    (gdb) c
    继续。
    ^C
    程序已停止。
    ResetISR 中的0x00000288 ()
    (gdb) c
    继续。

    (gdb) c
    继续。
    ^C
    程序已停止。
    ResetISR 中的0x00000288 ()
    (gdb)信息寄存器
    R0            0x0   0
    R1            0x0   0
    R2            0x0   0
    R3            0x0   0
    R4            0x0   0
    R5            0x0   0
    R6            0x0   0
    R7            0x0   0
    R8            0x0   0
    R9            0x0   0
    R10           0x0   0
    R11           0x0   0
    R12           0x0   0
    SP            0x20000800   0x20000800
    LR            0xffffff-1    
    PC            0x288   0x288
    Xpsr          0x1000000   16777216
    (gdb)

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    尊敬的 Dashi:
    您刚才提到您使用 gdb 作为调试器、对吧? 我不熟悉 gdb。 您是否尝试使用 CCS 调试相同的程序? 在 gdb 中、是否可能在复位矢量处有默认断点设置?

    BTW、您可以在此处附加项目吗?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Charles、

    我认为调试器无关紧要。 我只会在软复位挂起时启动调试器以中断程序。 软复位有时会成功。 如果它在上电后成功、它将始终成功、直到拔下电源。

    e2e.ti.com/.../tm4c_2D00_master.zip

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    尊敬的 Dashi:
    我在周四之前不在办公室。 在我回来之前、我无法查看您的项目。 我现在只有一台平板电脑设备。

    生成软件复位时、调试器是否连接到 MCU? 调试器未连接到 MCU 时、您是否可以尝试运行代码?

    您能否尝试以下任一方法来生成软件复位、这是否会起作用?

    调用 SysCtlReset() API。
    2. HWREG (NVIC_APINT)= NVIC_APINT_VECTKEY | NVIC_APINT_SYSRESETREQ;
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Charles、

    我怀疑此问题与 Linux USB 串行-简单驱动程序有关。 连接 ICDI 时、驱动程序可能会向它写入内容。 如果我可以确认、我将写一个回复。