欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136
標(biāo)題:
MSP430F全系列Flash存儲(chǔ)器通用程序庫(kù)
[打印本頁(yè)]
作者:
51hei單片
時(shí)間:
2016-3-14 20:10
標(biāo)題:
MSP430F全系列Flash存儲(chǔ)器通用程序庫(kù)
本程序是《MSP430系列單片機(jī)系統(tǒng)工程設(shè)計(jì)與實(shí)踐》書(shū)里面的源碼,(包含工程文件(例4.1.6))完整例程下載:
http://www.raoushi.com/bbs/dpj-46245-1.html
關(guān)于本程序的詳細(xì)解說(shuō)大家可以點(diǎn)擊上圖下載電子書(shū)
這個(gè)Flash存儲(chǔ)器庫(kù)文件的調(diào)用方法可先下載完整代碼然后找到(例4.1.6)這一節(jié),里面有調(diào)用方法
Flash.c文件:
/*
MSP430F全系列Flash存儲(chǔ)器通用程序庫(kù)
說(shuō)明:該程序庫(kù)包含了內(nèi)部Flash存儲(chǔ)器常用的讀寫(xiě)功能,還包含了常用數(shù)據(jù)
格式變量的保存、讀取函數(shù)。除了字節(jié)讀寫(xiě)之外,還可以很方便的向
FlashROM里寫(xiě)入和讀出整型、浮點(diǎn)數(shù)、長(zhǎng)整型格式的數(shù)據(jù)。
由于Flash存儲(chǔ)器不能單字節(jié)擦除或改寫(xiě),因此寫(xiě)入任何字節(jié)都需
要先備份整個(gè)數(shù)據(jù)區(qū)再整塊擦除,之后恢復(fù)其他未改變數(shù)據(jù)。本程序利
用兩個(gè)Flash存儲(chǔ)區(qū)(InfoA和InfoB)互相備份信息,優(yōu)點(diǎn)是備份過(guò)程不
占用RAM,能在RAM小于256字節(jié)的單片機(jī)上運(yùn)行;缺點(diǎn)是速度慢,且浪費(fèi)
了1/2的存儲(chǔ)容量。適合小批量數(shù)據(jù)且不關(guān)心寫(xiě)入速度的場(chǎng)合,如菜單
保存設(shè)置參數(shù)等。另外注意Flash壽命只有10萬(wàn)次左右,不要頻繁調(diào)用
寫(xiě)函數(shù)。寫(xiě)Flash時(shí),電源電壓必須高于2.7V。
本程序庫(kù)中所有的讀寫(xiě)函數(shù)對(duì)外已經(jīng)屏蔽了Flash特征,存儲(chǔ)地址
空間從0開(kāi)始到127。如果實(shí)際用到的數(shù)據(jù)量很少,可修改MAXNUM定義,
以節(jié)省執(zhí)行時(shí)間。如果需要保存的數(shù)據(jù)量大于128,可修改存儲(chǔ)區(qū)首地址
和備份區(qū)首地址的定義,指向程序Flash區(qū)中程序代碼和中斷向量表未
占用的空白區(qū)塊,能獲得512字節(jié)的存儲(chǔ)容量。
要使用該庫(kù)函數(shù),需要將本文件(Flash.c)添加進(jìn)工程,并在需要
調(diào)用函數(shù)的文件開(kāi)頭處包含"Flash.h"。
(C)西安電子科技大學(xué) 測(cè)控技術(shù)與儀器教研中心 編寫(xiě):謝楷 2008/02/04
*/
//
//
// MSP430F4XX
// +---------------+
// | |
// | XOUT|-----
// | | 32.768KHz Watch Crystal
// | XIN|-----
// | |
// +---------------+
#include "MSP430x42x.h"
#define MAXNUM 32 /*存儲(chǔ)的總數(shù)據(jù)量(字節(jié)),最大128*/
/*由于每個(gè)數(shù)據(jù)都需要備份,總數(shù)據(jù)量越小速度越快,不要留太多余量*/
/*后面存儲(chǔ)、讀取函數(shù)可用的存儲(chǔ)地址空間為0~(MAXNUM-1)*/
#define FLASH_SAVEADDR (0x1080) /*Flash數(shù)據(jù)存儲(chǔ)區(qū)首地址(InfoB)*/
#define FLASH_COPYADDR (0x1000) /*Flash備份存儲(chǔ)區(qū)首地址(InfoA)*/
union LongChar //長(zhǎng)整字節(jié) 復(fù)合結(jié)構(gòu)
{ unsigned long int Long;
struct ByteL4
{ unsigned char BHH;
unsigned char BHL;
unsigned char BLH;
unsigned char BLL;
}Bytes;
};
union FloatChar //浮點(diǎn)字節(jié) 復(fù)合結(jié)構(gòu)
{ float Float;
struct ByteF4
{ unsigned char BHH;
unsigned char BHL;
unsigned char BLH;
unsigned char BLL;
}Bytes;
};
unsigned char FLASH_PSR;
#define DISABLE_INT; FLASH_PSR=__get_SR_register();_DINT();
#define RESTORE_INT; if(FLASH_PSR & GIE) _EINT();
/****************************************************************************
* 名 稱(chēng):Flash_Init()
* 功 能:對(duì)Flash時(shí)鐘進(jìn)行初始化設(shè)置
* 入口參數(shù):無(wú)
* 出口參數(shù):無(wú)
* 說(shuō) 明: 如需使用后面的讀寫(xiě)函數(shù),在程序開(kāi)始必須先調(diào)用該初始化函數(shù)
配置Flash時(shí)鐘必須在257~476KHz之間!!
****************************************************************************/
void Flash_Init(void)
{
FCTL2 = FWKEY + FSSEL_2 + FN1; // 默認(rèn) SMCLK/3 =349KHz
}
/* Flash時(shí)鐘必須在257~476KHz之間, */
/* 分頻系數(shù)= 32*FN5 + 16*FN4 + 8*FN3 + 4*FN2 + 2*FN1 + FN0 + 1 */
// Flash時(shí)鐘選擇:
/* FSSEL_0 Flash clock select: 0 - ACLK */
/* FSSEL_1 Flash clock select: 1 - MCLK */
/* FSSEL_2 Flash clock select: 2 - SMCLK */
/****************************************************************************
* 名 稱(chēng):Flash_Busy()
* 功 能:Flash忙等待
* 入口參數(shù):無(wú)
* 出口參數(shù):無(wú)
* 說(shuō) 明: 若Flash忙則等待,直到Flash操作完成(空閑)才返回。
****************************************************************************/
void Flash_Busy()
{
while((FCTL3 & BUSY) == BUSY){_NOP();} //Busy
}
/****************************************************************************
* 名 稱(chēng):Flash_Erase()
* 功 能:擦除Flash的一個(gè)數(shù)據(jù)塊
* 入口參數(shù):Addr:被擦除數(shù)據(jù)塊的首地址
* 出口參數(shù):無(wú)
****************************************************************************/
void Flash_Erase(unsigned int Addr)
{ unsigned char *Flash_ptr;
Flash_ptr=(unsigned char *)Addr;
FCTL1 = FWKEY + ERASE; // Set Erase bit
FCTL3 = FWKEY; // Clear Lock bit
DISABLE_INT;
*Flash_ptr = 0; // Dummy write to erase Flash segment B
Flash_Busy(); //Busy
RESTORE_INT;
FCTL1 = FWKEY; // Lock
FCTL3 = FWKEY+LOCK; // Set Lock bit
}
/****************************************************************************
* 名 稱(chēng):Flash_CopyA2B()
* 功 能:將數(shù)據(jù)區(qū)的內(nèi)容拷貝到備份區(qū)
* 入口參數(shù):無(wú)
* 出口參數(shù):無(wú)
****************************************************************************/
void Flash_CopyA2B()
{
unsigned char *Flash_ptrA; // Segment A pointer
unsigned char *Flash_ptrB; // Segment B pointer
unsigned int i;
Flash_ptrA = (unsigned char *) FLASH_SAVEADDR; // Initialize Flash segment A pointer
Flash_ptrB = (unsigned char *) FLASH_COPYADDR; // Initialize Flash segment B pointer
Flash_Erase(FLASH_COPYADDR);
FCTL1 = FWKEY + WRT; // Set WRT bit for write operation
FCTL3 = FWKEY; // Clear Lock bit
for (i=0; i<MAXNUM; i++)
{
DISABLE_INT;
*Flash_ptrB++ = *Flash_ptrA++; // copy value segment A to segment B
Flash_Busy(); //Busy
RESTORE_INT;
}
FCTL1 = FWKEY; // Clear WRT bit
FCTL3 = FWKEY + LOCK; // Set LOCK bit
}
/****************************************************************************
* 名 稱(chēng):Flash_WriteChar()
* 功 能:向Flash中寫(xiě)入一個(gè)字節(jié)(Char型變量)
* 入口參數(shù):Addr:存放數(shù)據(jù)的地址
Data:待寫(xiě)入的數(shù)據(jù)
* 出口參數(shù):無(wú)
* 范 例:Flash_WriteChar(0,123);將常數(shù)123寫(xiě)入0單元
Flash_WriteChar(1,a);將整型變量a寫(xiě)入1單元
****************************************************************************/
void Flash_WriteChar (unsigned int Addr,unsigned char Data)
{
unsigned char *Flash_ptrA; // Segment A pointer
unsigned char *Flash_ptrB; // Segment B pointer
unsigned int i;
Flash_CopyA2B(); //Flash內(nèi)的數(shù)據(jù)先保存起來(lái)
Flash_ptrA = (unsigned char *) FLASH_SAVEADDR;// Initialize Flash segment A pointer
Flash_ptrB = (unsigned char *) FLASH_COPYADDR;// Initialize Flash segment B pointer
Flash_Erase(FLASH_SAVEADDR);
FCTL1 = FWKEY + WRT; // Set WRT bit for write operation
FCTL3 = FWKEY; // Clear Lock bit
for (i=0; i<MAXNUM; i++)
{
DISABLE_INT;
if(i==Addr)
{
*Flash_ptrA++ =Data; // Save Data
Flash_Busy(); //Busy
Flash_ptrB++;
}
else
{
*Flash_ptrA++ = *Flash_ptrB++; // 恢復(fù)Flash內(nèi)的其他數(shù)據(jù)
Flash_Busy(); //Busy
}
RESTORE_INT;
}
FCTL1 = FWKEY; // Clear WRT bit
FCTL3 = FWKEY + LOCK; // Set LOCK bit
}
/****************************************************************************
* 名 稱(chēng):Flash_ReadChar()
* 功 能:從Flash中讀取一個(gè)字節(jié)
* 入口參數(shù):Addr:存放數(shù)據(jù)的地址
* 出口參數(shù):讀回的數(shù)據(jù)
****************************************************************************/
unsigned char Flash_ReadChar (unsigned int Addr)
{ unsigned char Data;
unsigned char *Flash_ptrA; // Segment A pointer
Flash_ptrA = (unsigned char *) FLASH_SAVEADDR; // Initialize Flash segment A pointer
Data=*(Flash_ptrA+Addr);
return(Data);
}
/****************************************************************************
* 名 稱(chēng):Flash_WriteWord()
* 功 能:向Flash寫(xiě)入一個(gè)整型變量
* 入口參數(shù):Addr:被寫(xiě)入FlashROM單元的地址
Data:待寫(xiě)入的整型變量(2字節(jié)數(shù)據(jù))
* 出口參數(shù):無(wú)
* 說(shuō) 明: 該函數(shù)保存數(shù)據(jù)將占用Addr和Addr+1兩個(gè)存儲(chǔ)單元
* 范 例:Flash_WriteWord(2,1234);將常數(shù)1233寫(xiě)入2~3單元
Flash_WriteWord(4,a);將整型變量a寫(xiě)入4~5單元
****************************************************************************/
void Flash_WriteWord (unsigned int Addr,unsigned int Data)
{
unsigned char *Flash_ptrA; // Segment A pointer
unsigned char *Flash_ptrB; // Segment B pointer
unsigned int i;
Flash_CopyA2B(); //Flash內(nèi)的數(shù)據(jù)先保存起來(lái)
Flash_ptrA = (unsigned char *) FLASH_SAVEADDR;// Initialize Flash segment A pointer
Flash_ptrB = (unsigned char *) FLASH_COPYADDR;// Initialize Flash segment B pointer
Flash_Erase(FLASH_SAVEADDR);
FCTL1 = FWKEY + WRT; // Set WRT bit for write operation
FCTL3 = FWKEY; // Clear Lock bit
for (i=0; i<MAXNUM; i++)
{
DISABLE_INT;
if(i==Addr)
{
*Flash_ptrA++ =Data/256; // Save Data
Flash_Busy(); //Busy
*Flash_ptrA++ =Data%256; // Save Data
Flash_Busy(); //Busy
Flash_ptrB+=2;
}
else
{
*Flash_ptrA++ = *Flash_ptrB++; // 恢復(fù)Flash內(nèi)的其他數(shù)據(jù)
Flash_Busy(); //Busy
}
RESTORE_INT;
}
FCTL1 = FWKEY; // Clear WRT bit
FCTL3 = FWKEY + LOCK; // Set LOCK bit
}
/****************************************************************************
* 名 稱(chēng):Flash_ReadWord()
* 功 能:從FlashROM讀回一個(gè)整型變量
* 入口參數(shù):Addr:待讀出變量FlashROM單元的起始地址(存入的地址)
* 出口參數(shù):讀回的整型變量值
****************************************************************************/
unsigned int Flash_ReadWord (unsigned int Addr)
{ unsigned int Data;
unsigned char *Flash_ptrA; // Segment A pointer
Flash_ptrA = (unsigned char *) FLASH_SAVEADDR;// Initialize Flash segment A pointer
Data=*(Flash_ptrA+Addr)*256+*(Flash_ptrA+Addr+1);
return(Data);
}
/****************************************************************************
* 名 稱(chēng):Flash_WriteLong()
* 功 能:向FlashROM寫(xiě)入一個(gè)長(zhǎng)整型變量
* 入口參數(shù):Addr:被寫(xiě)入FlashROM單元的地址
Data:待寫(xiě)入的長(zhǎng)整型變量(4字節(jié)數(shù)據(jù))
* 出口參數(shù):無(wú)
* 說(shuō) 明: 該函數(shù)保存數(shù)據(jù)將占用Addr到Addr+3 共4個(gè)存儲(chǔ)單元
* 范 例:Flash_WriteLong(7,123456);將長(zhǎng)整型數(shù)123456寫(xiě)入7~10單元
Flash_WriteLong(11,a);將長(zhǎng)整型變量a寫(xiě)入11~14單元
****************************************************************************/
void Flash_WriteLong (unsigned int Addr,unsigned long int Data)
{
union LongChar LData;
unsigned char *Flash_ptrA; // Segment A pointer
unsigned char *Flash_ptrB; // Segment B pointer
unsigned int i;
LData.Long=Data;
Flash_CopyA2B(); //Flash內(nèi)的數(shù)據(jù)先保存起來(lái)
Flash_ptrA = (unsigned char *) FLASH_SAVEADDR;// Initialize Flash segment A pointer
Flash_ptrB = (unsigned char *) FLASH_COPYADDR;// Initialize Flash segment B pointer
Flash_Erase(FLASH_SAVEADDR);
FCTL1 = FWKEY + WRT; // Set WRT bit for write operation
FCTL3 = FWKEY; // Clear Lock bit
for (i=0; i<MAXNUM; i++)
{
DISABLE_INT;
if(i==Addr)
{
*Flash_ptrA++ =LData.Bytes.BHH; // Save Data
Flash_Busy(); //Busy
*Flash_ptrA++ =LData.Bytes.BHL; // Save Data
Flash_Busy(); //Busy
*Flash_ptrA++ =LData.Bytes.BLH; // Save Data
Flash_Busy(); //Busy
*Flash_ptrA++ =LData.Bytes.BLL; // Save Data
Flash_Busy(); //Busy
Flash_ptrB+=4;
}
else
{
*Flash_ptrA++ = *Flash_ptrB++; // 恢復(fù)Flash內(nèi)的其他數(shù)據(jù)
Flash_Busy(); //Busy
}
RESTORE_INT;
}
FCTL1 = FWKEY; // Clear WRT bit
FCTL3 = FWKEY + LOCK; // Set LOCK bit
}
/****************************************************************************
* 名 稱(chēng):Flash_ReadLong()
* 功 能:從FlashROM讀回一個(gè)長(zhǎng)整型變量
* 入口參數(shù):Addr:待讀出變量所在FlashROM單元的起始地址(存入的地址)
* 出口參數(shù):讀回的長(zhǎng)整型變量值
****************************************************************************/
unsigned long int Flash_ReadLong (unsigned int Addr)
{
unsigned char *Flash_ptrA; // Segment A pointer
union LongChar Data;
Flash_ptrA = (unsigned char *) FLASH_SAVEADDR;// Initialize Flash segment A pointer
Flash_ptrA+=Addr;
Data.Bytes.BHH=*Flash_ptrA++;
Data.Bytes.BHL=*Flash_ptrA++;
Data.Bytes.BLH=*Flash_ptrA++;
Data.Bytes.BLL=*Flash_ptrA++;
return(Data.Long);
}
/****************************************************************************
* 名 稱(chēng):Flash_WriteFloat()
* 功 能:向FlashROM寫(xiě)入一個(gè)浮點(diǎn)型變量
* 入口參數(shù):Addr:被寫(xiě)入FlashROM單元的地址
Data:待寫(xiě)入的浮點(diǎn)型變量(4字節(jié)數(shù)據(jù))
* 出口參數(shù):無(wú)
* 說(shuō) 明: 該函數(shù)保存數(shù)據(jù)將占用Addr到Addr+3 共4個(gè)存儲(chǔ)單元
* 范 例:Flash_WriteFloat(15,3.14159);將浮點(diǎn)數(shù)3.14159寫(xiě)入15~18單元
Flash_WriteFloat(19,a);將浮點(diǎn)變量a寫(xiě)入19~22單元
****************************************************************************/
void Flash_WriteFloat (unsigned int Addr,float Data)
{
union FloatChar FData;
unsigned char *Flash_ptrA; // Segment A pointer
unsigned char *Flash_ptrB; // Segment B pointer
unsigned int i;
FData.Float=Data;
Flash_CopyA2B(); //Flash內(nèi)的數(shù)據(jù)先保存起來(lái)
Flash_ptrA = (unsigned char *) FLASH_SAVEADDR;// Initialize Flash segment A pointer
Flash_ptrB = (unsigned char *) FLASH_COPYADDR;// Initialize Flash segment B pointer
Flash_Erase(FLASH_SAVEADDR);
FCTL1 = FWKEY + WRT; // Set WRT bit for write operation
FCTL3 = FWKEY; // Clear Lock bit
for (i=0; i<MAXNUM; i++)
{
DISABLE_INT;
if(i==Addr)
{
*Flash_ptrA++ =FData.Bytes.BHH; // Save Data
Flash_Busy(); //Busy
*Flash_ptrA++ =FData.Bytes.BHL; // Save Data
Flash_Busy(); //Busy
*Flash_ptrA++ =FData.Bytes.BLH; // Save Data
Flash_Busy(); //Busy
*Flash_ptrA++ =FData.Bytes.BLL; // Save Data
Flash_Busy(); //Busy
Flash_ptrB+=4;
}
else
{
*Flash_ptrA++ = *Flash_ptrB++; // 恢復(fù)Flash內(nèi)的其他數(shù)據(jù)
Flash_Busy(); //Busy
}
RESTORE_INT;
}
FCTL1 = FWKEY; // Clear WRT bit
FCTL3 = FWKEY + LOCK; // Set LOCK bit
}
/****************************************************************************
* 名 稱(chēng):Flash_ReadFloat()
* 功 能:從FlashROM讀回一個(gè)浮點(diǎn)型變量
* 入口參數(shù):Addr:待讀出變量所在FlashROM單元的起始地址(存入的地址)
* 出口參數(shù):讀回的浮點(diǎn)型變量值
****************************************************************************/
float Flash_ReadFloat (unsigned int Addr)
{
unsigned char *Flash_ptrA; // Segment A pointer
union FloatChar Data;
Flash_ptrA = (unsigned char *) FLASH_SAVEADDR;// Initialize Flash segment A pointer
Flash_ptrA+=Addr;
Data.Bytes.BHH=*Flash_ptrA++;
Data.Bytes.BHL=*Flash_ptrA++;
Data.Bytes.BLH=*Flash_ptrA++;
Data.Bytes.BLL=*Flash_ptrA++;
return(Data.Float);
}
//==============================================================================================
復(fù)制代碼
Flash.h文件:
extern void Flash_Init (void);
extern void Flash_WriteChar (unsigned int Addr,unsigned char Data);
extern unsigned char Flash_ReadChar (unsigned int Addr);
extern void Flash_WriteWord (unsigned int Addr,unsigned int Data);
extern unsigned int Flash_ReadWord (unsigned int Addr);
extern void Flash_WriteLong (unsigned int Addr,unsigned long Data);
extern unsigned long Flash_ReadLong (unsigned int Addr);
extern void Flash_WriteFloat (unsigned int Addr,float Data);
extern float Flash_ReadFloat (unsigned int Addr);
復(fù)制代碼
作者:
落筆
時(shí)間:
2019-6-24 18:14
求大神指點(diǎn)一下,我往信息存儲(chǔ)器中寫(xiě)數(shù)據(jù)可以按我設(shè)定的地址中寫(xiě),但是我往主存儲(chǔ)器中寫(xiě)數(shù)據(jù)時(shí),我設(shè)置的起始地址時(shí)bank3的首地址038000H,為啥調(diào)試的時(shí)候顯示的寫(xiě)在了08000H為首地址的Bank0區(qū)中呢?
歡迎光臨 (http://www.raoushi.com/bbs/)
Powered by Discuz! X3.1