我的购物车(0)

开发FR57XX时将DATA段放到FRAM中的方法

作者:kelaodun1 ,2018/8/6 10:23:54 发布     举报
    (319) (0) (0) (8)
  • 这里和大家一起分享一下开发FR57XX时将DATA段放到FRAM中的方法

    FRAM是TI最新半导体技术在MCU上的应用。

    其FRAM与普通的FLASH与SRAM比主要有两个优势:

    1、FRAM像FLASH一样数据掉电不易失;

    2、FRAM像SRAM一样,可以直接在上面运行程序;

    所以FRAM可以身兼FLASH与RAM两职。

    在开发FR57XX MCU时可以发现,FR57XX既有FRAM,也有RAM。

    细心的朋友会发现在CCS与IAR中,编译器均有默认的数据段代码段堆栈等地址分配,有些在FRAM中,有些在RAM中。

    如果想尝试将所有的代码数据均放在FRAM中则需要对编译器的MCU配置文件进行修改。

    1、CCS V5的修改方法

    CCS的存储器地址映射表是放在.cmd文件中的

    打开工程中的.cmd文件,系统默认将.bss(全局静态变量)与.stack(堆栈)放在RAM中

    如下所示:


     .bss       : {} > RAM                /* GLOBAL & STATIC VARS              */

     .stack     : {} > RAM (HIGH)         /* SOFTWARE SYSTEM STACK             */

    若需要将其放在FRAM中则可以如下修改配置文件:


    .bss       : {} > FRAM                /* GLOBAL & STATIC VARS              */

     .stack     : {} > FRAM (HIGH)         /* SOFTWARE SYSTEM STACK             */

    2、IAR中的修改方法

    IAR的存储器地址映射表是放在.xcl文件中的

    打开该文件后,将放在RAM中的段均映射到FRAM中即可。

    以FR5739为例:打开lnk430fr5739.xcl

    看到RAM的地址区间为// Read/write memory (RAM):        1C00-1FFF

    FRAM的地址区间为// Read-only memory (FRAM):        C200-FFFF

    放在RAM区域内的是:动态数据


    -Z(DATA)DATA16_I,DATA16_Z,DATA16_N,TLS16_I,DATA16_HEAP+_DATA16_HEAP_SIZE=1C00-1FFF

    -Z(DATA)CODE_I

    -Z(DATA)CSTACK+_STACK_SIZE#

    将其放到FRAM中去:


    -Z(DATA)DATA16_I,DATA16_Z,DATA16_N,TLS16_I,DATA16_HEAP+_DATA16_HEAP_SIZE=C200-FFFF

    -Z(DATA)CODE_I

    -Z(DATA)CSTACK+_STACK_SIZE#

    编译连接后调试可以发现此时动态变量已经在FRAM中。

    注意:.xcl在工程中不能修改

    其文件位置为:\IAR Systems\Embedded Workbench 6.0 Evaluation\430\config

    建议复制一个原始文件改名保存,将lnk430fr5739.xcl剪切到桌面打开-修改-保存,在剪切回config目录下。

    IAR .xcl中DATA,CODE等段的定义与说明详见《MSP430 IAR C/C++ Compiler Reference Guide》与


    《IAR Linker and Library Tools Reference Guide》

    如果上面说的内容有错误或者问题,请大家直接指出,一起讨论并解决。

标签:

MSP430 16 位超低功耗 MCU

共有8条网友评论
kustech 发表于2018/8/6 10:25:05

补充一点,

1. MSP430的整个FRAM存储区域都包含在C200-FF7F(16k)中,无论代码和常量以及全局变量都可以定义在这个范围.

2. 在定义常量时可以和代码区定义在一起,但是如果定义全局变量,最好是进行一个划分。

例如:

-Z(DATA)DATA16_I,DATA16_Z,DATA16_N,TLS16_I,DATA16_HEAP+_DATA16_HEAP_SIZE=F000-FF7F

-Z(CONST)DATA16_C,DATA16_ID,TLS16_ID,DIFUNCT,CHECKSUM=C200-EFFF

-Z(CODE)CSTART,ISR_CODE,CODE_ID=C200- EFFF

-P(CODE)CODE= C200 - EFFF

注意: 红色部分可以根据实际应用进行调整

这样就给FRAM划出了一个区域作为变量。但这样做也是有缺点的,就是定义了所有的变量到F000-FF7F,1K的SRAM区就用不了.

在实际定义中,可以这样进行个规划。

DATA16_Z : 在定义时初始化为0的变量定义到 FRAM

DATA16_I :  在定义时有初始化的变量定义到 FRAM

DATA16_N : 未在定义时初始化的变量定义到 SRAM

TLS16_I :   定义到SARM

DATA16_HEAP+_DATA16_HEAP_SIZE 定义到SRAM

