【TI首届低功耗设计大赛】msp430fr5969_漫谈铁电FRAM
[复制链接]
1、MSP430FRXX系列MCU简介
TI公司最新一代MSP430FRXX系列MCU采用了FRAM作为代码和数据存储器,替代传统MCU FLASH+SRAM的结构,并且其FRAM带有分区管理和ECC校验功
能,增强存储器可靠性,FRAM运行时的低功耗特性,将MCU的功耗降低至100uA/MHz。除了FRAM外与SCI/IIC/SPI/GPIO/ADC/CMP/TIMER等普通外设外,其还增加了AES硬件加解密模块,32位硬件乘法器等,其余性能指标可详见官方数据手册,建议和传统MSP430低功耗数据做一下比较。
2、FRAM简介
FRAM (Ferroelectric Random Access Memory) 铁电存储器是新一代的非易失性高速低功耗存储器,和传统的FLASH/EEPROM存储器相比FRAM具有非
常明显的优势:
1)速度快-FRAM的写入时间比Flash/EEPROM快1000倍以上, FRAM写入一个字节仅耗时50ns,而FLASH至少耗时75us,EEPROM更是长达5ms。
2)功耗低-由于FRAM的工作电压只有1.5V ,相比FLASH/EEPROM存储器需要一个升压器把电压升到9-12V ,操作FRAM的功耗仅有后者1%或者更低。
3)抗干扰力强-由于FRAM工作仅需要很少的能量,故FRAM工作起来更加稳定,不会出现FLASH存储器的“Data-tearing”现象。
4)耐久性强(读/写次数)-FRAM的读/写周期数为一百万亿次 (10E15) ,而通常的FLASH/ EEPROM只有一百万次 (10E6) 。
3、FRAM管理器简介
为了能够充分发挥FRAM速度快,功耗低,掉电不易失,耐久性强的特点, MSP430FR5969同时为其配置了同样强大的存储器管理单元。
MSP430FRXX系列MCU对FRAM的管理可分为两部分:MPU和FRAM controller。
MPU是存储器保护单元,其可提供FRAM的分区配置和读/写/执行权限独立控制。如果发生越权读/写/执行,FRAM会受到保护,同时产生错误中断通知MCU,进行相应的操作。
FRAM控制器主要提供FRAM的操作方式管理,ECC校验和Cache功能。ECC校验可纠正1bit的错误和检测2bit以上的错误。 Cache拥有2个64bit的缓冲区,当要处理的数据小于8字节时,CPU可直接操作Cache,提高系统效率。
注意MAB为地址总线,MDB为数据总线。
4、框图比较
1)MSP430F5438框图
2)MSP430FR5969框图
我们注意看,EEM块多出了一个Energy Trace++部分,其他的就是传统的Flash被换成了FRAM了,基本都差不多的,所以说FR系列主要体现在铁电这一部分。
通过前面FRAM性能分析我们可以明显的知道FR系列MSP430有两个主要特性:FRAM的存储性能+更低的功耗控制 。
简单说说FR系列的主要应用领域,都是基于这两个特性来的。
1)在需要铁电存储的领域,将MSP430FR5969作为一个从机模块来使用,总线方式可选SPI/I2C/UART等等,配合从机模块内部程序,主机可以通过总线来操作FRAM实现存储系统,同时这个从机模块还能够帮助完成一些其他的事情,比如提供RTC、AES等等。
2)在需要ULP超低功耗的领域,由于FRAM的革新从本质上降低了功耗,相比传统的关断外设或者模块的方式、降低有效工作时间的方式这两种方式有本质的区别,从降低模块运行功耗上入手,也是当前低功耗控制的主流方式,MSP430传统系列还算是老的思维。目前fsl M0+的低功耗控制方式大家可以了解下,每个模块功耗可局级进行控制,相当复杂。
好了,这一贴就说这么多了,下面简单聊一下linkerfile吧,有利于了解memery mapping,这个很关键,对于熟悉一款MCU而言。
MEMORY
{
SFR : origin = 0x0000, length = 0x0010
PERIPHERALS_8BIT : origin = 0x0010, length = 0x00F0
PERIPHERALS_16BIT : origin = 0x0100, length = 0x0100
RAM : origin = 0x1C00, length = 0x0800
INFOA : origin = 0x1980, length = 0x0080
INFOB : origin = 0x1900, length = 0x0080
INFOC : origin = 0x1880, length = 0x0080
INFOD : origin = 0x1800, length = 0x0080
FRAM : origin = 0x4400, length = 0xBB80
FRAM2 : origin = 0x10000,length = 0x4000
JTAGSIGNATURE : origin = 0xFF80, length = 0x0004, fill = 0xFFFF
BSLSIGNATURE : origin = 0xFF84, length = 0x0004, fill = 0xFFFF
IPESIGNATURE : origin = 0xFF88, length = 0x0008, fill = 0xFFFF
INT00 : origin = 0xFF90, length = 0x0002
INT01 : origin = 0xFF92, length = 0x0002
INT02 : origin = 0xFF94, length = 0x0002
INT03 : origin = 0xFF96, length = 0x0002
INT04 : origin = 0xFF98, length = 0x0002
INT05 : origin = 0xFF9A, length = 0x0002
INT06 : origin = 0xFF9C, length = 0x0002
INT07 : origin = 0xFF9E, length = 0x0002
INT08 : origin = 0xFFA0, length = 0x0002
INT09 : origin = 0xFFA2, length = 0x0002
INT10 : origin = 0xFFA4, length = 0x0002
INT11 : origin = 0xFFA6, length = 0x0002
INT12 : origin = 0xFFA8, length = 0x0002
INT13 : origin = 0xFFAA, length = 0x0002
INT14 : origin = 0xFFAC, length = 0x0002
INT15 : origin = 0xFFAE, length = 0x0002
INT16 : origin = 0xFFB0, length = 0x0002
INT17 : origin = 0xFFB2, length = 0x0002
INT18 : origin = 0xFFB4, length = 0x0002
INT19 : origin = 0xFFB6, length = 0x0002
INT20 : origin = 0xFFB8, length = 0x0002
INT21 : origin = 0xFFBA, length = 0x0002
INT22 : origin = 0xFFBC, length = 0x0002
INT23 : origin = 0xFFBE, length = 0x0002
INT24 : origin = 0xFFC0, length = 0x0002
INT25 : origin = 0xFFC2, length = 0x0002
INT26 : origin = 0xFFC4, length = 0x0002
INT27 : origin = 0xFFC6, length = 0x0002
INT28 : origin = 0xFFC8, length = 0x0002
INT29 : origin = 0xFFCA, length = 0x0002
INT30 : origin = 0xFFCC, length = 0x0002
INT31 : origin = 0xFFCE, length = 0x0002
INT32 : origin = 0xFFD0, length = 0x0002
INT33 : origin = 0xFFD2, length = 0x0002
INT34 : origin = 0xFFD4, length = 0x0002
INT35 : origin = 0xFFD6, length = 0x0002
INT36 : origin = 0xFFD8, length = 0x0002
INT37 : origin = 0xFFDA, length = 0x0002
INT38 : origin = 0xFFDC, length = 0x0002
INT39 : origin = 0xFFDE, length = 0x0002
INT40 : origin = 0xFFE0, length = 0x0002
INT41 : origin = 0xFFE2, length = 0x0002
INT42 : origin = 0xFFE4, length = 0x0002
INT43 : origin = 0xFFE6, length = 0x0002
INT44 : origin = 0xFFE8, length = 0x0002
INT45 : origin = 0xFFEA, length = 0x0002
INT46 : origin = 0xFFEC, length = 0x0002
INT47 : origin = 0xFFEE, length = 0x0002
INT48 : origin = 0xFFF0, length = 0x0002
INT49 : origin = 0xFFF2, length = 0x0002
INT50 : origin = 0xFFF4, length = 0x0002
INT51 : origin = 0xFFF6, length = 0x0002
INT52 : origin = 0xFFF8, length = 0x0002
INT53 : origin = 0xFFFA, length = 0x0002
INT54 : origin = 0xFFFC, length = 0x0002
RESET : origin = 0xFFFE, length = 0x0002
} 复制代码
1)注意看一下下面三个部分的区间定义:
RAM : origin = 0x1C00, length = 0x0800
INFOA : origin = 0x1980, length = 0x0080
INFOB : origin = 0x1900, length = 0x0080
INFOC : origin = 0x1880, length = 0x0080
INFOD : origin = 0x1800, length = 0x0080
FRAM : origin = 0x4400, length = 0xBB80
FRAM2 : origin = 0x10000,length = 0x4000
2)关于堆栈的设置:
3)关于MPU的配置会跟新到cmd文件中的:
好了,欢迎大家讨论,个人认为大家不要去想如何使用FRAM作为程序执行的RAM的问题了,默认的RAM是2K可以参考1)中的区域定义。