張侃侃
(中國電建集團(tuán)中南勘測(cè)設(shè)計(jì)研究院有限公司,湖南長(zhǎng)沙,410014)
基于IAR EW430開發(fā)環(huán)境的FRAM應(yīng)用研究
張侃侃
(中國電建集團(tuán)中南勘測(cè)設(shè)計(jì)研究院有限公司,湖南長(zhǎng)沙,410014)
本文基于TI的MSP-EXP430FR5739 LaunchPad 硬件評(píng)估套件和 IAR EW430 IDE開發(fā)環(huán)境,研究了MSP430FR5739型MCU的FRAM分區(qū)配置方法,分別采用程序代碼關(guān)鍵字聲明法及面對(duì)復(fù)雜應(yīng)用滿足更高定制要求時(shí)修改XLINK配置文件法共兩種方法實(shí)現(xiàn)了分區(qū)調(diào)配,編寫了相應(yīng)測(cè)試程序進(jìn)行實(shí)驗(yàn),驗(yàn)證結(jié)果達(dá)到了預(yù)期。同時(shí)對(duì)實(shí)際應(yīng)用中FRAM分區(qū)后應(yīng)進(jìn)行MPU保護(hù)做出闡述,本文提出的方法可用于MSP430FR系列其他型號(hào)MCU器件的FRAM調(diào)配。
FRAM MCU;地址空間;內(nèi)存調(diào)配
MSP430是TI(美國德州儀器)推出的超低功耗MCU(微控制器:Microcontroller Unit),其中MSP430FR系列是TI把最新的半導(dǎo)體FRAM技術(shù)應(yīng)用在MCU上。其中,鐵電隨機(jī)存儲(chǔ)器FRAM(Ferroelectric Random Access Memory)是最新的非易失性存儲(chǔ)器技術(shù),它具有寫入次數(shù)幾乎無限(高達(dá)100萬億次),掉電不易失、存取時(shí)間對(duì)稱、讀寫速度快,耐受度高,功耗低等一系列優(yōu)勢(shì)[1],特別是在MCU應(yīng)用中允許開發(fā)人員通過軟件動(dòng)態(tài)調(diào)配數(shù)據(jù)和程序存儲(chǔ)分區(qū)大小,真正實(shí)現(xiàn)了二者的統(tǒng)一,具有很強(qiáng)的技術(shù)優(yōu)勢(shì),因而在自動(dòng)控制、儀器儀表嵌入式設(shè)計(jì)領(lǐng)域中受到越來越多的關(guān)注。
本文基于IAR EW430的環(huán)境,對(duì)MSP430FR5739型MCU的FRAM分區(qū)配置方法進(jìn)行研究,提出了兩種不同的方法來實(shí)現(xiàn)分區(qū),并通過測(cè)試程序驗(yàn)證了其可行性。對(duì)于其他型號(hào)MCU器件的FRAM調(diào)配,可參考本文中的方法。
嵌入式微控制器MCU的性價(jià)比一直是技術(shù)人員在選型時(shí)需要著重考慮的問題,其速度快功耗低與經(jīng)濟(jì)性之間的矛盾向來不容易解決。FRAM型一體化MCU的出現(xiàn)很好地解決了這一難題,它解決了傳統(tǒng)SRAM+Flash架構(gòu)的MCU的最主要兩方面的性價(jià)比問題。
第一,在進(jìn)行一些數(shù)學(xué)運(yùn)算的應(yīng)用中,需較大的RAM空間來存放數(shù)據(jù)樣本,未必要用到大容量的用于存儲(chǔ)程序的Flash,如數(shù)據(jù)采集中的標(biāo)準(zhǔn)差運(yùn)算。但在MCU器件選型手冊(cè)中,一般大容量的片內(nèi)RAM都配備了更大容量的片內(nèi)Flash,相對(duì)應(yīng)型號(hào)器件的價(jià)位也較高,因此在此方面的應(yīng)用性價(jià)比很低。而一體化FRAM型MCU可以根據(jù)應(yīng)用程序的需要?jiǎng)討B(tài)劃分?jǐn)?shù)據(jù)和代碼存儲(chǔ)區(qū)空間,可做到“按需調(diào)配”,如圖1所示。

