我們用的MSP430時(shí), 內(nèi)部有幾十個(gè)字節(jié)information memory 可以當(dāng)EEPROM來用, 無需再外擴(kuò)EEPROM芯片, 用量保存一下系數(shù)的掉電保存的數(shù)據(jù). 我一直用這個(gè), 很好用.
特別說明:
1.說明我用的是IAR編譯器, 在IAR上一定能通過
2. 利用information memory 作為EEPROM 掉電保存數(shù)據(jù),這是這段程序第一個(gè)亮點(diǎn);
3. 寫information memory 必須在RAM中運(yùn)行程序. 將程序從flash 跑到RAM中運(yùn)行, 很有意思. 這是第二個(gè)亮點(diǎn).
4. 源文件,下載 7824.flash.h2555.flash.c
#include "MSP430x16x.h"
#include "string.h"
#include"stdlib.h"
#include"flash.h"
/************************************************************************************
** 函數(shù)名稱: flashWrite
** 功能描述: 在MSP430flash中寫數(shù)據(jù)
**
** 輸 入: td:寫入地址, sd:源數(shù)據(jù)指針, size:寫入字節(jié)數(shù)
** 輸 出: 無
** 返 回 值: 返回需要發(fā)送給其他任務(wù)處理的數(shù)據(jù)塊的指針。
** 全局變量:
** 調(diào)用模塊:
** 作 者: 陳文浩
** 日 期: 2010年07月12日
************************************************************************************/
void flashWrite(unsigned char * td, unsigned char *sd, unsigned char size)
{
typedef void(*funp)(unsigned char*,unsigned char *, unsigned char); //定義函數(shù)指針類型
funp FLASHBLK;
char ramcode[100]; //ram內(nèi)程序及數(shù)組地址指針
_DINT();
//ramcode=(char *)malloc(sizeof(char)*100); //為放入內(nèi)存的子程分配空間(需先將heap值設(shè)為180)
FLASHBLK = flashWriteBlock; //函數(shù)指針賦值
memcpy(ramcode,(char *)FLASHBLK,100); //將塊寫子程放入ram中已分配空間
FLASHBLK=*(funp)ramcode; //將函數(shù)指針指向ram中的塊寫子程
flashErase(td); //段擦
(FLASHBLK)(td,sd, size); //塊寫(調(diào)用的是ram中的塊寫子程)
//free(ramcode); //釋放空間
_EINT(); //開放中斷
}
void flashWriteBlock(unsigned char * td,unsigned char *sd, unsigned char size)
{
int i;
while((FCTL3&BUSY)!=0x00); //檢測(cè)busy位
FCTL2=FWKEY+FSSEL_1+20; //flash模塊時(shí)鐘源為MCLK 分頻2
FCTL3=FWKEY; //解鎖
FCTL1=FWKEY+BLKWRT+WRT; //塊寫
for(i=0;i
*td++=*sd++; //寫入
while((FCTL3&WAIT)==0); //檢測(cè)wait位 是否寫入該字
}
FCTL1=FWKEY; //BLKWRT WRT位復(fù)位
while((FCTL3&BUSY)!=0x00); //檢測(cè)BUSY位
FCTL3=FWKEY+LOCK; //鎖定
}
/*******************************************************************************/
/* 段擦除子程序 */
/*******************************************************************************/
void flashErase(unsigned char *td)
{
FCTL2=FWKEY+FSSEL_1+10; //flash模塊時(shí)鐘源位MCLK 分頻2
FCTL3=FWKEY; //解鎖
FCTL1=FWKEY+ERASE; //段擦除
*td=0; //在欲進(jìn)行操作的段中空寫,啟動(dòng)擦除操作
FCTL3=FWKEY+LOCK; //鎖定
}
//功能:FLASH操作 BYTE數(shù)據(jù)寫入
//編程時(shí)鐘:257KHZ~476KHZ
void flashWriteByte(unsigned char * pdata, unsigned char data)
{
//WDTCTL = WDTPW + WDTHOLD; //關(guān)閉看門狗
_DINT(); //關(guān)閉總中斷
FCTL2 = FWKEY+FSSEL1+12; //3686400/300K=12
FCTL3 = FWKEY; //LOCK=0;
FCTL1=FWKEY+WRT; //WRT=1;
*pdata = data;
FCTL3 = FWKEY+LOCK; //
//開通看門狗
_EINT(); //開放中斷
}
void flashWriteWord(unsigned short * pdata, unsigned short data)
{
//WDTCTL = WDTPW + WDTHOLD; //關(guān)閉看門狗
_DINT(); //關(guān)閉總中斷
FCTL2 = FWKEY+FSSEL1+12;
FCTL3 = FWKEY; //LOCK=0;
FCTL1=FWKEY+WRT; //WRT=1;
*pdata = data;
FCTL3 = FWKEY+LOCK; //
//開通看門狗
_EINT(); //開放中斷
}
補(bǔ)充一點(diǎn),部分MSP430中A區(qū)中存有部分芯片調(diào)校數(shù)據(jù),如果需要利用A區(qū),需要仔細(xì)看一下DATASHEET.