久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 7636|回復: 1
打印 上一主題 下一主題
收起左側

MSP430F全系列Flash存儲器通用程序庫

[復制鏈接]
跳轉到指定樓層
樓主
ID:108615 發表于 2016-3-14 20:10 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
本程序是《MSP430系列單片機系統工程設計與實踐》書里面的源碼,(包含工程文件(例4.1.6))完整例程下載:http://www.zg4o1577.cn/bbs/dpj-46245-1.html


關于本程序的詳細解說大家可以點擊上圖下載電子書
這個Flash存儲器庫文件的調用方法可先下載完整代碼然后找到(例4.1.6)這一節,里面有調用方法
Flash.c文件:
  1. /*
  2.                
  3.                    MSP430F全系列Flash存儲器通用程序庫


  4.   說明:該程序庫包含了內部Flash存儲器常用的讀寫功能,還包含了常用數據
  5.         格式變量的保存、讀取函數。除了字節讀寫之外,還可以很方便的向
  6.         FlashROM里寫入和讀出整型、浮點數、長整型格式的數據。
  7.             由于Flash存儲器不能單字節擦除或改寫,因此寫入任何字節都需
  8.         要先備份整個數據區再整塊擦除,之后恢復其他未改變數據。本程序利
  9.         用兩個Flash存儲區(InfoA和InfoB)互相備份信息,優點是備份過程不
  10.         占用RAM,能在RAM小于256字節的單片機上運行;缺點是速度慢,且浪費
  11.         了1/2的存儲容量。適合小批量數據且不關心寫入速度的場合,如菜單
  12.         保存設置參數等。另外注意Flash壽命只有10萬次左右,不要頻繁調用
  13.         寫函數。寫Flash時,電源電壓必須高于2.7V。
  14.             本程序庫中所有的讀寫函數對外已經屏蔽了Flash特征,存儲地址
  15.         空間從0開始到127。如果實際用到的數據量很少,可修改MAXNUM定義,
  16.         以節省執行時間。如果需要保存的數據量大于128,可修改存儲區首地址
  17.         和備份區首地址的定義,指向程序Flash區中程序代碼和中斷向量表未
  18.         占用的空白區塊,能獲得512字節的存儲容量。
  19.             要使用該庫函數,需要將本文件(Flash.c)添加進工程,并在需要
  20.         調用函數的文件開頭處包含"Flash.h"。

  21.   (C)西安電子科技大學 測控技術與儀器教研中心 編寫:謝楷 2008/02/04
  22.   
  23. */
  24. //
  25. //
  26. //                  MSP430F4XX
  27. //               +---------------+         
  28. //               |               |
  29. //               |           XOUT|-----
  30. //               |               |      32.768KHz Watch Crystal
  31. //               |            XIN|-----
  32. //               |               |
  33. //               +---------------+

  34. #include  "MSP430x42x.h"
  35. #define   MAXNUM  32      /*存儲的總數據量(字節),最大128*/
  36. /*由于每個數據都需要備份,總數據量越小速度越快,不要留太多余量*/
  37. /*后面存儲、讀取函數可用的存儲地址空間為0~(MAXNUM-1)*/

  38. #define   FLASH_SAVEADDR  (0x1080) /*Flash數據存儲區首地址(InfoB)*/
  39. #define   FLASH_COPYADDR  (0x1000) /*Flash備份存儲區首地址(InfoA)*/

  40. union LongChar      //長整字節  復合結構
  41. { unsigned long int Long;
  42.   struct ByteL4
  43.    { unsigned char  BHH;
  44.      unsigned char  BHL;
  45.      unsigned char  BLH;
  46.      unsigned char  BLL;
  47.    }Bytes;   
  48. };
  49. union FloatChar      //浮點字節  復合結構
  50. { float Float;
  51.   struct ByteF4
  52.    { unsigned char  BHH;
  53.      unsigned char  BHL;
  54.      unsigned char  BLH;
  55.      unsigned char  BLL;
  56.    }Bytes;   
  57. };

  58. unsigned char FLASH_PSR;
  59. #define DISABLE_INT;  FLASH_PSR=__get_SR_register();_DINT();
  60. #define RESTORE_INT;  if(FLASH_PSR & GIE)           _EINT();
  61. /****************************************************************************
  62. * 名    稱:Flash_Init()
  63. * 功    能:對Flash時鐘進行初始化設置
  64. * 入口參數:無
  65. * 出口參數:無
  66. * 說    明: 如需使用后面的讀寫函數,在程序開始必須先調用該初始化函數
  67.             配置Flash時鐘必須在257~476KHz之間!!
  68. ****************************************************************************/
  69. void Flash_Init(void)
  70. {
  71.   FCTL2 = FWKEY + FSSEL_2 + FN1; // 默認 SMCLK/3 =349KHz
  72. }
  73.   /* Flash時鐘必須在257~476KHz之間, */
  74.   /* 分頻系數= 32*FN5 + 16*FN4 + 8*FN3 + 4*FN2 + 2*FN1 + FN0 + 1 */

  75.   // Flash時鐘選擇:   
  76.   /* FSSEL_0 Flash clock select: 0 - ACLK */
  77.   /* FSSEL_1 Flash clock select: 1 - MCLK */
  78.   /* FSSEL_2 Flash clock select: 2 - SMCLK */


  79. /****************************************************************************
  80. * 名    稱:Flash_Busy()
  81. * 功    能:Flash忙等待
  82. * 入口參數:無
  83. * 出口參數:無
  84. * 說    明: 若Flash忙則等待,直到Flash操作完成(空閑)才返回。
  85. ****************************************************************************/
  86. void Flash_Busy()
  87. {
  88.   while((FCTL3 & BUSY) == BUSY){_NOP();}    //Busy
  89. }
  90. /****************************************************************************
  91. * 名    稱:Flash_Erase()
  92. * 功    能:擦除Flash的一個數據塊
  93. * 入口參數:Addr:被擦除數據塊的首地址
  94. * 出口參數:無
  95. ****************************************************************************/
  96. void Flash_Erase(unsigned int Addr)  
  97. { unsigned char *Flash_ptr;
  98.   Flash_ptr=(unsigned char *)Addr;
  99.   FCTL1 = FWKEY + ERASE;                    // Set Erase bit
  100.   FCTL3 = FWKEY;                            // Clear Lock bit
  101.   DISABLE_INT;
  102.   *Flash_ptr = 0;                          // Dummy write to erase Flash segment B
  103.   Flash_Busy();                            //Busy
  104.   RESTORE_INT;
  105.   FCTL1 = FWKEY;                            // Lock
  106.   FCTL3 = FWKEY+LOCK;                       // Set Lock bit  
  107. }
  108. /****************************************************************************
  109. * 名    稱:Flash_CopyA2B()
  110. * 功    能:將數據區的內容拷貝到備份區
  111. * 入口參數:無
  112. * 出口參數:無
  113. ****************************************************************************/
  114. void Flash_CopyA2B()
  115. {
  116.   unsigned char *Flash_ptrA;                      // Segment A pointer
  117.   unsigned char *Flash_ptrB;                      // Segment B pointer
  118.   unsigned int i;
  119.   Flash_ptrA = (unsigned char *) FLASH_SAVEADDR;  // Initialize Flash segment A pointer
  120.   Flash_ptrB = (unsigned char *) FLASH_COPYADDR;  // Initialize Flash segment B pointer
  121.   Flash_Erase(FLASH_COPYADDR);
  122.   FCTL1 = FWKEY + WRT;                      // Set WRT bit for write operation
  123.   FCTL3 = FWKEY;                            // Clear Lock bit
  124.   for (i=0; i<MAXNUM; i++)
  125.   {
  126.     DISABLE_INT;
  127.     *Flash_ptrB++ = *Flash_ptrA++;           // copy value segment A to segment B
  128.     Flash_Busy();                              //Busy
  129.     RESTORE_INT;
  130.   }
  131.   FCTL1 = FWKEY;                            // Clear WRT bit
  132.   FCTL3 = FWKEY + LOCK;                     // Set LOCK bit
  133. }
  134. /****************************************************************************
  135. * 名    稱:Flash_WriteChar()
  136. * 功    能:向Flash中寫入一個字節(Char型變量)
  137. * 入口參數:Addr:存放數據的地址
  138.             Data:待寫入的數據
  139. * 出口參數:無
  140. * 范    例:Flash_WriteChar(0,123);將常數123寫入0單元
  141.             Flash_WriteChar(1,a);將整型變量a寫入1單元
  142. ****************************************************************************/
  143. void Flash_WriteChar (unsigned int Addr,unsigned char Data)
  144. {
  145.   unsigned char *Flash_ptrA;                         // Segment A pointer
  146.   unsigned char *Flash_ptrB;                         // Segment B pointer
  147.   unsigned int i;
  148.   Flash_CopyA2B();                          //Flash內的數據先保存起來
  149.   Flash_ptrA = (unsigned char *) FLASH_SAVEADDR;// Initialize Flash segment A pointer
  150.   Flash_ptrB = (unsigned char *) FLASH_COPYADDR;// Initialize Flash segment B pointer
  151.   Flash_Erase(FLASH_SAVEADDR);  
  152.   FCTL1 = FWKEY + WRT;                      // Set WRT bit for write operation
  153.   FCTL3 = FWKEY;                            // Clear Lock bit
  154.   for (i=0; i<MAXNUM; i++)
  155.   {
  156.     DISABLE_INT;
  157.     if(i==Addr)
  158.     {
  159.      *Flash_ptrA++ =Data;                    // Save Data
  160.      Flash_Busy();                              //Busy
  161.      Flash_ptrB++;
  162.     }
  163.     else
  164.     {
  165.      *Flash_ptrA++ = *Flash_ptrB++;           // 恢復Flash內的其他數據
  166.      Flash_Busy();                              //Busy
  167.     }
  168.     RESTORE_INT;
  169.   }
  170.   FCTL1 = FWKEY;                            // Clear WRT bit
  171.   FCTL3 = FWKEY + LOCK;                     // Set LOCK bit
  172. }  
  173. /****************************************************************************
  174. * 名    稱:Flash_ReadChar()
  175. * 功    能:從Flash中讀取一個字節
  176. * 入口參數:Addr:存放數據的地址
  177. * 出口參數:讀回的數據
  178. ****************************************************************************/
  179. unsigned char Flash_ReadChar (unsigned int Addr)
  180. { unsigned char Data;
  181.   unsigned char *Flash_ptrA;                         // Segment A pointer
  182.   Flash_ptrA = (unsigned char *) FLASH_SAVEADDR;             // Initialize Flash segment A pointer
  183.   Data=*(Flash_ptrA+Addr);
  184.   return(Data);
  185. }
  186. /****************************************************************************
  187. * 名    稱:Flash_WriteWord()
  188. * 功    能:向Flash寫入一個整型變量
  189. * 入口參數:Addr:被寫入FlashROM單元的地址
  190.             Data:待寫入的整型變量(2字節數據)
  191. * 出口參數:無
  192. * 說    明: 該函數保存數據將占用Addr和Addr+1兩個存儲單元
  193. * 范    例:Flash_WriteWord(2,1234);將常數1233寫入2~3單元
  194.             Flash_WriteWord(4,a);將整型變量a寫入4~5單元
  195. ****************************************************************************/
  196. void Flash_WriteWord (unsigned int Addr,unsigned int Data)
  197. {
  198.   unsigned char *Flash_ptrA;                // Segment A pointer
  199.   unsigned char *Flash_ptrB;                // Segment B pointer
  200.   unsigned int i;
  201.   Flash_CopyA2B();                          //Flash內的數據先保存起來
  202.   Flash_ptrA = (unsigned char *) FLASH_SAVEADDR;// Initialize Flash segment A pointer
  203.   Flash_ptrB = (unsigned char *) FLASH_COPYADDR;// Initialize Flash segment B pointer
  204.   Flash_Erase(FLASH_SAVEADDR);
  205.   FCTL1 = FWKEY + WRT;                      // Set WRT bit for write operation
  206.   FCTL3 = FWKEY;                            // Clear Lock bit
  207.   for (i=0; i<MAXNUM; i++)
  208.   {
  209.     DISABLE_INT;
  210.     if(i==Addr)
  211.     {
  212.      *Flash_ptrA++ =Data/256;                    // Save Data
  213.      Flash_Busy();                                //Busy
  214.      *Flash_ptrA++ =Data%256;                    // Save Data     
  215.      Flash_Busy();                                //Busy
  216.      Flash_ptrB+=2;
  217.     }
  218.     else
  219.     {
  220.      *Flash_ptrA++ = *Flash_ptrB++;            // 恢復Flash內的其他數據
  221.      Flash_Busy();                              //Busy
  222.     }
  223.     RESTORE_INT;
  224.   }
  225.   FCTL1 = FWKEY;                            // Clear WRT bit
  226.   FCTL3 = FWKEY + LOCK;                     // Set LOCK bit
  227. }
  228. /****************************************************************************
  229. * 名    稱:Flash_ReadWord()
  230. * 功    能:從FlashROM讀回一個整型變量
  231. * 入口參數:Addr:待讀出變量FlashROM單元的起始地址(存入的地址)
  232. * 出口參數:讀回的整型變量值
  233. ****************************************************************************/
  234. unsigned int Flash_ReadWord (unsigned int Addr)
  235. { unsigned int Data;
  236.   unsigned char *Flash_ptrA;                    // Segment A pointer
  237.   Flash_ptrA = (unsigned char *) FLASH_SAVEADDR;// Initialize Flash segment A pointer
  238.   Data=*(Flash_ptrA+Addr)*256+*(Flash_ptrA+Addr+1);
  239.   return(Data);
  240. }
  241. /****************************************************************************
  242. * 名    稱:Flash_WriteLong()
  243. * 功    能:向FlashROM寫入一個長整型變量
  244. * 入口參數:Addr:被寫入FlashROM單元的地址
  245.             Data:待寫入的長整型變量(4字節數據)
  246. * 出口參數:無
  247. * 說    明: 該函數保存數據將占用Addr到Addr+3 共4個存儲單元
  248. * 范    例:Flash_WriteLong(7,123456);將長整型數123456寫入7~10單元
  249.             Flash_WriteLong(11,a);將長整型變量a寫入11~14單元
  250. ****************************************************************************/
  251. void Flash_WriteLong (unsigned int Addr,unsigned long int Data)
  252. {
  253.   union LongChar LData;
  254.   unsigned char *Flash_ptrA;                         // Segment A pointer
  255.   unsigned char *Flash_ptrB;                         // Segment B pointer
  256.   unsigned int i;
  257.   LData.Long=Data;
  258.   Flash_CopyA2B();                          //Flash內的數據先保存起來
  259.   Flash_ptrA = (unsigned char *) FLASH_SAVEADDR;// Initialize Flash segment A pointer
  260.   Flash_ptrB = (unsigned char *) FLASH_COPYADDR;// Initialize Flash segment B pointer
  261.   Flash_Erase(FLASH_SAVEADDR);
  262.   FCTL1 = FWKEY + WRT;                      // Set WRT bit for write operation
  263.   FCTL3 = FWKEY;                            // Clear Lock bit
  264.   for (i=0; i<MAXNUM; i++)
  265.   {
  266.     DISABLE_INT;
  267.     if(i==Addr)
  268.     {
  269.      *Flash_ptrA++ =LData.Bytes.BHH;            // Save Data
  270.      Flash_Busy();                              //Busy
  271.      *Flash_ptrA++ =LData.Bytes.BHL;            // Save Data   
  272.      Flash_Busy();                              //Busy
  273.      *Flash_ptrA++ =LData.Bytes.BLH;            // Save Data
  274.      Flash_Busy();                              //Busy
  275.      *Flash_ptrA++ =LData.Bytes.BLL;            // Save Data     
  276.      Flash_Busy();                              //Busy
  277.      Flash_ptrB+=4;
  278.      }
  279.     else
  280.     {
  281.      *Flash_ptrA++ = *Flash_ptrB++;           // 恢復Flash內的其他數據
  282.      Flash_Busy();                              //Busy
  283.     }
  284.     RESTORE_INT;   
  285.   }
  286.   FCTL1 = FWKEY;                            // Clear WRT bit
  287.   FCTL3 = FWKEY + LOCK;                     // Set LOCK bit
  288. }
  289. /****************************************************************************
  290. * 名    稱:Flash_ReadLong()
  291. * 功    能:從FlashROM讀回一個長整型變量
  292. * 入口參數:Addr:待讀出變量所在FlashROM單元的起始地址(存入的地址)
  293. * 出口參數:讀回的長整型變量值
  294. ****************************************************************************/
  295. unsigned long int Flash_ReadLong (unsigned int Addr)
  296. {
  297.   unsigned char *Flash_ptrA;                    // Segment A pointer
  298.   union LongChar Data;
  299.   Flash_ptrA = (unsigned char *) FLASH_SAVEADDR;// Initialize Flash segment A pointer
  300.   Flash_ptrA+=Addr;
  301.   Data.Bytes.BHH=*Flash_ptrA++;
  302.   Data.Bytes.BHL=*Flash_ptrA++;
  303.   Data.Bytes.BLH=*Flash_ptrA++;
  304.   Data.Bytes.BLL=*Flash_ptrA++;     
  305.   return(Data.Long);
  306. }
  307. /****************************************************************************
  308. * 名    稱:Flash_WriteFloat()
  309. * 功    能:向FlashROM寫入一個浮點型變量
  310. * 入口參數:Addr:被寫入FlashROM單元的地址
  311.             Data:待寫入的浮點型變量(4字節數據)
  312. * 出口參數:無
  313. * 說    明: 該函數保存數據將占用Addr到Addr+3 共4個存儲單元
  314. * 范    例:Flash_WriteFloat(15,3.14159);將浮點數3.14159寫入15~18單元
  315.             Flash_WriteFloat(19,a);將浮點變量a寫入19~22單元
  316. ****************************************************************************/
  317. void Flash_WriteFloat (unsigned int Addr,float Data)
  318. {
  319.   union FloatChar FData;
  320.   unsigned char *Flash_ptrA;                // Segment A pointer
  321.   unsigned char *Flash_ptrB;                // Segment B pointer
  322.   unsigned int i;
  323.   FData.Float=Data;
  324.   Flash_CopyA2B();                          //Flash內的數據先保存起來
  325.   Flash_ptrA = (unsigned char *) FLASH_SAVEADDR;// Initialize Flash segment A pointer
  326.   Flash_ptrB = (unsigned char *) FLASH_COPYADDR;// Initialize Flash segment B pointer
  327.   Flash_Erase(FLASH_SAVEADDR);
  328.   FCTL1 = FWKEY + WRT;                      // Set WRT bit for write operation
  329.   FCTL3 = FWKEY;                            // Clear Lock bit
  330.   for (i=0; i<MAXNUM; i++)
  331.   {
  332.     DISABLE_INT;
  333.     if(i==Addr)
  334.     {
  335.      *Flash_ptrA++ =FData.Bytes.BHH;            // Save Data
  336.      Flash_Busy();                              //Busy
  337.      *Flash_ptrA++ =FData.Bytes.BHL;            // Save Data   
  338.      Flash_Busy();                              //Busy
  339.      *Flash_ptrA++ =FData.Bytes.BLH;            // Save Data
  340.      Flash_Busy();                              //Busy
  341.      *Flash_ptrA++ =FData.Bytes.BLL;            // Save Data     
  342.      Flash_Busy();                              //Busy
  343.      Flash_ptrB+=4;
  344.     }
  345.     else
  346.     {
  347.      *Flash_ptrA++ = *Flash_ptrB++;           // 恢復Flash內的其他數據
  348.      Flash_Busy();                              //Busy
  349.     }
  350.     RESTORE_INT;
  351.   }
  352.   FCTL1 = FWKEY;                            // Clear WRT bit
  353.   FCTL3 = FWKEY + LOCK;                     // Set LOCK bit
  354. }
  355. /****************************************************************************
  356. * 名    稱:Flash_ReadFloat()
  357. * 功    能:從FlashROM讀回一個浮點型變量
  358. * 入口參數:Addr:待讀出變量所在FlashROM單元的起始地址(存入的地址)
  359. * 出口參數:讀回的浮點型變量值
  360. ****************************************************************************/
  361. float Flash_ReadFloat (unsigned int Addr)
  362. {
  363.   unsigned char *Flash_ptrA;                   // Segment A pointer
  364.   union FloatChar Data;
  365.   Flash_ptrA = (unsigned char *) FLASH_SAVEADDR;// Initialize Flash segment A pointer
  366.   Flash_ptrA+=Addr;
  367.   Data.Bytes.BHH=*Flash_ptrA++;
  368.   Data.Bytes.BHL=*Flash_ptrA++;
  369.   Data.Bytes.BLH=*Flash_ptrA++;
  370.   Data.Bytes.BLL=*Flash_ptrA++;     
  371.   return(Data.Float);
  372. }
  373. //==============================================================================================