圖1 支持“按需使用滑動(dòng)條分割”數(shù)據(jù)和代碼存儲(chǔ)空間
第二,幾近無限的寫入次數(shù),并且數(shù)據(jù)不易失。在一些成本控制嚴(yán)格的應(yīng)用中,可以省去后備電池或者EEPROM。
綜上所述,嵌入式SOC結(jié)合FRAM形成的一體化MCU具有很強(qiáng)的技術(shù)優(yōu)勢(shì)。本文主要在IAR EW430 開發(fā)環(huán)境下,基于TI的MSP-EXP430FR5739 LaunchPad 硬件評(píng)估套件,對(duì)型號(hào)為MSP-430FR5739的MCU的FRAM進(jìn)行分區(qū)配置,同時(shí)編寫了測(cè)試程序進(jìn)行實(shí)驗(yàn)驗(yàn)證,對(duì)于其他型號(hào)MCU器件的FRAM調(diào)配,可參考本文進(jìn)行。
根據(jù)MSP430FR5739的器件手冊(cè)描述[3],圖2為芯片的內(nèi)存組織結(jié)構(gòu)圖。
從圖2中可以看出,MSP430FR5739器件片上有1K的SRAM(地址為:0x1C00~0x1FFF),15.5K的FRAM(地址為:0xC200~0xFFFF),其中 Main Memory 的地址為 :0xC200~0xFF7F。本文對(duì)數(shù)據(jù)和程序存儲(chǔ)空間的調(diào)配劃分,指的就是對(duì)Main Memory進(jìn)行配置。在下面的內(nèi)容中將詳細(xì)介紹配置方法。

圖2 MSP430FR5739內(nèi)存組織結(jié)構(gòu)圖
本節(jié)對(duì)FRAM進(jìn)行重新配置是基于IAR EW430開發(fā)環(huán)境進(jìn)行的,IAR EW430默認(rèn)的鏈接器配置文件是*.xcl(XLINK Configuration File),即IAR的XLINK配置文件,其后綴名為.xcl。該文件位于軟件安裝目錄下“
在IAR默認(rèn)的lnk430fr5739.xcl中,可以看到如下的命令行:
// RAM memory
-Z(DATA)DATA16_I,DATA16_Z,DATA16_N,TLS16_I=1C00-1FFF
-Z(DATA)CODE_I
-Z(DATA)DATA20_I,DATA20_Z,DATA20_N
-Z(DATA)CSTACK+_STACK_SIZE#
// FRAM memory
// Read/write data in FRAM
-Z(CONST)DATA16_P,DATA20_P=C200-FF7F
-Z(DATA)DATA16_HEAP+_DATA16_HEAP_SIZE,DATA20_HEAP+_DATA20_HEAP_SIZE
在上面的代碼中,通過對(duì)不同字段進(jìn)行預(yù)配置,可以告知鏈接器對(duì)不同類型的變量(字段)按照預(yù)配置地址參數(shù)進(jìn)行空間分配。對(duì)FRAM的劃分從根本上都和XLINK配置文件有關(guān),下文中介紹兩種方法來實(shí)現(xiàn)對(duì)FRAM的分區(qū)調(diào)配。
第一種方法是在不改變默認(rèn)配置文件的前提下,在程序代碼中定義前綴為“__persistent”的變量數(shù)組來將其定義在FRAM中。在上述命令行中可以看到,默認(rèn)配置文件lnk430fr5739.xcl中已經(jīng)指定了“Z(CONST)DATA16_P,DATA20_P”分配在FRAM區(qū)域的0xC200~0xFF7F地址空間,因此,我們只要在程序代碼中定義變量或數(shù)據(jù)塊時(shí),采用關(guān)鍵字“__persistent”進(jìn)行聲明,編譯鏈接器會(huì)自動(dòng)將其分配到FRAM區(qū)域0xC200~0xFF7F地址空間中。
為了測(cè)試該功能,我們?cè)贛SP-EXP430FR5739 LaunchPad的測(cè)試程序上添加“zkTestFram.c”模塊,使用關(guān)鍵字“__persistent”定義了一個(gè)“FRAM_LEN = 2048”長(zhǎng)度測(cè)試數(shù)組,聲明代碼如下:
__persistent volatile unsigned char testFram[FRAM_LEN];
采用framInit()對(duì)數(shù)據(jù)塊進(jìn)行初始化,代碼如下:
void framInit( void )
{
for(int i = 0; i < sizeof(testFram); ++i)
{ testFram[i] = (unsigned char)i; }
return;
}
程序下載后,進(jìn)入調(diào)試界面,可以看到testFram [FRAM_LEN]數(shù)組被編譯器分配的首地址為0xC200,尾地址為0xC9FF,共2048個(gè)數(shù)據(jù)存儲(chǔ)單元。如圖3所示,圖3(a)是變量監(jiān)視窗口testFram的首地址0xC200,;圖3(b)是MCU相對(duì)應(yīng)FRAM區(qū)的內(nèi)存內(nèi)容;圖3(c)和圖3(d) 所示是testFram的尾地址0xC9FF及相對(duì)應(yīng)FRAM區(qū)的內(nèi)存內(nèi)容。并且,測(cè)試程序中的其他變量或數(shù)據(jù)被編譯器分配在SARM地址“0x1C00~0x1FFF”空間,如圖4所示。


