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.

[参考译文] TMS320F28069:创建一个闪存的准只读部分

Guru**** 2538930 points


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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/600595/tms320f28069-creating-a-quasi-read-only-portion-of-flash

器件型号:TMS320F28069

因此、我目前有代码、允许我将新固件引导加载到器件上。 此代码就在我的主函数的顶部、因此每次电路板上电时、它都会运行此代码、等待 UART 上出现特殊字符。 如果接收到该字符、则会调用 SciBoot 函数、我认为该函数完全由 TI 提供。 如果它在几秒钟内没有收到此字符、则继续运行常规应用程序代码。 这对我们来说很好、但是它不是欺骗、这意味着我可以使它失败、使板在通过 JTAG 端口加载新代码之前不再可用。 假设我在通过 UART 加载固件的同时切断电路板的电源、然后再次上电、这会导致器件无法正常工作。  

因此、我的最终目标是让该小段代码(包括 SciBoot)(我将所有这些代码都称为引导加载程序代码)在电路板通电时被称为所有时间、即使引导加载因某种原因中断也是如此。 我想如何实现这一点、就是让引导加载程序代码位于闪存的扇区 A 中、然后在我执行引导加载过程时、它只擦除扇区 B-H、然后将固件仅加载到这些扇区。 我认为这意味着我必须在 Code Composer 中以某种方式指定这些位置、然后在引导加载程序代码的末尾(当它超时未接收到特殊字符时)、它将跳转到应用代码应该所在的扇区 B 的开头。 这将使扇区 A 只能通过 JTAG 写入、从而使扇区成为只读的...

再说一次、这就是我认为可以实现的方法、但如果有更好/更简单的解决方案、我很适合! 感谢您对此提供的任何帮助!

Greg

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

    Greg、

    是的、这是一般的想法! 查看这个 主题、它是关于 C2000串行闪存编程器、它可以满足您的一切需求。

    此致、

    Cody

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

    很抱歉、我已经回答了一段时间... 我们在工作中遇到了一些问题。

    无论如何,我相信我们现在正在这样做,但我可以使它的失败变得相当容易… 但我们可能做得不对。 那么、这里是我的设置。

    1) GPIO37和34都设置为高电平(因此在 Get 模式下)。 另请注意、这些值在电路板上是固定的。 用户无法将值从低电平更改为高电平、反之亦然。

    2)在 main 中、我们将执行代码的以下部分、该部分执行自动波特、然后等待电路板和计算机准备就绪(通过发送/接收特殊字符)、然后在所有准备就绪时调用 SciBoot()函数。 如果未接收到字符、那么我们只需使用闪存中的任何应用程序代码来继续运行

    SysCtrlRegs.WDCR = 0x0068;//禁用看门狗。
    
    Status = CsmUnlock_Bootloader ();
    
    //Status = 0x55;//跳过引导加载程序
    if (Status = STATUS_SUCCESS)
    {
    
    // SCI_Boot SCI_Init_Bootloader (
    )之前的初始化;
    
    //执行自动波特。
    autoBaudStatus = SCI_Autobaud_Bootloader();
    
    if (autobaudStatus = 0)
    {
    byteData = 0x0000;
    
    //等待插入。 如果在特定的时间/
    /时间周期内收到、则转至引导 ROM 中的 SCI_Boot。
    
    超时= 0;
    while ((SciaRegs.SCIRXST.bit.RXRDY!= 1)&(timeout = 0)
    ){
    for (j=0;(j =时间周期){timeout = 1;}
    如果
    
    (timeout = 0)
    {
    byteData = SciaRegs.SCIRXBUF.bit.RXDT;
    
    //如果已收到插入码,请转至引导 ROM 中的 SCI_Boot。
    if (byteData = 0x005E)
    {
    SciBoot();
    asm (" EDIS");
    }
    
    }
    } 

    这对我们来说是可行的、但 它不是欺骗。 如果在固件开始加载时关闭器件电源、或者如果固件加载在任何时间点卡住、那么我的器件在我通过 JTAG 再次对其进行编程之前都是无用的。 我想要的是、无论发生什么情况、我都可以通电、擦除闪存中的任何内容、然后编写新代码、同时仅保留此引导加载程序代码。

    所有这些都有道理吗? 请告诉我、感谢您为此提供的所有帮助!

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

    Gregory、

    对于非易失性解决方案、您需要将闪存的一个扇区专用于引导加载程序、该扇区只能通过 JTAG 编程进行擦除。 某些常量也可能保留在该扇区中... 由于 此扇区永远不会在您的器件每次引导时被擦除、因此即使器件刚加载失败、它也应运行引导加载程序。  这可防止出现代码错误、通信中断、功率损耗等问题。

    此致、
    Cody

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

    Cody、

    是的、这正是我所期望的。 我猜我会通过使用 pragma 来实现这一点吗? 在这里、我将为两个项目拥有相同的链接器文件、一个包含引导加载程序代码和任何表或常量、另一个包含正在运行的应用程序代码。

    我假设在引导加载程序工程中、我将在扇区 A 的 pragma 中定义我的主函数、 在主函数的末尾、对我的应用程序代码执行函数调用、该代码将位于屏区 B-H 中的另一 pragma 中(在第一个项目中、可能只是空白的 while 循环或其他内容)。  

    对于我的另一个项目、我的应用代码也将在相同的 pragma 中定义在 B-H 扇区中、然后只需要我需要的任何应用代码。

    这是正确的吗? 然后、当我在串行引导加载时将内核加载到电路板中时、我只需将扇区 B-H 删除、而将扇区 A 单独删除... 有什么类似的东西?

    可能没有这样的示例吗? 感谢您的帮助!

    -Greg