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.

[参考译文] CCS/TMS320F28075:先前工作的项目现在卡在引导 ROM 中

Guru**** 2599385 points


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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/675599/ccs-tms320f28075-previously-working-project-now-gets-stuck-in-boot-rom

器件型号:TMS320F28075

工具/软件:Code Composer Studio

我不确定发生了什么。

我有一个从处理器启动的引导加载程序、它将跳转到主程序。

这项工作已经进行了很长时间。   

突然、我的引导加载程序不会在加电或重新引导后启动。  从调试器可以看到、在0x3fee00重新启动后、它似乎卡住了、然后转至0x3fee04、然后回路至0x3fee00。

我的 OTP 从未被写入、并且仍然是原始值(全部为1)(这来自 Z1和 Z2)。  我的引导引脚 GPIO72和 GPIO84都是高电平(它们上有一个100K 上拉电阻)。

我似乎无法让调试器与引导 ROM 源代码连接、原因之一是我无法再找到旧编译器(能否为我提供指向旧版编译器页面的链接、我似乎无法再找到它?)。

引导加载程序未更改、它在具有相同处理器的另一个电路板上启动并正常工作。  我还没有机会看到它是否可以在另一个电路板上工作。

您能告诉我为什么这会卡住并跳转到闪存、或者帮助我连接和调试调试调试器中可能发生的情况吗?

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

    GPIO72被保持在低电平。 我移除了它连接到的 CAN 收发器(当我开始使用调试器时可以工作)。 我仍然将100K 连接到引脚和3.3V。

    似乎处理器将此引脚保持在低电平。

    我已经尝试调节代码、在重启之前将此引脚强制为高电平(切换至 GPIO 并强制为高电平)、但一旦启动 ROM 启动、它会再次将其拉低... 这会强制其进入 SCI 引导模式(与引导 ROM 源中的映射文件匹配)

    再说一次、它以前工作过、现在在其他电路板上工作、现在它不工作。 在某种程度上、这可能会损坏该引脚上的处理器吗? 如果是、为什么它仍然作为 CAN 收发器工作? 我的上拉电阻在100K 时是否太弱?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    再进一步……  将100K 上拉电阻更改为1K...  没有骰子...  仍然很低(不是很零)、大约3mA 以上会将其拉低。

    此时、唯一的选择是覆盖默认值并实际写入 OTP 引导控制位。

    处理器现在在复位和断电/开启时启动闪存。  我仍然不知道、也不清楚为什么在引导 ROM 启动时 GPIO72会拉低。

    如果不是、我向引导加载程序添加了一个检查、以验证 OTP 是否为正确的位。  它将其写入强制闪存的值。

    #pragma CODE_SECTION (Flash_Setup_OTP、ramFuncSection);
    UINT16 Flash_Setup_OTP (void)
    {
    //设置 OTP 以强制从闪存加载引导加载、因为我们不使用 TI 的引导加载程序:
    
    UINT32 tempBoot;
    //将 GPIO84设置为引导选择引脚1 (通常分配给 CANB 的 GPIO72):
    < GPIO32
    引脚=引导< GPIO85;//将 GPIO84设置为引导引脚
    tempBoot +=(UINT32) 85 << 16;
    //将引导模式设置为获取/等待(始终引导至闪存或在仿真器连接时等待):
    //0xFF 被用作定义的"其他"、这意味着闪存/等待、并且意味着此值可在以后被覆盖:
    tempBoot +=(UINT32) 0xFF << 8;
    //设置
    tempBoot +=(UINT32)
    
    
    uint16 Buffer[2];//数据值缓冲
    区缓冲区[0]=(uint16)(tempBoot & 0xFFFF);
    Buffer[1]=(uint16)(tempBoot >> 16);
    
    volatile Uint32 Address = DCSM_Z2_BOOTCTRL_ADDRESS;
    
    //查看是否已写入:
    if (Dcsm_Z1t/totrfb)
    
    
    
    
    
    ;//
    将 temp1tosl_otr1t/taturt1t1t.trl 写入:// tosl_t/temp_totr1totr1t/temp_trap_time-totr1t&trl;//检查 temp_totr1totr1totrf_trap_time-totr1tos/t.tosr1t
    oReturnCheck = Fapi_issueProgrammingCommand ((UINT32 *) Address、&Buffer[0]、2、0、0、 fapi_AutoEccGeneration);
    
    while (fapi_checkFsmForReady ()== fapi_Status_FsmBusy);
    EDIS;
    
    if (oReturnCheck!= Fapi_Status_Success)
    {
    //
    检查闪存 API 文档中是否存在可能的错误
    //
    返回 false;
    }
    
    返回 true;
    }
    
    返回 true;
    
    } 

    注意: 这也可以在 Z1中完成、但如果您编写这两个文件、则可以使用。  如果我想稍后更改 Z1、我仍然可以使用 Z1、并且我已经编写了 Z2。

    对于希望写入这些值的人来说、这一过程是半复杂的。  写入这些值需要 CSM 解锁(在这个函数之前完成)、闪存 API 被初始化(在这个函数之前也完成)、然后写入这些值、就像它们是闪存一样、你正在将程序代码写入(显示)。  我认为闪存的这个部分不需要 ECC 自动生成选项、但它可以处理、所以我将其保留。

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

    很高兴您找到了适合您的解决方案。 100k 应该已经足够了。 除了作为引导加载程序的一部分、引导代码不会配置任何引脚、因此器件可能已损坏。

    此致
    Chris