具体更改如下 :

-Z(DATA)DATA16_I,DATA16_Z= F000-FF7F

-Z(DATA)DATA16_N,TLS16_I,DATA16_HEAP+_DATA16_HEAP_SIZE = 1C00-1FFF

在实际软件编程的时候注意一下几点:

1.       需要用作查找表的大数组定义时给出初始值

例如: unsigned char buf[100] = {0};

2.       全局变量和静态变量定义时赋值

    例如: int g_flag = 0;

3.       局部非静态边量定义时不赋值,这样编译器会自动分配RAM的空间使用.

例如: int m_dat;

用户可以根据实际应用情况合理地规划FRAM和RAM,尽量让需要频繁更改又需要掉电保存的变量定义到FRAM,

只是作为临时变量的定义到SRAM中。

有帮助(0)没帮助(0)引用此答案
standard 发表于2018/8/6 10:25:26
谢谢,这样的资料应该很有帮助作用
有帮助(0)没帮助(0)引用此答案
electro 发表于2018/8/6 10:25:48
可以再结合铁电MSP430的MPU,写一下如何实现对代码区的保护。
有帮助(0)没帮助(0)引用此答案
clever 发表于2018/8/6 10:26:45

MPU的配置可以按照下面程序来写,每句后面都有注释其意义。

注意MPU配置的开头和结尾

// Start with

   MPUCTL0_H = 0xA5;                                                       // Write PWD to access MPU registers

   MPUSEG = 0x1f0f;                                                            // B1 = 0xDE00; B2 = 0xFE00

                                                                                                // Borders are assigned to segments

   MPUSAM |=  MPUSEG2VS;                                             // Violation select  

//    MPUSAM &=  ~MPUSEG2XE;                                      // Disable excution segment 2

   MPUSAM &=  ~MPUSEG2WE;                                       // Disable write segment 2

   MPUSAM |=  MPUSEG2RE;                                            // Enable read segment 2

   MPUCTL0 = MPUPW + MPUENA;                                 // MPU enable

// End with

   MPUCTL0_H = 0x96;                                                       // Lock MPU registers  

这段代码就是不允许对segment2进行写操作,按照MPUSEG 的配置就是指存储器空间0xDE00--0xFDFF不能进行写操作,

如果这是后对该区域的存储空间进行写操作,例如写0xEA15这个地方:

*((   int  *)0xEA15) = 0x55;                                              // Assign 0x55 to FRAM address 0xEA15

则MPU的MPUCTL1中的MPUSEG2IFG会置位,并且该操作会无效。

故根据.xcl对代码区的设置,在MPU设置时将代码区对应的segment的write功能disable,即可对代码区进行写保护操作。

而且MPU还可以设置读保护,执行保护功能,可以根据应用的需求具体设计。

不知道我有没有讲清楚,欢迎大家继续讨论

有帮助(0)没帮助(0)引用此答案
kelaodun1 发表于2018/8/6 10:27:00
关于Fram的读写速度问题,还是有点不清楚,因为时间关系,还没有看,能不能麻烦这里简要介绍一下?
有帮助(0)没帮助(0)引用此答案
kustech 发表于2018/8/6 10:27:27
FRAM的读写机制会不会导致类似于计算机的volatile问题?没看仔细,想到了问问。
有帮助(0)没帮助(0)引用此答案
electro 发表于2018/8/6 10:27:34
根据FRAM的MCU芯片的DATASHEET上的参数,FARM最大读写速度在8.3M(字或字节)
有帮助(0)没帮助(0)引用此答案
clever 发表于2018/8/6 10:27:53
正因为FRAM的灵活,所以才有MPU对FRAM进行不同分区和操作设置,FARM MCU带有SRAM,需要volatile的变量放在SRAM里就行了。
有帮助(0)没帮助(0)引用此答案
1/1
文明上网,理性发言
专题版主
申请成为版主
  • Royston

    高级工程师 安富利中国有限公司 FAE熟练应用,ISE14.1 工具

  • Royston

    高级工程师 安富利中国有限公司 FAE熟练应用,ISE14.1 工具

  • Royston

    高级工程师 安富利中国有限公司 FAE熟练应用,ISE14.1 工具

  • Royston

    高级工程师 安富利中国有限公司 FAE熟练应用,ISE14.1 工具

  • Royston

    高级工程师 安富利中国有限公司 FAE熟练应用,ISE14.1 工具

最新分享上传与展示原则:
1、首先展示的产品必须是电子业内的作品;
2、对业内人士有学习的意义;
3、作品可以以广告的形式出现,若广告目的太
强烈,不予展示;
4、带病毒性的文件,不予展示,若严重,还会
屏蔽会员IP;
5、任何的分享都会通过系统管理员的审核,审
核时间,通常不超过24小时;