这一篇是 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 保持在掉电前的状态。
掉电前状态
掉电
再上电
程序码:
- #include "driverlib.h"
- #pragma SET_DATA_SECTION(".fram_vars")
- uint8_t LedStatus;
- #pragma SET_DATA_SECTION()
- // Display LED status
- void ds_led(void)
- {
- switch(LedStatus){
- case 1:
- GPIO_setOutputHighOnPin(GPIO_PORT_P4,GPIO_PIN6); // LED1
- GPIO_setOutputLowOnPin(GPIO_PORT_P1,GPIO_PIN0); // LED2
- break;
- case 2:
- GPIO_setOutputLowOnPin(GPIO_PORT_P4,GPIO_PIN6);
- GPIO_setOutputHighOnPin(GPIO_PORT_P1,GPIO_PIN0);
- break;
- case 3:
- GPIO_setOutputHighOnPin(GPIO_PORT_P4,GPIO_PIN6);
- GPIO_setOutputHighOnPin(GPIO_PORT_P1,GPIO_PIN0);
- break;
- default:
- GPIO_setOutputLowOnPin(GPIO_PORT_P4,GPIO_PIN6);
- GPIO_setOutputLowOnPin(GPIO_PORT_P1,GPIO_PIN0);
- break;
- }
- }
- void main(void)
- {
- //Stop WDT
- WDT_A_hold(WDT_A_BASE);
- // Set OUTPUT
- GPIO_setAsOutputPin(GPIO_PORT_P4,GPIO_PIN6); // LED1
- GPIO_setAsOutputPin(GPIO_PORT_P1,GPIO_PIN0); // LED2
- // Set INPUT
- GPIO_setAsInputPinWithPullUpResistor(GPIO_PORT_P4,GPIO_PIN5);
- GPIO_setOutputLowOnPin(GPIO_PORT_P4,GPIO_PIN6);
- GPIO_setOutputLowOnPin(GPIO_PORT_P1,GPIO_PIN0);
- /*
- * Disable the GPIO power-on default high-impedance mode to activate
- * previously configured port settings
- */
- PMM_unlockLPM5();
- ds_led(); // Display LED status
- while(1) {
- if(GPIO_INPUT_PIN_LOW==GPIO_getInputPinValue(GPIO_PORT_P4,GPIO_PIN5)) {
- LedStatus++;
- LedStatus &= 0x03;
- ds_led(); // Display LED status
- do{
- __delay_cycles(10000);
- }
- while(GPIO_INPUT_PIN_LOW==GPIO_getInputPinValue(GPIO_PORT_P4,GPIO_PIN5));
- }
- }
- }
复制代码
工程文件:
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