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.

[参考译文] TMS320F28388D:TMS320F28388D:serial_flash_programmer 在&quot 处冻结;下载.hex"在 20MHz 定制板上冻结(在开发板上工作)

Guru**** 2885260 points

Other Parts Discussed in Thread: TMS320F28388D

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1626381/tms320f28388d-tms320f28388d-serial_flash_programmer-freezes-at-downloading-hex-on-20mhz-custom-board-works-on-dev-board

器件型号: TMS320F28388D

尊敬的 TI 团队:

我正在使用serial_flash_programmer.exe (SCI 引导/UART) 刷写 A TMS320F28388D 。 完全相同的应用.hex文件可以在 TI 开发板上完美地闪烁、但在我的定制板上冻结。

硬件差异:

  • TI 开发板:25MHz 晶体

  • 定制板:20MHz 晶体

具体问题:

  1. ROM 引导加载程序成功自动完成并下载内核。

  2. UART 菜单加载良好(我使用重建工程以修复波特率漂移)flash_kernel#define USE_20MHZ_XTAL

  3. 但是、当我按1 (DFU CPU1) 发送应用程序时、终端会在以下位置永久冻结: "Downloading led_ex1_blinky.hex to device..."

故障排除已完成:

  • 应用工程是为正确构建的 CPU1_FLASH (不是 RAM)。

  • .cmd所具有的位置 , ALIGN(8)已添加到所有> FLASH部分以防止 API 崩溃。

  • C2000 十六进制实用程序使用输出 ASCII 十六进制 sci8引导标志启用。

由于同一个.hex文件在开发板上工作但在此处挂起、还有什么可能导致闪存 API 专门冻结在定制板上? 当电荷泵激活时、这是否是压降/BOR 问题、或者是否有另一个隐藏的 PLL/闪存设置需要针对 20MHz 晶体进行调整?

谢谢!  image.png

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

    Satish、

    根本原因#1:闪存 API 时钟不匹配(最有可能是罪魁祸首)

    您已使用正确修复内核的波特率漂移USE_20MHZ_XTAL、但应用程序下载过程中的冻结表明闪存 API 本身存在更深层次的时钟相关问题。

    闪存 API 需要精确派生的时钟 (FRDCLK)

    闪存 API 需要一个范围内的专用读取时钟 (FRDCLK) 8–16.67MHz 、通过Fapi_Clock_Factor (FCF) 寄存器从 SYSCLKOUT 派生。 如果此分频器是针对基于 25MHz 的 SYSCLKOUT 计算的、但您的电路板运行基于 20MHz 的 SYSCLKOUT、则 FRDCLK 超出规格 — 并且闪存 API 将在编程操作期间静默冻结。

    闪存等待状态必须与实际的 SYSCLKOUT 相匹配

    闪存读取等待状态 (RWAIT) 必须根据 SYSCLKOUT 频率进行配置:

    CPUCLK 范围
    所需的 RWAIT
    ≤ó n 50MHz
    0
    50–100MHz
    1.
    100–150MHz
    2.
    150–200MHz
    3.

    RWAIT 字段复位为0xF (15) 和 必去之地 显式重新配置。 如果您的内核最初是以 25MHz 衍生时钟为目标构建的、并且 20MHz 的等待状态计算未完全更新、则闪存访问将违反时序并挂起。

    Flash_initModule()必须从 RAM 运行

    这是一项常见的关键要求。 Flash_initModule()必去之地 分配该.TI.ramfunc段并memcpy()在调用[3]之前通过将其从闪存复制到 RAM。 如果它在重新配置闪存等待状态时从闪存执行、则结果是未定义的行为、通常是冻结。

    验证链接器.cmd文件是否具有此模式:

    .TI.ramfunc:load = FLASHC、
    RUN = RAMLS0、
    LOAD_START (_RamfuncsLoadStart)、
    load_size (_RamfuncsLoadSize)、
    RUN_START (_RamfuncsRunStart)、
    对齐 (8)
    在您的启动代码中、在调用之前Flash_initModule()
    memcpy (&RamfuncsRunStart、&RamfuncsLoadStart、(uint32_t)&RamfuncsLoadSize);

    根本原因#2:USE_20MHZ_XTAL可能不会传播到应用程序项目

    USE_20MHZ_XTAL在中定义的 闪存内核 项目—但您是否已将其添加到 工程 效果呢?

    闪存内核会下载您的应用程序.hex并跳转到该应用程序。 当应用程序启动时、它会使用从头开始重新初始化 PLL 和系统时钟DEVICE_OSCSRC_FREQ。 如果应用程序项目仍默认为25000000U、则:
    • PLL 倍频器以错误的 VCO 频率为目标
    • SYSCLKOUT 不正确
    • 所有时钟派生计算(SCI 波特率、闪存等待状态、FRDCLK 分频器)都是错误的

    修复: USE_20MHZ_XTAL在中添加作为预定义编译器符号 Application“ CCS 工程设置 (Project→Properties→C2000 Compiler→Predefined Symbols)、而不仅仅是内核中。

    如果上述两个原因都不是、我们需要查看电路板上 F28P65x 的电源电压稳定性。  闪存编程有一个不错的瞬时电流要求、如果我们没有适当的去耦电容器、我们可能会在闪存编程期间电压下降、从而导致挂起。  但我先从上面的 2 开始、我们可以从这里开始。

    此致、

    Matthew

    此致、
    Matthew