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.

[参考译文] MSP430FR5969:具有双映像和回退功能的定制 I2C 引导加载程序

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/727021/msp430fr5969-custom-i2c-bootloader-with-dual-images-and-fallback-capability

器件型号:MSP430FR5969

我将开始为 msp430fr5969开发定制 I2C 引导加载程序。 (MSP430FR59691不适合我、因为我需要一条直接通往防辐射系统的路径、并且我需要双图像支持)。

我的最终目标是具有两个图像空间、并在启动时检查当前图像的 CRC。 如果 CRC 失败、则返回到备用映像。 如果备用映像 CRC 失败、请返回到引导加载程序、然后等待新映像。 我还使用信息内存来存储系统信息、当加载新映像时、这些信息不会被覆盖。  

当我查看 MSP430FRBOOT 时、有一个使用 UART 或 SPI 的 msp430fr5969双映像示例。 我一直在查看链接器命令文件、但其中没有指出有两个映像、因此映像似乎共享一些空间、但我不确定如何管理这些映像。

我希望这两个映像尽可能的独立、我在其他系统上看到过这种情况、但这可能需要不同的闪存/闪存组? 我所见的系统在主存储器中确实有 NAND 闪存、我认为引导加载程序本身有一个单独的 NOR 闪存。

在链接器文件或我的代码中、是否建议对自定义引导加载程序和两个应用程序的存储器空间进行强分区? 我是否会为具有内置存储器的器件进行过载?

谢谢、

Paul

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

    您好 Paul

    这是我们双映像的工作流程、如下所示、您可以在用户指南中找到它    

    这与您的描述"检查当前图像的 CRC "类似。 如果 CRC 失败、则返回到备用映像。 如果备用映像 CRC 失败、请返回到引导加载程序、然后等待新映像"、并且不会将降压加载区域与应用程序区域共享。 您可以将向下加载区域显示为应用2。  

    此致

    Gary

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

    感谢 Gary、

    我最初查看的链接器命令文件不正确、在双映像中、我看到了从0x10000到0x13FFF 的单独下载区域。  

    使用 MPU 帮助控制对不同区域的访问似乎是代码的有效项目符号保护。 我可以清楚地控制对三个存储器范围和信息存储器的读/写/执行访问。

    这似乎是一种好方法吗?

    存储器区域:  

    INFOA:origin = 0x1980,length = 0x0080
    INFOB:origin = 0x1900,length = 0x0080
    INFOC:origin = 0x1880,length = 0x0080
    INFOD:origin = 0x1800,length = 0x0080

    Boot_Start = 0x4400;/*启动引导加载程序区域*
    Boot_End = 0x4FFF;//对于引导加载程序为3k *
    _appl_Start = 0x5000;/*应用程序空间开始*/
    _appl_end = 0xEFFF;/* 40k 存储器*
    _DOWN_Start = 0x10000;//下载区域*/
    _DOWN_END = 0x13FFF;/*16k 的下载区域*/

    存储器控制的初始化:

    void _system_pre_init (void)

    //将信息存储器设置为写保护、执行保护、读取启用
    //在中创建句段边框:引导加载程序、应用程序、下载
    //防止引导加载程序被写入,允许执行和读取  
    //允许应用程序写入、执行和读取

    //protect download from write、execute、read
    //启用 MPU

    在 JmpToBootLoader()中,第一个操作是更改引导加载程序和下载区域的 rwx 权限

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

    我开始意识到这里有多少细节我以前没有完全掌握。

    如果我了解 MSP430FRBoot 示例、它实际上会将引导加载程序和应用程序编译为单独的项目。 在确保引导加载程序和应用程序存储器配置兼容方面、这似乎有点风险。 我想这也可以通过构建配置来实现... 请原谅我的学习曲线!

    是否有应用手册或 wiki 条目可帮助我了解以下内容? 如何生成不包含所有可能的存储器空间的编译输出文件? (如果我的引导加载程序代码覆盖了应用程序空间、这是可以的、但我需要我的应用程序输出文件仅是应用程序空间的大小!)

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

    我们在演示中使用了 MPU 来保护代码。 因此、您可以参考使用详细信息的演示。
    对于"在确保引导加载程序和应用程序存储器配置兼容性方面、这似乎有点风险。" ,因为引导加载程序和应用程序的链接文件是使用脚本“MSP430FRBoot_linkergen.pl”同时生成的。 因此存储器配置是兼容的。 有关脚本的使用、请参阅我之前发送给您的文档的第4.3.3节。

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

    您好、Gary、

    非常感谢您的帮助... 我还是一个新手、有些细节让我感到困惑。 假设我有一个完整的引导加载程序、如何使用 CCS 为应用生成代码文件、仅包含我要更新的存储器空间? 我一直在查看 MSP430FRBoot 示例随附的应用、但没有看到这方面的任何迹象。 似乎链接器命令文件中有一些变量可用于在存储器中查找应用程序 main(),但我在代码中的任何位置都看不到它们被引用... 看起来.out 文件也可能包含整个存储器映射、那么存储器映射的纯应用部分如何从该文件中提取以用于更新过程?

    谢谢、

    Paul

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

    大家好、Gary、我相信我会开始把事情拼凑在一起。 请告诉我、我是否在这里正确设置了事件序列:

    1. 构建目标应用、并使用 msp430hex 实用程序将.out 文件转换为.txt 文件。
    2. .txt 文件通过 perl 脚本运行、该脚本对其进行解析并仅将应用程序代码导出到特殊的.c 文件中。
    3. 该.c 文件包含在主机引导加载程序项目中。 构建此项目后、应用程序将保存为在请求时发送的字节数组。

    因此、对于不依赖 MSP430主机提供映像的更通用方法、我们主要修改步骤3、但步骤2可能稍有不同、以生成主机设计接受的任何文件格式。 是这样吗?

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

    您好 Paul

    以下是评论:

    使用 MSP430FRBoot_linkergen.pl 生成 CMD 文件(现在仅支持 CCS)、一个用于应用项目、一个用于引导项目。

    构建目标应用、并使用 msp430hex 实用程序将.out 文件转换为.txt 文件。

    2.txt 文件通过 perl 脚本运行、该脚本对其进行解析并仅将应用程序代码导出到特殊的.c 文件中。

    该.c 文件包含在主机引导加载程序项目中。 构建此项目后、应用程序将保存为在请求时发送的字节数组。