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

 

  1.   商标
  2. 1FRAM 和通用存储器
  3. 2可以将其视为 RAM
  4. 3存储器布局分区
    1. 3.1 程序代码和常量数据
    2. 3.2 变量
    3. 3.3 软件栈
    4. 3.4 支持在 MSP430 IDE 中进行存储器分区
      1. 3.4.1 TI Code Composer Studio
        1. 3.4.1.1 修改链接器文件示例 1
        2. 3.4.1.2 修改链接器文件示例 2
        3. 3.4.1.3 修改链接器文件示例 3
      2. 3.4.2 适用于 MSP430 的 IAR Embedded Workbench
        1. 3.4.2.1 修改链接器文件示例 1
        2. 3.4.2.2 修改链接器文件示例 2
        3. 3.4.2.3 修改链接器文件示例 3
  5. 4优化应用能耗和性能
    1. 4.1 缩短从 LPMx.5 唤醒的时间
  6. 5面向 FRAM 且易于使用的编译器扩展
    1. 5.1 TI Code Composer Studio
    2. 5.2 适用于 MSP430 的 IAR Embedded Workbench
  7. 6FRAM 保护和安全性
    1. 6.1 存储器保护
    2. 6.2 检查链接器映射文件
      1. 6.2.1 TI Code Composer Studio
      2. 6.2.2 适用于 MSP430 的 IAR Embedded Workbench
    3. 6.3 存储器保护设置
      1. 6.3.1 FR5xx 和 FR6xx 系列 MCU MPU 配置
        1. 6.3.1.1 CCS MPU 实现方式
          1. 6.3.1.1.1 手动配置 MPU
          2. 6.3.1.1.2 基于 IDE 向导的 MPU 配置
        2. 6.3.1.2 IAR MPU 实现方式
          1. 6.3.1.2.1 手动配置 MPU
          2. 6.3.1.2.2 基于 IDE 向导的 MPU 配置
      2. 6.3.2 FR2xx 和 FR4xx 系列 MCU FRAM 写保护配置
    4. 6.4 IP 封装
  8. 7参考文献
  9. 8修订历史记录

TI Code Composer Studio

每个 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++ 编译器》

表 3-2 MSP430FR2311 存储器组织
访问 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  
}