主题中讨论的其他器件: MSP-FET
您好,
我想在复位时在存储器位置(0x010000)而非(0x5C00)执行代码。 如何 告知我的复位矢量在复位时跳转到位置(0x10000)、而不是(0x5C00)。 如果有任何关于这一点的指示、我们将不胜感激。
提前感谢。
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.
您好,
我想在复位时在存储器位置(0x010000)而非(0x5C00)执行代码。 如何 告知我的复位矢量在复位时跳转到位置(0x10000)、而不是(0x5C00)。 如果有任何关于这一点的指示、我们将不胜感激。
提前感谢。
尊敬的 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