找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 6673|回复: 1
打印 上一主题 下一主题
收起左侧

MSP430F全系列Flash存储器通用程序库

[复制链接]
跳转到指定楼层
楼主
ID:108615 发表于 2016-3-14 20:10 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本程序是《MSP430系列单片机系统工程设计与实践》书里面的源码,(包含工程文件(例4.1.6))完整例程下载:http://www.51hei.com/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 单片机教程网

快速回复 返回顶部 返回列表