|
本程序是《MSP430系列單片機系統工程設計與實踐》書里面的源碼,(包含工程文件(例4.1.6))完整例程下載:http://www.zg4o1577.cn/bbs/dpj-46245-1.html

關于本程序的詳細解說大家可以點擊上圖下載電子書
這個Flash存儲器庫文件的調用方法可先下載完整代碼然后找到(例4.1.6)這一節,里面有調用方法
Flash.c文件:
- /*
-
- MSP430F全系列Flash存儲器通用程序庫
- 說明:該程序庫包含了內部Flash存儲器常用的讀寫功能,還包含了常用數據
- 格式變量的保存、讀取函數。除了字節讀寫之外,還可以很方便的向
- FlashROM里寫入和讀出整型、浮點數、長整型格式的數據。
- 由于Flash存儲器不能單字節擦除或改寫,因此寫入任何字節都需
- 要先備份整個數據區再整塊擦除,之后恢復其他未改變數據。本程序利
- 用兩個Flash存儲區(InfoA和InfoB)互相備份信息,優點是備份過程不
- 占用RAM,能在RAM小于256字節的單片機上運行;缺點是速度慢,且浪費
- 了1/2的存儲容量。適合小批量數據且不關心寫入速度的場合,如菜單
- 保存設置參數等。另外注意Flash壽命只有10萬次左右,不要頻繁調用
- 寫函數。寫Flash時,電源電壓必須高于2.7V。
- 本程序庫中所有的讀寫函數對外已經屏蔽了Flash特征,存儲地址
- 空間從0開始到127。如果實際用到的數據量很少,可修改MAXNUM定義,
- 以節省執行時間。如果需要保存的數據量大于128,可修改存儲區首地址
- 和備份區首地址的定義,指向程序Flash區中程序代碼和中斷向量表未
- 占用的空白區塊,能獲得512字節的存儲容量。
- 要使用該庫函數,需要將本文件(Flash.c)添加進工程,并在需要
- 調用函數的文件開頭處包含"Flash.h"。
- (C)西安電子科技大學 測控技術與儀器教研中心 編寫:謝楷 2008/02/04
-
- */
- //
- //
- // MSP430F4XX
- // +---------------+
- // | |
- // | XOUT|-----
- // | | 32.768KHz Watch Crystal
- // | XIN|-----
- // | |
- // +---------------+
- #include "MSP430x42x.h"
- #define MAXNUM 32 /*存儲的總數據量(字節),最大128*/
- /*由于每個數據都需要備份,總數據量越小速度越快,不要留太多余量*/
- /*后面存儲、讀取函數可用的存儲地址空間為0~(MAXNUM-1)*/
- #define FLASH_SAVEADDR (0x1080) /*Flash數據存儲區首地址(InfoB)*/
- #define FLASH_COPYADDR (0x1000) /*Flash備份存儲區首地址(InfoA)*/
- union LongChar //長整字節 復合結構
- { unsigned long int Long;
- struct ByteL4
- { unsigned char BHH;
- unsigned char BHL;
- unsigned char BLH;
- unsigned char BLL;
- }Bytes;
- };
- union FloatChar //浮點字節 復合結構
- { 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();
- /****************************************************************************
- * 名 稱:Flash_Init()
- * 功 能:對Flash時鐘進行初始化設置
- * 入口參數:無
- * 出口參數:無
- * 說 明: 如需使用后面的讀寫函數,在程序開始必須先調用該初始化函數
- 配置Flash時鐘必須在257~476KHz之間!!
- ****************************************************************************/
- void Flash_Init(void)
- {
- FCTL2 = FWKEY + FSSEL_2 + FN1; // 默認 SMCLK/3 =349KHz
- }
- /* Flash時鐘必須在257~476KHz之間, */
- /* 分頻系數= 32*FN5 + 16*FN4 + 8*FN3 + 4*FN2 + 2*FN1 + FN0 + 1 */
- // Flash時鐘選擇:
- /* FSSEL_0 Flash clock select: 0 - ACLK */
- /* FSSEL_1 Flash clock select: 1 - MCLK */
- /* FSSEL_2 Flash clock select: 2 - SMCLK */
-
- /****************************************************************************
- * 名 稱:Flash_Busy()
- * 功 能:Flash忙等待
- * 入口參數:無
- * 出口參數:無
- * 說 明: 若Flash忙則等待,直到Flash操作完成(空閑)才返回。
- ****************************************************************************/
- void Flash_Busy()
- {
- while((FCTL3 & BUSY) == BUSY){_NOP();} //Busy
- }
- /****************************************************************************
- * 名 稱:Flash_Erase()
- * 功 能:擦除Flash的一個數據塊
- * 入口參數:Addr:被擦除數據塊的首地址
- * 出口參數:無
- ****************************************************************************/
- 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
- }
- /****************************************************************************
- * 名 稱:Flash_CopyA2B()
- * 功 能:將數據區的內容拷貝到備份區
- * 入口參數:無
- * 出口參數:無
- ****************************************************************************/
- 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
- }
- /****************************************************************************
- * 名 稱:Flash_WriteChar()
- * 功 能:向Flash中寫入一個字節(Char型變量)
- * 入口參數:Addr:存放數據的地址
- Data:待寫入的數據
- * 出口參數:無
- * 范 例:Flash_WriteChar(0,123);將常數123寫入0單元
- Flash_WriteChar(1,a);將整型變量a寫入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內的數據先保存起來
- 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++; // 恢復Flash內的其他數據
- Flash_Busy(); //Busy
- }
- RESTORE_INT;
- }
- FCTL1 = FWKEY; // Clear WRT bit
- FCTL3 = FWKEY + LOCK; // Set LOCK bit
- }
- /****************************************************************************
- * 名 稱:Flash_ReadChar()
- * 功 能:從Flash中讀取一個字節
- * 入口參數:Addr:存放數據的地址
- * 出口參數:讀回的數據
- ****************************************************************************/
- 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);
- }
- /****************************************************************************
- * 名 稱:Flash_WriteWord()
- * 功 能:向Flash寫入一個整型變量
- * 入口參數:Addr:被寫入FlashROM單元的地址
- Data:待寫入的整型變量(2字節數據)
- * 出口參數:無
- * 說 明: 該函數保存數據將占用Addr和Addr+1兩個存儲單元
- * 范 例:Flash_WriteWord(2,1234);將常數1233寫入2~3單元
- Flash_WriteWord(4,a);將整型變量a寫入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內的數據先保存起來
- 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++; // 恢復Flash內的其他數據
- Flash_Busy(); //Busy
- }
- RESTORE_INT;
- }
- FCTL1 = FWKEY; // Clear WRT bit
- FCTL3 = FWKEY + LOCK; // Set LOCK bit
- }
- /****************************************************************************
- * 名 稱:Flash_ReadWord()
- * 功 能:從FlashROM讀回一個整型變量
- * 入口參數:Addr:待讀出變量FlashROM單元的起始地址(存入的地址)
- * 出口參數:讀回的整型變量值
- ****************************************************************************/
- 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);
- }
- /****************************************************************************
- * 名 稱:Flash_WriteLong()
- * 功 能:向FlashROM寫入一個長整型變量
- * 入口參數:Addr:被寫入FlashROM單元的地址
- Data:待寫入的長整型變量(4字節數據)
- * 出口參數:無
- * 說 明: 該函數保存數據將占用Addr到Addr+3 共4個存儲單元
- * 范 例:Flash_WriteLong(7,123456);將長整型數123456寫入7~10單元
- Flash_WriteLong(11,a);將長整型變量a寫入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內的數據先保存起來
- 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++; // 恢復Flash內的其他數據
- Flash_Busy(); //Busy
- }
- RESTORE_INT;
- }
- FCTL1 = FWKEY; // Clear WRT bit
- FCTL3 = FWKEY + LOCK; // Set LOCK bit
- }
- /****************************************************************************
- * 名 稱:Flash_ReadLong()
- * 功 能:從FlashROM讀回一個長整型變量
- * 入口參數:Addr:待讀出變量所在FlashROM單元的起始地址(存入的地址)
- * 出口參數:讀回的長整型變量值
- ****************************************************************************/
- 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);
- }
- /****************************************************************************
- * 名 稱:Flash_WriteFloat()
- * 功 能:向FlashROM寫入一個浮點型變量
- * 入口參數:Addr:被寫入FlashROM單元的地址
- Data:待寫入的浮點型變量(4字節數據)
- * 出口參數:無
- * 說 明: 該函數保存數據將占用Addr到Addr+3 共4個存儲單元
- * 范 例:Flash_WriteFloat(15,3.14159);將浮點數3.14159寫入15~18單元
- Flash_WriteFloat(19,a);將浮點變量a寫入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內的數據先保存起來
- 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++; // 恢復Flash內的其他數據
- Flash_Busy(); //Busy
- }
- RESTORE_INT;
- }
- FCTL1 = FWKEY; // Clear WRT bit
- FCTL3 = FWKEY + LOCK; // Set LOCK bit
- }
- /****************************************************************************
- * 名 稱:Flash_ReadFloat()
- * 功 能:從FlashROM讀回一個浮點型變量
- * 入口參數:Addr:待讀出變量所在FlashROM單元的起始地址(存入的地址)
- * 出口參數:讀回的浮點型變量值
- ****************************************************************************/
- 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);
- }
- //==============================================================================================
復制代碼
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);
復制代碼
|
|