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.

[参考译文] MSP430F5438A:复位时如何从0x010000位置而不是0x5c00上执行我的程序代码。

Guru**** 2551110 points
Other Parts Discussed in Thread: MSP430F5438A, MSP-FET

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/857377/msp430f5438a-how-to-execute-my-program-code-from-0x010000-location-instead-of-0x5c00-up-on-reset

器件型号:MSP430F5438A
主题中讨论的其他器件: MSP-FET

您好,

我想在复位时在存储器位置(0x010000)而非(0x5C00)执行代码。 如何 告知我的复位矢量在复位时跳转到位置(0x10000)、而不是(0x5C00)。 如果有任何关于这一点的指示、我们将不胜感激。

提前感谢。  

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

    你不能。 复位矢量为16位、因此您的程序必须在较低的存储器中开始执行。 将代码放置在0x5c00以将执行传输到0x10000。

    如果您真的很幸运、您可以将矢量设置为0xfffe、并将该值设置为良性指令、以便继续执行您的代码。

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

    尊敬的 David:

    参考 [如果您真的很幸运、您可以将矢量设置为0xFFe、并将该值设置为良性指令、以便继续执行您的代码]

    您能告诉我如何操作吗?

    提前感谢

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

    否 您必须自己弄清楚这一点、因为这肯定会非常棘手。 首先、您必须弄清指令编码是否允许它。 然后、您必须弄清楚如何说服您的工具(编译器/链接器)让您执行该操作。

    祝你好运。

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

    尊敬的 David:

    我刚才对我的实施进行了第二次思考。 我可以将示例代码放在(0x5C00)处、该代码在复位时可以跳转到位置0x10000。 现在 、我的要求 是如何修改链接器文件、以便我可以将 应用程序代码放置在0x10000位置。

    注意:我愿意 使用中断矢量来执行我的应用代码、因为我必须将代码放置在0x10000位置。

    我正在为应用程序代码附加链接器文件、该应用程序代码应从位置0x10000-0x1FFFF 开始、但不起作用(使用 JTAG 进行测试会导致反汇编:执行时不可用)、请建议对链接器文件进行所需的修改、以便从 位置0x10000存储应用程序。   

    /********
    //
    // MSP430F5438A 的 XLink 配置文件
    //
    //版权所有1996-2017 IAR Systems AB。
    //
    //有关详细信息,请参阅文件430/doc/licenses/IARSourceLicense.txt
    //许可证信息。
    //
    //$Revision:14570美元
    //
    /********

    //----------------------------
    //说明
    //

    //
    //用法:
    //
    //  xlink [文件...] f lnk430f5438a.xcl
    //
    //--------------------------------------------------------
    //设备摘要
    //

    //
    //内核:                          MSP430Xv2
    //
    //中断向量:             64
    //
    //外设单元:              00100-00FFF
    //
    //信息存储器(闪存):    01800-019FF
    //
    //读/写存储器(RAM):       01C00-05BFF
    //
    //只读存储器(闪存):      010000-0FFFF
    //                                10000-45BFF
    //


    //--------------------------------------------------------
    //段
    //

    //--------------------------------------------------------
    //数据读取/写入段(RAM)
    //

    //
    //以下两个段都可用
    // DATA16和 DATA20段组。
    //
    //段        使用
    //----         ----------------
    //数据 _Z     数据初始化为零
    //数据 _I     通过从数据复制初始化数据 ID
    //数据 使用     __no_init 定义的_N 数据
    //数据 堆  'malloc'和'free'使用的堆
    //
    //段        使用
    //----         ----------------
    // CSTACK         运行时堆栈
    //        针对主线程的 TLS16_I 线程本地存储
    //


    //--------------------------------------------------------
    //程序和数据只读段(闪存)
    //

    //
    //以下两个段都可用
    // DATA16和 DATA20段组。
    //
    //段        使用
    //----         ----------------
    //数据 _C     常量数据、包括字符串字面量
    //数据 _ID    数据初始化程序 _I
    //
    //段        使用
    //----         ----------------
    //信息           内存
    // INFOA          信息内存,组 A
    // INFOB          信息内存,组 B
    // INFOC          信息内存,组 C
    // INFOD          信息内存,组 D
    // CSTART         程序启动代码
    //编写           程序代码
    //       中断服务例程的 ISR_code 程序代码
    //        C++使用的 DIFUNCT 动态初始化矢量
    //       由-J 选项生成的校验和字节
    // intvec         中断向量
    //复位          复位向量
    //       主线程的 TLS16_ID 线程本地初始化程序
    //
    //注意:
    //
    //*段 CSTART、ISR_code 和 DIFUNCT 以及中的段
    //  必须将 DATA16和 TLS16段组放置在范围内
    //  0000-FFFD。
    //
    //* INFox 和 INFO 段重叠,这允许数据为
    //  放置在特定的存储库中或信息存储器中的任何位置。
    //
    //* INTVEC 和复位段重叠。 这允许应用程序执行
    //  使用运行时库提供的复位矢量,或
    //  通过定义相关的中断函数来提供复位函数
    //  与复位矢量。
    //


    //----------------------------
    //配置
    //

    //--------------------------------------------------------
    //堆栈和堆大小
    //

    //取消注释以供命令行使用
    //-D_STACK_SIZE=160
    //-D_DATA16_Hap_size=160
    //-D_DATA20_Hap_size=160


    //--------------------------------------------------------
    //定义 CPU
    //

    cmsp430

    //补偿 CPU 中的硬件错误
    D?CPU30_OFFSET=2


    //--------------------------------------------------------
    //支持将函数放置在读取/写入存储器中
    //

    -qcode_i=code_ID


    //--------------------------------------------------------
    //支持线程本地存储
    //

    -QTLS16_I=TLS16_ID


    //--------------------------------------------------------
    //硬件乘法器位置
    //

    -D__IAR_HWMUL=4C0


    //----------------------------
    //放置指令
    //

    //--------------------------------------------------------
    //信息内存
    //

    -Z (const) info=1800-19FF
    -Z (const) INFOA = 1980 - 19FF
    -Z (const) INFOB =1900-197F
    -Z (const) infoc=1880-18FF
    -Z (const) INFOD = 1800-187F


    //--------------------------------------------------------
    // RAM 内存
    //

    -Z (data) DATA16_I、DATA16_Z、DATA16_N、TLS16_I=1C00-5BFF
    -Z (data) DATA16_heap+_DATA16_heap_size
    -Z (data) code_i
    -Z (data) DATA20_I、DATA20_Z、DATA20_N、DATA20_heap+_DATA20_heap_size
    -Z (data) CSTACK+_STACK_SIZE#


    //--------------------------------------------------------
    //只读存储器
    //

    //--------------------------------------------------------
    //低内存0-0FFFF
    //

    //--------------------
    //常量数据
    //

    -Z (const) DATA16_C、DATA16_ID、TLS16_ID、DIFUNCT、校验和=10000-1FFFF

    //--------------------
    //代码
    //

    -Z (代码) CSTRT、ISR_code、CODE16=10000-1FFFF


    //--------------------------------------------------------
    //所有内存0-FFFFF
    //

    //--------------------
    //代码
    //

    -P (代码) code=10000-1FFFF、10000-45BFF

    //--------------------
    //常量数据
    //

    -Z (const) DATA20_C、DATA20_ID、CODE_ID = 10000-1FFFF、10040-45BFF

    //--------------------------------------------------------
    //中断向量
    //

    -Z (代码) intvec=FF80-FFFF
    -Z (代码) reset=FFFE-FFFF

    提前感谢

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

    您好!

    我有疑问。 为什么要从0x010000位置执行程序代码?

    我建议您参考 主存储器 BSL (http://www.ti.com/lit/an/slaa600d/slaa600d.pdf)。 只需删除通信即可。 很抱歉、只有 CCS 版本。

     方法 是在您重置后、跳转到第一个代码。 在第一个代码中、您将跳转至高于0x10000的第二个代码。  

    伊斯天

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

    您好,

    我不打算使用内部 BSL、因为 BSL 需要 MSP-Rocket /MSP-FET 进行编程、这不适合我的最终应用、我宁愿在代码存储器中创建一个简单的引导加载程序、  

    因此、在10000位置执行引导加载程序是我唯一选择输出中断的选项。

    我的要求是:

    我需要创建一个引导加载程序(10000)、该引导加载程序最初会检查我的应用程序代码(0x5c00)的完整性(校验和)、并使用存储在信息内存(1800)中的正确校验和进行验证

    引导加载程序应用程序应在 UART 上接收十六进制数据并对我的应用程序存储器(位于0x5c00)进行重新编程。

    请提供有关如何实现这一点的任何指导。

    谢谢

    Anand

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

    Anand、您好!

    请查看我发送的链接。 该 BSL 不是在生产中编程的 BSL。 它讨论了主存储器中的客户 BSL。 它支持中断和 UART。

    但 BSL 无法保存在0x10000中、因为0xFFE 中保存的地址是16位的。

    伊斯天