復制代碼

Flash.h文件:
  1. extern void          Flash_Init  (void);
  2. extern void          Flash_WriteChar  (unsigned int Addr,unsigned char Data);
  3. extern unsigned char Flash_ReadChar   (unsigned int Addr);
  4. extern void          Flash_WriteWord  (unsigned int Addr,unsigned int  Data);
  5. extern unsigned int  Flash_ReadWord   (unsigned int Addr);
  6. extern void          Flash_WriteLong  (unsigned int Addr,unsigned long Data);
  7. extern unsigned long Flash_ReadLong   (unsigned int Addr);
  8. extern void          Flash_WriteFloat (unsigned int Addr,float         Data);
  9. extern float         Flash_ReadFloat  (unsigned int Addr);
復制代碼



分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:570616 發表于 2019-6-24 18:14 | 只看該作者
求大神指點一下,我往信息存儲器中寫數據可以按我設定的地址中寫,但是我往主存儲器中寫數據時,我設置的起始地址時bank3的首地址038000H,為啥調試的時候顯示的寫在了08000H為首地址的Bank0區中呢?
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 91资源在线 | 国产色婷婷久久99精品91 | 暴草美女 | 在线精品一区二区 | av黄色片| 91久久国产综合久久91精品网站 | 激情一区二区三区 | 成人免费一区二区三区视频网站 | 九九亚洲 | 毛片免费观看视频 | 日韩欧美视频在线 | 伊人网影院 | 中文字幕在线看人 | 国产精品免费一区二区 | 亚洲成人免费视频 | 99精品国产一区二区三区 | 91精品国产91久久久久久最新 | 99久热在线精品视频观看 | 国产精品日韩在线观看一区二区 | 羞羞的视频免费观看 | 澳门永久av免费网站 | 成人综合视频在线观看 | 国产精品国产成人国产三级 | 亚洲人人 | 羞羞涩涩在线观看 | 国产精品国产三级国产播12软件 | av毛片 | 国产精品久久久久久亚洲调教 | 精品福利在线 | 国产色网 | 最新中文字幕在线 | 中文字幕乱码视频32 | 九九热在线视频 | 中文字幕一区二区三区乱码在线 | 看a网站 | 久久专区| 国产欧美综合在线 | 精品欧美一区免费观看α√ | 久久免费精品 | 午夜免费在线观看 | 欧美日韩成人影院 |