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.

[参考译文] TMS320F28P550SJ:M0/M1初始化在 POR 后失败

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

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1503274/tms320f28p550sj-m0-m1-initialization-fails-after-por

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

工具/软件:

尊敬的 champs:

用户需要在 main ()之前初始化 RAM、如 M0/M1。

他们曾使用此类 F28003x 进行编码、并且确实有效。

// By default RAM is only initialized to zero by power-on reset, but not by warm reset
// _system_pre_init() is to initialize RAM to zero on all reset including warm reset. TI RTS library will call _system_pre_init() before main().
int _system_pre_init(void)
{
    EALLOW;

    *(volatile int *)(MEMCFG_BASE + MEMCFG_O_DXINIT)  = 0x0003;               // RAM INIT FOR M0/M1 Memory
    while(!(*(volatile int *) (MEMCFG_BASE + MEMCFG_O_DXINITDONE) == 0x3));   // Wait for InitDone Status

    EDIS;

    return 1;
}

但现在、它在 F28P550SJ9x 上发生上电复位(POR)(首次上电)后失败。

"失败"表示它在 POR 后无法运行到 main()。

请注意、我们 还确认用户可以正常使用

1、仅在 POR 或由 nXRS 复位后初始化 LSx RAM 和 GSx RAM。

2.仅 在 由 nXRS 复位后初始化 M0/M1 RAM。

也就是说、仅当用户在首次上电后初始化 M0/M1时才会失败。

这是否与 F28P55x 上 POR 的 ROM 引导代码有关?

在 F280039C 上未观察到此问题、因为用户在此处使用相同的代码。

因此、请您支持我们如何处理这一问题?

目标是在 main ()之前初始化 RAM、无论它是 POR 还是由 nXRS 复位。

顺便说一下、 我无法在 CCS 上重现此问题、只能在首次上电后从闪存独立运行时看到它。 是否可以在 POR 后使用 CCS 模拟闪存启动?

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

    尊敬的 champs:

    请确认您是否可以在您这边重现此内容。

    我的环境:

    CCS 12.8.1

    C2000ware V5.04

    C:\ti\c2000\C2000Ware_5_04_00_00\driverlib\f28p55x\examples\led

    TI F28P55x 控制卡(LaunchPad 可以)

    在 main 之前添加上述代码、或将文件替换为以下代码。

    使用独立(闪存)模式。

    断开 CCS 并从闪存运行它、在首次上电时观察此情况。 您应该会看到 LED 不闪烁。

    nXRS 复位后、LED 可能再次闪烁。

    e2e.ti.com/.../5875.led_5F00_ex1_5F00_blinky.c

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

    与003x 相比、DXINITDONE 中的 P55x 中添加了另一个变量。 这用于 pievect ram 初始化。 在 while 循环中的_system_pre_init 代码中、检查是否为0x13而不是0x3。 请注意、引导 ROM 仅在 POR 时进行 RAM 初始化。 因此、当您执行 xrsn 时、Dxinitdone 中的所有值都会复位为零 、并且代码控件移回_system_pre_init、此时应用程序代码  仅触发 M1和 M0的初始化。 因此、while 循环与 DONE 值0x3匹配

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

    尊敬的 Pawan:

    我进行了测试、结果正常工作。

    感谢您的支持。

    // By default RAM is only initialized to zero by power-on reset, but not by warm reset
    // _system_pre_init() is to initialize RAM to zero on all reset including warm reset. TI RTS library will call _system_pre_init() before main().
    int _system_pre_init(void)
    {
        EALLOW;
    
        *(volatile int *)(MEMCFG_BASE + MEMCFG_O_DXINIT)  = 0x0013;               // RAM INIT FOR M0/M1 Memory
        while(!(*(volatile int *) (MEMCFG_BASE + MEMCFG_O_DXINITDONE) == 0x13));   // Wait for InitDone Status
    
        EDIS;
    
        return 1;
    }