5493|9

662

帖子

0

TA的资源

纯净的硅(初级)

楼主
 

【TI首届低功耗设计大赛】slotg(04):FRAM 掉电数据记忆 [复制链接]

这一篇是 MSP430FR5969 LaunchPad 的基础练习篇,在 CCS6下使用 DriverLib 库的方式编程。

我们所设计的板子在很多应用场合是需要做掉电记忆的,比如说机器设备可能需要记忆相关的设定与使用数据,而这些数据不能随机器的掉电而消失,在过去的作法是在掉电之前将数据写入 FLASH 存储器或是 EEPROM 存储器,或是在硬件设计上使用电池给 RAM 供电使其在板子掉电之后还能够保存数据。但是这些作法都有其缺点,FLASH 跟 EEPROM 存储器的写入速度太慢,又有写入/擦除寿命的问题,而供电给 RAM 的电池除了占用板上空间外电池也是有使用寿命的问题。

MSP430 的 FR 系列是 FRAM (铁电)工艺,该工艺的特色是可以如 RAM 存储器一般快速的读写外,掉电之后也可以保留数据,而写入的次数限制又近乎无限,几乎可以完全忽略写入的寿命问题,是一个很理想的掉电数据记忆装置。

在本次实验当中我们实现了一个功能,使用 MSP430FR5969 LaunchPad 上的2颗 LED 显示4种状态:


状态 0:LED1 OFF,LED2 OFF
状态 1:LED1 ON ,LED2 OFF
状态 2:LED1 OFF,LED2 ON
状态 3:LED1 ON ,LED2 ON

当压下 LaunchPad 上的 S1 键之后状态会依顺序改变。

我们宣告了一个全局变量 LedStatus 用来存放 LED 目前的状态:



当程序执行之后,压下 S1 键 LED 确实依照我们设定的顺序做改变,但是当 LaunchPad 掉电再上电后 LED 却无法保持在掉电前的状态!

在 Debug 模式下我们看看 LedStatus 的存放地址:



LedStatus 是存放在地址 0x001C00,看看 MSP430FR5969 规格书内的存储空间分配:



这一个地址是位于 RAM 的空间,编译器将程序内的变量安排在 RAM 的空间里面,所以当掉电之后数据当然没有办法保留!那我们该怎么将变量放在 FRAM 的空间里面呢?

这个问题在 TI wiki 找到了解决的方法:

Creating MSP430 FRAM Variables Using CCS
http://processors.wiki.ti.com/in ... Variables_Using_CCS

打开 lnk_msp430fr5969.cmd 修改相关的设定,我们调整 FRAM 原本的空间范围,新增了一个 FRAM_VARS 空间:





程序中全局变量 LedStatus 的宣告改成:



在 Debug 模式下再看看 LedStatus 的存放地址:



地址已经移到了 0x004400 ,这个是在我们新宣告的 FRAM_VARS 空间范围里面。

再次执行程序,掉电再上电,LED 保持在掉电前的状态。


掉电前状态


掉电


再上电



程序码:
  1. #include "driverlib.h"

  2. #pragma SET_DATA_SECTION(".fram_vars")
  3. uint8_t LedStatus;
  4. #pragma SET_DATA_SECTION()

  5. // Display LED status
  6. void ds_led(void)
  7. {
  8.     switch(LedStatus){
  9.     case 1:
  10.         GPIO_setOutputHighOnPin(GPIO_PORT_P4,GPIO_PIN6);    // LED1
  11.         GPIO_setOutputLowOnPin(GPIO_PORT_P1,GPIO_PIN0);     // LED2
  12.         break;
  13.     case 2:
  14.         GPIO_setOutputLowOnPin(GPIO_PORT_P4,GPIO_PIN6);
  15.         GPIO_setOutputHighOnPin(GPIO_PORT_P1,GPIO_PIN0);
  16.         break;
  17.     case 3:
  18.         GPIO_setOutputHighOnPin(GPIO_PORT_P4,GPIO_PIN6);
  19.         GPIO_setOutputHighOnPin(GPIO_PORT_P1,GPIO_PIN0);
  20.         break;
  21.     default:
  22.         GPIO_setOutputLowOnPin(GPIO_PORT_P4,GPIO_PIN6);
  23.         GPIO_setOutputLowOnPin(GPIO_PORT_P1,GPIO_PIN0);
  24.         break;
  25.     }
  26. }

  27. void main(void)
  28. {
  29.     //Stop WDT
  30.     WDT_A_hold(WDT_A_BASE);

  31.     // Set OUTPUT
  32.     GPIO_setAsOutputPin(GPIO_PORT_P4,GPIO_PIN6);    // LED1
  33.     GPIO_setAsOutputPin(GPIO_PORT_P1,GPIO_PIN0);    // LED2

  34.     // Set INPUT
  35.     GPIO_setAsInputPinWithPullUpResistor(GPIO_PORT_P4,GPIO_PIN5);

  36.     GPIO_setOutputLowOnPin(GPIO_PORT_P4,GPIO_PIN6);
  37.     GPIO_setOutputLowOnPin(GPIO_PORT_P1,GPIO_PIN0);

  38.     /*
  39.      * Disable the GPIO power-on default high-impedance mode to activate
  40.      * previously configured port settings
  41.      */
  42.     PMM_unlockLPM5();

  43.     ds_led();           // Display LED status

  44.     while(1) {

  45.         if(GPIO_INPUT_PIN_LOW==GPIO_getInputPinValue(GPIO_PORT_P4,GPIO_PIN5)) {
  46.             LedStatus++;
  47.             LedStatus &= 0x03;
  48.             ds_led();           // Display LED status

  49.             do{
  50.                 __delay_cycles(10000);
  51.             }
  52.             while(GPIO_INPUT_PIN_LOW==GPIO_getInputPinValue(GPIO_PORT_P4,GPIO_PIN5));
  53.         }


  54.     }
  55. }
