ZHCA930B June 2014 – August 2021 MSP430FR2032 , MSP430FR2033 , MSP430FR2110 , MSP430FR2111 , MSP430FR2311 , MSP430FR2433 , MSP430FR2532 , MSP430FR2533 , MSP430FR2632 , MSP430FR2633 , MSP430FR4131 , MSP430FR4132 , MSP430FR4133 , MSP430FR5720 , MSP430FR5721 , MSP430FR5722 , MSP430FR5723 , MSP430FR5724 , MSP430FR5725 , MSP430FR5726 , MSP430FR5727 , MSP430FR5728 , MSP430FR5729 , MSP430FR5730 , MSP430FR5731 , MSP430FR5732 , MSP430FR5733 , MSP430FR5734 , MSP430FR5735 , MSP430FR5736 , MSP430FR5737 , MSP430FR5738 , MSP430FR5739 , MSP430FR5847 , MSP430FR58471 , MSP430FR5848 , MSP430FR5849 , MSP430FR5857 , MSP430FR5858 , MSP430FR5859 , MSP430FR5867 , MSP430FR58671 , MSP430FR5868 , MSP430FR5869 , MSP430FR5870 , MSP430FR5872 , MSP430FR58721 , MSP430FR5887 , MSP430FR5888 , MSP430FR5889 , MSP430FR58891 , MSP430FR5922 , MSP430FR59221 , MSP430FR5947 , MSP430FR59471 , MSP430FR5948 , MSP430FR5949 , MSP430FR5957 , MSP430FR5958 , MSP430FR5959 , MSP430FR5967 , MSP430FR5968 , MSP430FR5969 , MSP430FR5969-SP , MSP430FR59691 , MSP430FR5970 , MSP430FR5972 , MSP430FR59721 , MSP430FR5986 , MSP430FR5987 , MSP430FR5988 , MSP430FR5989 , MSP430FR5989-EP , MSP430FR59891 , MSP430FR5994 , MSP430FR6820 , MSP430FR6822 , MSP430FR68221 , MSP430FR6870 , MSP430FR6872 , MSP430FR68721 , MSP430FR6877 , MSP430FR6879 , MSP430FR68791 , MSP430FR6887 , MSP430FR6888 , MSP430FR6889 , MSP430FR68891 , MSP430FR6920 , MSP430FR6922 , MSP430FR69221 , MSP430FR6927 , MSP430FR69271 , MSP430FR6928 , MSP430FR6970 , MSP430FR6972 , MSP430FR69721 , MSP430FR6977 , MSP430FR6979 , MSP430FR69791 , MSP430FR6987 , MSP430FR6988 , MSP430FR6989 , MSP430FR69891
每个 CCS 工程都有一个链接器命令文件 (.cmd),它会在创建工程时填充到工程文件夹中。此文件说明了用于器件程序代码、变量、常量和栈的分配方式,还介绍了在器件中排列每个存储器段时遵循的优先级。下面列出的段名称是大多数应用最常用的项目。
.const /* 常量数据 */
.text /* 应用代码 */
.bss /* 未初始化的全局和静态变量 – RAM 中的默认值 */
.data /* 初始化的全局和静态变量 – RAM 中的默认值 */
.stack /* 软件系统堆栈 – RAM 中的默认值 */
此外,当为 FRAM 分配了名为 .TI.noinit
(将与 #pragma NOINIT
配合使用)和 .TI.persistent
(将与 #pragma PERSISTENT
配合使用)的链接器段时,编译器还能够自动将所选的变量、数组或结构放到 FRAM 中。对于 .TI.persistent
,此定义已经存在于链接器命令文件中,并将声明为 #pragma PERSISTENT
的变量放到 FRAM 中。对于 .TI.noinit
,如果应使用 #pragma NOINIT
功能将不需要执行 C 启动初始化的变量和结构放到 FRAM 中,则客户可以像对现有的 .TI.persistent
那样执行此类分配。
.TI.noinit : {} > FRAM /* 对于 #pragma NOINIT */
.TI.persistent : {} > FRAM /* 对于 #pragma PERSISTENT */
可以在 CCS 中直接修改链接器命令文件。以下代码提供适用于 MSP430FR2311 的 .cmd 文件的解释和修改示例。
在链接器文件中,存储器分配包含两项内容:MEMORY 和 SECTIONS。MEMORY 主要将存储器划分为 RAM、FRAM、BSL 或用户定义的区域,而 SECTIONS 为每个使用的段选择定义的存储器段。更多详细信息,请参阅《MSP430 优化 C/C++ 编译器》。
访问 | MSP430FR2311 | |
---|---|---|
存储器 (FRAM) 主存储器:中断向量和签名 主存储器:代码存储器 |
读/写 (可选写保护) |
3.75KB FFFFh 至 FF80h FFFFh 至 F100h |
RAM | 读/写 | 1KB 23FFh 至 2000h |
引导加载程序 (BSL1) 存储器 (ROM)(TI 内部使用) | 只读 | 2KB 17FFh 至 1000h |
引导加载程序 (BSL2) 存储器 (ROM)(TI 内部使用) | 只读 | 1KB FFFFFh 至 FFC00h |
外设 | 读/写 | 4KB 0FFFh 至 0000h |
表 3-2 显示 MSP430FR2311 的存储器组织情况,以下程序是默认的存储器和段分配,具体取决于 CCS 中芯片的存储器的组织情况。在存储器分配中,需要使用关键字“origin”和“length”来定义存储器的初始地址和长度。SECTIONS 可以直接指向已分配的 MEMORY,用户可以根据需要定义 SECTIONS 的 MEMORY 大小和 MEMORY 类型。
/****************************************************************************/
/* 指定系统内存映射 */
/****************************************************************************/
MEMORY {
BSL0 : origin = 0x1000, length = 0x800
RAM : origin = 0x2000, length = 0x400
FRAM : origin = 0xF100, length = 0xE80
BSL1 : origin = 0xFFC00, length = 0x400
JTAGSIGNATURE : origin = 0xFF80, length = 0x0004, fill = 0xFFFF
BSLSIGNATURE : origin = 0xFF84, length = 0x0004, fill = 0xFFFF
INT00 : origin = 0xFF88, length = 0x0002
INT01 : origin = 0xFF8A, length = 0x0002
..........................................................
INT57 : origin = 0xFFFA, length = 0x0002
INT58 : origin = 0xFFFC, length = 0x0002
RESET : origin = 0xFFFE, length = 0x0002
}
/****************************************************************************/
/* 指定 SECTIONS 分配至存储器 */
/****************************************************************************/
SECTIONS {
GROUP(ALL_FRAM)
{
GROUP(READ_WRITE_MEMORY)
{
.TI.persistent : {} /* 对于 #pragma persistent */
}
GROUP(READ_ONLY_MEMORY)
{
.cinit : {} /* 初始化表 */
.pinit : {} /* C++ 构建函数表 */
.binit : {} /* 引导时初始化表 */
.init_array : {} /* C++ 构造函数表 */
.mspabi.exidx : {} /* C++ 构造函数表 */
.mspabi.extab : {} /* C++ 构造函数表 */
.const : {} /* 常量数据 */
}
GROUP(EXECUTABLE_MEMORY)
{
.text : {} /* 代码 */
.text:_isr : {} /* 代码 ISR */
}
} > FRAM
#ifdef __TI_COMPILER_VERSION__
#if __TI_COMPILER_VERSION__ >= 15009000
.TI.ramfunc : {} load=FRAM, run=RAM, table(BINIT)
#endif
#endif
.jtagsignature : {} > JTAGSIGNATURE
.bslsignature : {} > BSLSIGNATURE
.cio : {} > RAM /* C I/O 缓冲器 */
.sysmem : {} > RAM /* 动态存储器分配区 */
.bss : {} > RAM /* 全局和静态变量 */
.data : {} > RAM /* 全局和静态变量 */
.TI.noinit : {} > RAM /* 对于 #pragma noinit */
.stack : {} > RAM (HIGH) /* 软件系统堆栈 */
/* MSP430 中断矢量 */
.int00 : {} > INT00
.int01 : {} > INT01
.......................................
.int43 : {} > INT43
.int44 : {} > INT44
ECOMP0 : { * ( .int45 ) } > INT45 type = VECT_INIT
PORT2 : { * ( .int46 ) } > INT46 type = VECT_INIT
PORT1 : { * ( .int47 ) } > INT47 type = VECT_INIT
ADC : { * ( .int48 ) } > INT48 type = VECT_INIT
EUSCI_B0 : { * ( .int49 ) } > INT49 type = VECT_INIT
EUSCI_A0 : { * ( .int50 ) } > INT50 type = VECT_INIT
WDT : { * ( .int51 ) } > INT51 type = VECT_INIT
RTC : { * ( .int52 ) } > INT52 type = VECT_INIT
TIMER1_B1 : { * ( .int53 ) } > INT53 type = VECT_INIT
TIMER1_B0 : { * ( .int54 ) } > INT54 type = VECT_INIT
TIMER0_B1 : { * ( .int55 ) } > INT55 type = VECT_INIT
TIMER0_B0 : { * ( .int56 ) } > INT56 type = VECT_INIT
UNMI : { * ( .int57 ) } > INT57 type = VECT_INIT
SYSNMI : { * ( .int58 ) } > INT58 type = VECT_INIT
.reset : {} > RESET
}