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.

[参考译文] TMS320F280041C:TMS320F280041C:内核加载后自动波特失败

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1303391/tms320f280041c-tms320f280041c-autobaud-fails-after-kernel-load

器件型号:TMS320F280041C
主题中讨论的其他器件:LAUNCHXL-F280049C、MOTORWARE、C2000WARE

我正在尝试让串行闪存编程器使用 F280041C 的自定义固件。 在刷写自定义固件之前、内核成功加载到器件上。 程序在尝试自动波特消息处停止。

我使用的命令如下:

serial_flash_programmer.exe -d f28004x -k C:\ti\c2000\C2000Ware_5_01_00_00\utilities\flash_programmers\serial_flash_programmer\f28004x_fw_upgrade_example\flashapi_ex2_sci_kernel.txt -a C:\ti\c2000\C2000Ware_5_01_00_00\utilities\flash_programmers\serial_flash_programmer\f28004x_fw_upgrade_example\led_ex1_blinky.txt -p COM5 -v

我尝试使用 LAUNCHXL-F280049C 来重现问题、但器件成功使用自动波特锁定、并且 DFU 过程运行正常。 我还可以刷写定制固件.txt 文件。

我在 CCS studio 中重新编译了 flashapi_ex2_sci_kernel 工程、该工程适用于 LAUNCHX-F280049C (CPU1_RAM 是唯一可用于 LAUNCHXL-F280049C 的构建目标)、但仍在我的硬件上以自动波特率崩溃。

我已检查器件是否正在引导至 SCI、SCI 引脚默认为28和29。 我认为如果内核不处于 SCI 引导模式、它就不能加载到器件中、这是正确的吗?

问题可能是由两个器件的闪存大小不同引起的吗? F280049C 为256KB、而 F280041C 为128KB。

这是否需要更改内核项目中的28004x_generic_ram_lnk.cmd?

SCI 端口和 SCI 引导模式设置的自定义硬件几乎与 LAUNCHXL-F280049C 相同、因此我不认为这是硬件问题、但我尚未完全排除这一问题。

谢谢。