复制代码

工程文件:
EX04.rar (528.44 KB, 下载次数: 38)




【TI首届低功耗设计大赛】slotg(01):Energia下的风火轮LED跑马灯
https://bbs.eeworld.com.cn/thread-450543-1-1.html

【TI首届低功耗设计大赛】slotg(02):CCS6下的风火轮LED跑马灯
https://bbs.eeworld.com.cn/thread-451185-1-1.html

【TI首届低功耗设计大赛】slotg(03):串口功能 - LED显示控制
https://bbs.eeworld.com.cn/thread-451534-1-1.html


最新回复

一个经典老帖子,最近发现一个问题,上述试验 烧写程序到CPU 后,确实已经变量是可以掉电保存的 但是,如果是在仿真环境下,连接上JTAG后,读取这个变量值,居然发现是0xFF,这是为什么,这个变量不能进行JTAG下仿真查看吗?  详情 回复 发表于 2018-8-30 15:15

赞赏

1

查看全部赞赏

 
点赞 关注(3)

回复
举报

3416

帖子

0

TA的资源

纯净的硅(高级)

沙发
 
很不错买沙发学习了,呵呵
期待楼主继续分享

点评

感谢支持,继续努力中  详情 回复 发表于 2014-11-25 11:52
 
个人签名

So TM what......?

 


回复

662

帖子

0

TA的资源

纯净的硅(初级)

板凳
 
ljj3166 发表于 2014-11-25 11:49
很不错买沙发学习了,呵呵
期待楼主继续分享

感谢支持,继续努力中
 
 
 

回复

1144

帖子

17

TA的资源

纯净的硅(高级)

4
 
fram配置方法有些麻烦,如果有更简洁的方法就更好了,学习了,
 
 
 

回复

1万

帖子

25

TA的资源

版主

5
 
好帖,需要收藏。

点评

感谢支持  详情 回复 发表于 2014-11-25 15:17
 
 
 

回复

662

帖子

0

TA的资源

纯净的硅(初级)

6
 
dcexpert 发表于 2014-11-25 15:07
好帖,需要收藏。

感谢支持
 
 
 

回复

193

帖子

3

TA的资源

一粒金砂(高级)

7
 
LedStatus++;怎么解释?

点评

当压下板上的 S1 键时,LedStatus 加1指向下一个状态,而底下一句的目的是限制 LedStatus 范围在 0-3 之间。  详情 回复 发表于 2014-11-26 23:31
 
 
 

回复

662

帖子

0

TA的资源

纯净的硅(初级)

8
 
本帖最后由 slotg 于 2014-11-26 23:36 编辑
jsxykj1 发表于 2014-11-26 23:01
LedStatus++;怎么解释?

当压下板上的 S1 键时,LedStatus 加1指向下一个状态,而底下一句的目的是限制 LedStatus 范围在 0-3 之间。
 
 
 

回复

3028

帖子

0

TA的资源

五彩晶圆(初级)

9
 
MSP430 的 FR 系列是 FRAM (铁电)工艺,该工艺的特色是可以如 RAM 存储器一般快速的读写外,掉电之后也可以保留数据,而写入的次数限制又近乎无限,几乎可以完全忽略写入的寿命问题,是一个很理想的掉电数据记忆装置。说的很好 啊   应用也很广泛了啊
 
 
 

回复

9

帖子

0

TA的资源

一粒金砂(中级)

10
 
一个经典老帖子,最近发现一个问题,上述试验 烧写程序到CPU 后,确实已经变量是可以掉电保存的
但是,如果是在仿真环境下,连接上JTAG后,读取这个变量值,居然发现是0xFF,这是为什么,这个变量不能进行JTAG下仿真查看吗?
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/6 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表