主题中讨论的其他器件:MSP430FR5739、
工具/软件:Code Composer Studio
您好!
由于标准引导加载程序不可用、我们将为 FR2633系列实施自定义引导加载程序、在测试期间、由于链接器脚本中的存储器重叠很少、我们使控制器出现故障。 请根据 FR2633存储器映射找到以下更新的链接器脚本、了解已修改(来自 MSP430FR5739)的引导加载程序。 请确认链接器脚本是否正常。 还想知道"boot_shared_callbacks"用于什么? 根据政治计算、它应该为0xFF78。 是将其放置在0xFF70中的一个问题、即在 BSLsignature & JTAGSignature 开始之前未使用接下来的8个字节。
谢谢你
此致、
穆鲁加
引导加载程序链接器文件
/* RAM 内存地址*/
_RAM_Start = 0x2000; /* RAM 开始 */
_RAM_END = 0x2FFF; /* RAM 结束 */
/*应用程序和引导加载程序之间共享的 RAM,必须保留*/
passwd = 0x2000; /*应用程序发送的强制引导 模式的密码*/
StatCtrl = 0x2002; /*通信 使用的状态和控制字节*/
CI_State_Machine = 0x2003; /* Comm 使用的状态机变量*/
CI_Callback_PTR = 0x2004; /*指向 Comm 回调结构的指针*/
/*用于引导加载程序或应用程序的未保留 RAM */
_nonreserved_RAM_Start = 0x2006; /*非保留 RAM */
/*闪存地址*/
_Flash_Start = 0xC400; /*闪存开始*/
_Flash_end = 0xFFFF; /*闪存结束*
//为引导加载程序区域保留的闪存位置*/
__Boot_Start = 0xFA00; /*启动闪存*/
__Boot_Reset = 0xFFFE; /* Boot reset 向量*/
__Boot_VectorTable = 0xFF88; /*引导矢量表*/
__Boot_SharedCallbacks_Len = 8; /*共享回调的长度(2个调用=4B (MSP430)或8B (msp430x)*/
__Boot_SharedCallbacks = 0xFF70; /*共享回调开始从 FF80更改为 FF70以避免 JTAG 签名和 BSL 签名的内存重叠*/
/*应用领域的保留闪存位置*/
_AppChecksum =(__Flash_Start); //应用程序的 CRC16
_AppChecksum 8 =(__Flash_Start+2); //应用程序的 CRC8
_App_Start =(__Flash_Start+3); /*应用程序区域*/
_App_End =(_Boot_Start-1); //应用程序区域结束(启动前)*/
_crc_size =(_App_end -_App_Start +1); //为 CRC 计算的字节数*
_App_Reset_Vector =(_Boot_Start-2); //应用程序复位矢量的地址*
_App_Proxy_Vector_Start = 0xF988; /*已更改以容纳更多4个矢量代理中断表*/
/*内存定义,根据上面的定义进行调整*/
存储器
{
SFR :origin = 0x0000、length = 0x0010
外设_8位 :origin = 0x0010、length = 0x00F0
peripherals_16BIT :origin = 0x0100、length = 0x0100
// RAM from _nonreserved_RAM_Start -__RAM_END
// Muruga 4K RAM
RAM :origin = 0x2006、length = 0xFFA
// Muruga 512 for 2633
INFOBOOT :origin = 0x1800,length = 0x200
// 从__Boot_Start 闪存-(__Boot_SharedCallback 或 INT_Vector_table)
闪存 :origin = 0xFA00,length = 0x570
// 由 Muruga 补充
JTAGSIGNATURE :origin = 0xFF80,length = 0x0004,fill = 0xFFFF
BSLSIGNATURE :origin = 0xFF84,length = 0x0004,fill = 0xFFFF
// 从__Boot_SharedCallback + Len 共享回调(使用时)
boot_shared_callback :origin = 0xFF70,length = 8
// 从__Boot_VectorTable-__Boot_Reset 启动矢量表
Int_vector_table :origin = 0xFF88,length = 0x76
// 从__Boot_Reset-__Flash_End 复位引导
复位 :origin = 0xFFFE,length = 0x0002
}
/ /
/*指定段分配到内存 中*/
/ /
部分
{
.bss :{}> RAM /*全局和静态 VARS */
.data :{}>RAM /*全局和静态 VARS */
.sysmem :{}> RAM /*动态内存分配区域 */
.stack :{}> RAM (高) /*软件系统堆栈 */
.text :{}>> FLASH |INFOBOOT /* code */
.cinit :{}>> FLASH |INFOBOOT /*初始化表*/
.const :{}>> FLASH |INFOBOOT /*常量数据 */
.cio :{}> RAM /* C I/O 缓冲 器*/
boot_app_vectors :{}> boot_shared_callback
/* MSP430中断矢量 */
boot_vector_table:{}> INT_vector_table
.reset :{} > reset /* MSP430 reset vector */
}
/ /
/*包括外设内存映射 */
/ /
-l MSP430FR2633.cmd
应用程序引导加载程序
/* RAM 内存地址*/
_RAM_Start = 0x2000; /* RAM 开始 */
_RAM_END = 0x2FFF; /* RAM 结束 */
/*应用程序和引导加载程序之间共享的 RAM,必须保留*/
passwd = 0x2000; /*应用程序发送的强制引导 模式的密码*/
StatCtrl = 0x2002; /*通信 使用的状态和控制字节*/
CI_State_Machine = 0x2003; /* Comm 使用的状态机变量*/
CI_Callback_PTR = 0x2004; /*指向 Comm 回调结构的指针*/
/*用于引导加载程序或应用程序的未保留 RAM */
_nonreserved_RAM_Start = 0x2006; /*非保留 RAM */
/*闪存地址*/
_Flash_Start = 0xC400; /*闪存开始*/
_Flash_end = 0xFFFF; /*闪存结束*
//为引导加载程序区域保留的闪存位置*/
__Boot_Start = 0xFA00; /*启动闪存*/
__Boot_Reset = 0xFFFE; /* Boot reset 向量*/
__Boot_VectorTable = 0xFF88; /*引导矢量表*/
__Boot_SharedCallbacks_Len = 8; /*共享回调的长度(2个调用=4B (MSP430)或8B (msp430x)*/
__Boot_SharedCallbacks = 0xFF70; /*开始共享回调*/
_BOOT_APPVECTOR =__Boot_SharedCallback; //应用程序表的定义 */
/*应用领域的保留闪存位置*/
_AppChecksum =(__Flash_Start); //应用程序的 CRC16
_AppChecksum 8 =(__Flash_Start+2); //应用程序的 CRC8
_App_Start =(__Flash_Start+3); /*应用程序区域 */
_App_End =(_Boot_Start-1); //应用程序区域结束(启动前) */
_crc_size =(_App_end -_App_Start +1); //为 CRC 计算的字节数 *
_App_Reset_Vector =(_Boot_Start-2); // FA00 -2 =应用程序复位矢量的 F9FE 地址*/
_App_Proxy_Vector_Start = 0xF988; /*已更改以容纳更多4个矢量代理中断表*/
/*内存定义,根据上面的定义进行调整*/
存储器
{
SFR :origin = 0x0000、length = 0x0010
外设_8位 :origin = 0x0010、length = 0x00F0
peripherals_16BIT :origin = 0x0100、length = 0x0100
// RAM from _nonreserved_RAM_Start -__RAM_END
// 4K RAM
RAM :origin = 0x2006、length = 0xFFA
//对于 FR2633为512字节
INFOA :origin = 0x1800,length = 0x200
//从_App_Start 闪存->(app_proxy_vectors-1)
// 378D 更改为357D。 根据计算、0x5FE (1534字节)被分配给引导扇区
//减小闪存大小以容纳额外的中断矢量
FRAM :origin = 0xC403、length = 0x357D
// 已添加
JTAGSIGNATURE :origin = 0xFF80,length = 0x0004,fill = 0xFFFF
BSLSIGNATURE :origin = 0xFF84,length = 0x0004,fill = 0xFFFF
//从 _App_Proxy_Vector_Start->(reset-1)中删除了中断代理表
INT00 :origin = 0xF988、length = 0x0002
INT01 :origin = 0xF98A,length = 0x0002
INT02 :origin = 0xF98C、length = 0x0002
INT03 :origin = 0xF98E,length = 0x0002
INT04 :origin = 0xF990,length = 0x0002
INT05 :origin = 0xF992、length = 0x0002
INT06 :origin = 0xF994、length = 0x0002
INT07 :origin = 0xF996,length = 0x0002
INT08 :origin = 0xF998、length = 0x0002
INT09 :origin = 0xF99A、length = 0x0002
INT10 :origin = 0xF99C、length = 0x0002
INT11 :origin = 0xF99E、length = 0x0002
INT12 :origin = 0xF9A0,length = 0x0002
INT13 :origin = 0xF9A2,length = 0x0002
INT14 :origin = 0xF9A4,length = 0x0002
INT15 :origin = 0xF9A6,length = 0x0002
Int16 :origin = 0xF9A8、length = 0x0002
INT17 :origin = 0xF9AA、length = 0x0002
INT18 :origin = 0xF9AC,length = 0x0002
INT19 :origin = 0xF9AE,length = 0x0002
INT20 :origin = 0xF9B0,length = 0x0002
INT21 :origin = 0xF9B2、length = 0x0002
INT22 :origin = 0xF9B4,length = 0x0002
INT23 :origin = 0xF9B6、length = 0x0002
INT24 :origin = 0xF9B8、length = 0x0002
INT25 :origin = 0xF9BA,length = 0x0002
INT26 :origin = 0xF9BC,length = 0x0002
INT27 :origin = 0xF9BE,length = 0x0002
INT28 :origin = 0xF9C0,length = 0x0002
INT29 :origin = 0xF9C2、length = 0x0002
INT30 :origin = 0xF9C4,length = 0x0002
INT31 :origin = 0xF9C6、length = 0x0002
Int32 :origin = 0xF9C8,length = 0x0002
INT33 :origin = 0xF9CA,length = 0x0002
INT34 :origin = 0xF9CC,length = 0x0002
INT35 :origin = 0xF9CE、length = 0x0002
INT36 :origin = 0xF9D0,length = 0x0002
INT37 :origin = 0xF9D2、length = 0x0002
INT38 :origin = 0xF9D4,length = 0x0002
INT39 :origin = 0xF9D6、length = 0x0002
INT40 :origin = 0xFBD8、length = 0x0002 // Captivate
INT41 :origin = 0xFBDA,length = 0x0002 // p2
INT42 :origin = 0xFBDC,length = 0x0002 // P1
INT43 :origin = 0xFBDE,length = 0x0002 // ADC
INT44 :origin = 0xFBE0、length = 0x0002 // USCI_B0
INT45 :origin = 0xFBE2,length = 0x0002 // USCI_A1
INT46 :origin = 0xFBE4,length = 0x0002 // USCI_A0
INT47 :origin = 0xFBE6、length = 0x0002 // WDT
INT48 :origin = 0xFBE8、length = 0x0002 // RTC
INT49 :origin = 0xFBEA,length = 0x0002 // TIMER3_A1
INT50 :origin = 0xFBEC,length = 0x0002 // TIMER3_A0
INT51 :origin = 0xFBEE,length = 0x0002 // TIMER2_A1
INT52 :origin = 0xFBF0,length = 0x0002 // TIMER2_A0
INT53 :origin = 0xFBF2、length = 0x0002 // Timer1_A1
INT54 :origin = 0xFBF4,length = 0x0002 // Timer1_A0
INT55 :origin = 0xFBF6、length = 0x0002 // TIMER0_A1
INT56 :origin = 0xFBF8,length = 0x0002 // TIMER0_A0
INT57 :origin = 0xFBFA,length = 0x0002 // USNMI
INT58 :origin = 0xFBFC,length = 0x0002 // SYSNMI
//从_App_Reset_Vector 复位应用程序
复位 :origin = 0xF9FE,length = 0x0002
}
/ /
/*指定段分配到内存 中*/
/ /
部分
{
组(all_FRAM)
{
组(READ_WRITE_MEMORY)
{
.TI.persistent:{}/* for #pragma PERSISTENT */
}
组(只读_存储器)
{
.cinit :{} /*初始化表 */
.pinit :{} /* C++构造函数表 */
binit :{} /*启动时初始化表 */
init_array:{} /* C++构造函数表 */
.mspabi.exidx:{} /* C++构造函数表 */
.mspabi.extab:{} /* C++构造函数表 */
.const :{} /*常量数据 */
}
GROUP (可执行文件存储器)
{
.text :{} /*代码 */
}
}> FRAM
#ifdef __TI_Compiler_version__
#if __TI_Compiler_version__>=15009000
#ifndef __large_data_model__
.TI.ramfunc:{} load=FRAM、run=RAM、table (BINIT)
其他
.TI.ramfunc:{} load=FRAM | FRAM2、run=RAM、table (BINIT)
#endif
#endif
#endif
.jtagsignature:{}> JTAGSIGNATURE/* JTAG Signature */
bslsignature :{}> BSLSIGNATURE /* BSL Signature */
.bss :{}> RAM /*全局和静态变量 */
.data :{}>RAM /*全局和静态变量 */
.TI.noinit :{}>RAM /* for #pragma noinit */
.cio :{}> RAM /* C I/O 缓冲 器*/
.sysmem :{}> RAM /*动态内存分配区域 */
.stack :{}> RAM (高) /*软件系统堆栈 */
infoA :{}>INFOA /* MSP430 INFO FRAM 内存段*/
/* MSP430中断矢量 */
.int00 :{}>int00
.int01 :{}>INT01
.int02 :{}>INT02
.int03 :{}>INT03
.int04 :{}>INT04
.int05 :{}>INT05
.int06 :{}>INT06
.int07 :{}>INT07
.int08 :{}>INT08
.int09 :{}>INT09
.int10 :{}>int10
.int11 :{}>int11
.int12 :{}>int12
.int13 :{}>int13
.int14 :{}>int14
.int15 :{}>INT15
.int16 :{}>int16
.int17 :{}>INT17
.int18 :{}>INT18
.int19 :{}>INT19
.int20 :{}>INT20
.int21 :{}>INT21
.int22 :{}>INT22
.int23 :{}>INT23
.int24 :{}>INT24
.int25 :{}>INT25
.int26 :{}>INT26
.int27 :{}>INT27
.int28 :{}>INT28
.int29 :{}>INT29
.int30 :{}>int30
.int31 :{}>int31
.int32 :{}>int32
.int33 :{}>int33
.int34 :{}>int34
.int35 :{} > int35
.int36 :{}>int36
.int37 :{}>INT37
.int38 :{}>INT38
.int39 :{}>INT39
CapTIvate :{*(.int40 )}> INT40 type = VECT_init
端口2 :{*(.int41 )}> INT41类型= VECT_INIT
端口1 :{*(.int42 )}> INT42类型= VECT_INIT
ADC :{*(.int43 )}> INT43 TYPE = VECT_INIT
USCI_B0 :{*(.int44 )}> INT44 TYPE = VECT_INIT
USCI_A1 :{*(.int45)}> INT45 type = VECT_init
USCI_A0 :{*(.int46)}> INT46 TYPE = VECT_INIT
WDT :{*(.int47 )}> INT47 TYPE = VECT_INIT
RTC :{*(.int48 )}> INT48 type = VECT_INIT
TIMER3_A1 :{*(.int49 )}> INT49 TYPE = VECT_INIT
TIMER3_A0 :{*(.int50 )}> INT50 TYPE = VECT_INIT
TIMER2_A1 :{*(.int51 )}> INT51 type = VECT_INIT
TIMER2_A0 :{*(.int52)}> INT52 type = VECT_INIT
Timer1_A1 :{*(.int53)}> INT53 type = VECT_init
Timer1_A0 :{*(.int54)}> INT54 type = VECT_init
TIMER0_A1 :{*(.int55 )}> INT55 TYPE = VECT_INIT
TIMER0_A0 :{*(.int56 )}> INT56 TYPE = VECT_INIT
UNMI :{*(.int57 )}> INT57 TYPE = VECT_INIT
SYSNMI :{*(.int58 )}> INT58 TYPE = VECT_INIT
重置 :{}> 重置
/* MSP430复位矢量 */
}
/ /
/*包括外设内存映射 */
/ /
-l MSP430FR2633.cmd