圖3 testFram數(shù)組在FRAM區(qū)的首尾、內(nèi)存地址

圖4 程序中其他變量或數(shù)據(jù)被分配在SRAM地址
第二種方法,根據(jù)用戶應(yīng)用程序大小,自定義XLINK配置文件, 通過直接在lnk430fr5739.xcl配置文件中重新劃分變量和其地址空間來實(shí)現(xiàn)。這樣有利于后續(xù)的內(nèi)存分區(qū)保護(hù)。在進(jìn)行重新分配時(shí),一般按照如下原則進(jìn)行。
(1)臨時(shí)變量、堆棧區(qū)定義到SRAM;
(2)快速存取且需掉電保存的變量定義到FRAM。
根據(jù)上述原則,我們修改默認(rèn)的lnk430fr5739.xcl配置文件,修改后的文件內(nèi)容如圖5(b)所示。圖5(a)為修改前的原始文件內(nèi)容。

圖5 XLINK配置文件修改前后對(duì)比圖
通過修改配置文件,我們對(duì)不同字段進(jìn)行了地址空間預(yù)分配,其中堆棧區(qū)位于SRAM地址空間(1C00-1FFF),采用關(guān)鍵字__no_init聲明的變量位于FRAM區(qū)1KB長(zhǎng)度的D200-D5FF地址空間,其他的變量及數(shù)據(jù)塊位于FRAM區(qū)4KB長(zhǎng)度的C200-D1FF地址空間,程序代碼空間位于FRAM區(qū)約10K長(zhǎng)度D600-FF7F的地址空間。測(cè)試程序,如下:
#define FRAM_LEN 2048
extern volatile unsigned char testFram[FRAM_LEN];
extern void fRAMInit( void );
extern __no_init volatile unsigned char testFram2[128];
extern void fRAMInit2( void );
程序下載后進(jìn)入調(diào)試模式,如圖6(a)和圖6(b)可以看出testFram [FRAM_LEN]數(shù)組被編譯器分配的首地址為0xC222,尾地址為0xCA21,共2048個(gè)FARM數(shù)據(jù)存儲(chǔ)單元;如圖6(c)和圖6(d)可以看出testFram2 [128]數(shù)組被編譯器分配的首地址為0xD200,尾地址為0xD27F,共128個(gè)FARM數(shù)據(jù)存儲(chǔ)單元。