詹姆斯

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

    您好、James:

    正确、 如果器件未处于 SCI 引导模式(具有 所需的 GPIO 引脚)、内核不会加载到器件中。  

    即使闪存大小不同、如果它卡在自动波特状态、则意味着在下载应用程序映像之前出现问题。 该器件的勘误表中有一部分提到在 SCI 期间、需要先清除 SCIHBAUD、然后再调用 SCI ROM 引导加载程序(TMS320F28004x 实时 MCU 器件勘误表(修订版 G))。 这是我可以研究的问题。

    应编辑内核项目的链接器 cmd 文件、以反映 F280041C 器件的闪存范围。

    谢谢。此致、

    查尔斯

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

    感谢您指出 SCI 引导的勘误表。 我认为这是导致我出现问题的最可能原因。 奇怪的是、即使是 SCI 引导加载程序勘误表、该过程也能在 LAUNCHXL-F280049C 上正常运行。

    关于闪存扇区、在 F280041C 上、我的应用仅占用 FLASH_BANK0的25%。 我已经从28004x_generic_ram_lnk.cmd 文件中删除了 BANK1的任何实例、即使我认为这还未导致问题。

    我不确定是否完全了解如何在调用 SCI ROM 引导加载程序之前清除 SCIHBAUD。 当在引导引脚保持为 SCI 状态的情况下执行器件复位时、SCI ROM 引导加载程序是否立即执行?

     串行闪存编程器将内核下载到器件后、它会等待内核引导、然后再再次尝试自动波特。 我们是否认为引导加载程序永远不会分支到内核? 内核似乎具有在尝试自动波特锁定之前将 SCIHBAUD 复位为零的代码。

    static inline void
    SCI_lockAutobaud(uint32_t base)
    {
        //
        // Check the arguments.
        //
        ASSERT(SCI_isBaseValid(base));
    
        //
        // Prime the baud register
        //
        HWREGH(base + SCI_O_HBAUD) = 0x0U;
        HWREGH(base + SCI_O_LBAUD) = 0x1U;
    
        //
        // Prepare for autobaud detection.
        // Set the CDC bit to enable autobaud detection and clear the ABD bit.
        //
        HWREGH(base + SCI_O_FFCT) |= SCI_FFCT_CDC;
        HWREGH(base + SCI_O_FFCT) |= SCI_FFCT_ABDCLR;
    
        //
        // Wait until we correctly read an 'A' or 'a' and lock
        //
        while((HWREGH(base + SCI_O_FFCT) & SCI_FFCT_ABD) != SCI_FFCT_ABD)
        {
        }
    
        //
        // After autobaud lock, clear the ABD and CDC bits
        //
        HWREGH(base + SCI_O_FFCT) |= SCI_FFCT_ABDCLR;
        HWREGH(base + SCI_O_FFCT) &= ~SCI_FFCT_CDC;
    }

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

    尊敬的 Charles:

    我设法解决了这个问题。 没有为我的器件正确设置 SCI 内核中的时钟频率。

    在 flashapi_ex2_sci_kernel.c 中、当它包含"device.h"时、它使用20 MHz XTAL 作为时钟源、而我的带有 F280041C 的硬件使用10 MHz 内部振荡器。 我必须使用 XDS110调试探针在我的硬件上调试内核应用、并通过代码逐步找出这一点。

    如果我在主应用程序中使用的"device.h"与当时钟频率设置已进行调整的相同、这可能不是问题、因为我在找到内核源的 C2000Ware 目录下有一个单独的 MotorWare 项目目录。

    此外、SCIHBAUD 寄存器勘误表似乎对任一电路板都不是问题。

    感谢您的帮助、希望这些信息可以对其他人有所帮助。

    以下是 flashapi_ex2_sci_kernel 工程的"device.h"时钟频率代码:

    //*****************************************************************************
    //
    // Defines related to clock configuration
    //
    //*****************************************************************************
    //
    // 20MHz XTAL on controlCARD and Launchpad. For use with SysCtl_getClock().
    //
    //#define DEVICE_OSCSRC_FREQ          20000000U
    
    // Internal OSC2 10MHz freq
    //
    #define DEVICE_OSCSRC_FREQ          10000000U
    
    //
    // Define to pass to SysCtl_setClock(). Will configure the clock as follows:
    // PLLSYSCLK = 20MHz (XTAL_OSC) * 10 (IMULT) * 1 (FMULT) / 2 (PLLCLK_BY_2)
    //
    //#define DEVICE_SETCLOCK_CFG         (SYSCTL_OSCSRC_XTAL | SYSCTL_IMULT(10) |  \
    //                                     SYSCTL_FMULT_NONE | SYSCTL_SYSDIV(2) |   \
    //                                     SYSCTL_PLL_ENABLE)
    
    // Use the internal OSC2 times 10 to achieve a 100MHz clock
    #define DEVICE_SETCLOCK_CFG         (SYSCTL_OSCSRC_OSC2 | SYSCTL_IMULT(20) |  \
                                         SYSCTL_FMULT_NONE | SYSCTL_SYSDIV(2) |   \
                                         SYSCTL_PLL_ENABLE)
    
    //
    // 100MHz SYSCLK frequency based on the above DEVICE_SETCLOCK_CFG. Update the
    // code below if a different clock configuration is used!
    //
    //#define DEVICE_SYSCLK_FREQ          ((DEVICE_OSCSRC_FREQ * 10 * 1) / 2)
    #define DEVICE_SYSCLK_FREQ          ((DEVICE_OSCSRC_FREQ * 20 * 1) / 2)
    
    //
    // 25MHz LSPCLK frequency based on the above DEVICE_SYSCLK_FREQ and a default
    // low speed peripheral clock divider of 4. Update the code below if a
    // different LSPCLK divider is used!
    //
    #define DEVICE_LSPCLK_FREQ          (DEVICE_SYSCLK_FREQ / 4)