圖6 testFram[2048]及testFram2 [128]數(shù)組在FRAM區(qū)的首尾、內(nèi)存地址
綜上所述,利用IAR EW430的變量查看窗口及MCU的FRAM區(qū)的內(nèi)存,可以直觀呈現(xiàn)我們所定義的數(shù)據(jù)塊地址及內(nèi)容,和我們的預(yù)期相符,驗(yàn)證了這兩種內(nèi)存調(diào)配方法是切實(shí)可行的。
在上面的測(cè)試實(shí)驗(yàn)中,由于數(shù)據(jù)和程序代碼都在統(tǒng)一地址空間,并且FRAM易擦寫,為了確保應(yīng)用系統(tǒng)的最大魯棒性和數(shù)據(jù)完整性,應(yīng)為這些分區(qū)啟用MPU功能,有助于在程序故障(軟件崩潰),緩沖區(qū)溢出,指針損壞和其他類型的異常情況下,防止對(duì)存放FRAM區(qū)的數(shù)據(jù)和程序代碼意外的訪問修改[4]。
TI提供了MPU保護(hù)機(jī)制,可以對(duì)MCU的FRAM分三段保護(hù)。在上文第二種方法中,F(xiàn)RAM區(qū)被分為三段,我們可以在IAR EW430的器件啟動(dòng)加載過程“__low_level_init.c”文件中添加MPU相關(guān)的代碼進(jìn)行保護(hù)。如圖7所示為FRAM區(qū)的分段地址。

圖7 FRAM區(qū)分段地址
對(duì)應(yīng)的MPU保護(hù)單元配置代碼如下:
MPUCTL0 = MPUPW;
// Write PWD to access MPU registers
MPUSEG=0x0B09;
// 把Main memory 分成三段B1=0xD200, B2=0xD600
MPUSAM=(MPUSEG1WE | MPUSEG1RE | MPUSEG2WE |MPUSEG-2RE | MPUSEG3RE | MPUSEG3XE | MPUSEG1VS);
MPUCTL0=MPUPW | MPUENA; // Enable MPU protection
基于上述MPU配置代碼,如產(chǎn)生非法訪問,可以在對(duì)應(yīng)的中斷程序中進(jìn)行相應(yīng)的應(yīng)急處理。
除此之外,如果對(duì)MPU定制要求不高,也可以通過在IAR工程Project Options—> General Options—> MPU/IPE選項(xiàng)卡中選擇“Enable MPU”啟用MPU保護(hù)功能,如圖8所示。
本文以MSP430FR5739器件為例,在IAR EW430 IDE環(huán)境下,通過使用兩種方法對(duì)FRAM進(jìn)行分區(qū)配置,為了滿足實(shí)際應(yīng)用的需求,在程序中加入了MPU分段權(quán)限保護(hù)單元,以防程序受干擾“跑飛”而導(dǎo)致的誤操作。同時(shí),本文編寫測(cè)試程序進(jìn)行了實(shí)驗(yàn)驗(yàn)證,證明配置方法可行,可滿足大部分的應(yīng)用情況。

圖8 IAR EW430中啟用MPU內(nèi)存保護(hù)
[1]鄧穎.MSP430FRAM鐵電單片機(jī)原理及C程序設(shè)計(jì)[M].北京:北京航空航天大學(xué)出版社,2012.
[2]MSP430 FRAM Technology-How To and Best Practices(SLAA628).
[3]MSP430FR573x Mixed-Signal Microcontrollers Datasheet(Rev. K) (SLAS639K).
[4]MSP430FR57xx Family User’s Guide(SLAU272C).
[5]胡大可.MSP430 系列FLASH型超低功耗[5]16位單片機(jī)[M].北京:北京航空航天大學(xué)出版社,2001.
Research on Application of FRAM Based on IAR EW430 Development Environment
Zhang Kankan
(Power China ZhongNan Engineering Corporation Limited, ChangSha Hunan, 410014)
Based on TI’s MSP-EXP430FR5739 LaunchPad hardware evaluation kit and IAR EW430 IDE development environment, this paper studies the FRAM partition allocation method of MSP430FR5739 MCU, where two methods are introduced to achieve the partition deployment. This first one is keyword declaration method in program code. Another one is the modification method of XLINK configuration file to meet the higher customized requirements in complex application. Experiments are implemented to verify the two methods. At the same time, it is necessary to make MPU protection after FRAM partitioning in practical application. The proposed method can also be used for FRAM deployment in other types MCU devices of MSP430FR series.
FRAM;MCU; address space;memory provisioning