1409|0

1140

帖子

0

TA的资源

纯净的硅(初级)

楼主
 

MSP430F全系列Flash存储器通用程序库 [复制链接]

 

这个Flash存储器库文件的调用方法可先下载完整代码然后找到(例4.1.6)这一节,里面有调用方法
Flash.c文件:

  1. /*
  2.                
  3.                    MSP430F全系列Flash存储器通用程序库
  4.  
  5.  
  6.   说明:该程序库包含了内部Flash存储器常用的读写功能,还包含了常用数据
  7.         格式变量的保存、读取函数。除了字节读写之外,还可以很方便的向
  8.         FlashROM里写入和读出整型、浮点数、长整型格式的数据。
  9.             由于Flash存储器不能单字节擦除或改写,因此写入任何字节都需
  10.         要先备份整个数据区再整块擦除,之后恢复其他未改变数据。本程序利
  11.         用两个Flash存储区(InfoA和InfoB)互相备份信息,优点是备份过程不
  12.         占用RAM,能在RAM小于256字节的单片机上运行;缺点是速度慢,且浪费
  13.         了1/2的存储容量。适合小批量数据且不关心写入速度的场合,如菜单
  14.         保存设置参数等。另外注意Flash寿命只有10万次左右,不要频繁调用
  15.         写函数。写Flash时,电源电压必须高于2.7V。
  16.             本程序库中所有的读写函数对外已经屏蔽了Flash特征,存储地址
  17.         空间从0开始到127。如果实际用到的数据量很少,可修改MAXNUM定义,
  18.         以节省执行时间。如果需要保存的数据量大于128,可修改存储区首地址
  19.         和备份区首地址的定义,指向程序Flash区中程序代码和中断向量表未
  20.         占用的空白区块,能获得512字节的存储容量。
  21.             要使用该库函数,需要将本文件(Flash.c)添加进工程,并在需要
  22.         调用函数的文件开头处包含"Flash.h"。
  23.  
  24.   (C)西安电子科技大学 测控技术与仪器教研中心 编写:谢楷 2008/02/04
  25.   
  26. */
  27. //
  28. //
  29. //                  MSP430F4XX
  30. //               +---------------+          
  31. //               |               |
  32. //               |           XOUT|-----
  33. //               |               |      32.768KHz Watch Crystal
  34. //               |            XIN|-----
  35. //               |               |
  36. //               +---------------+
  37.  
  38. #include  "MSP430x42x.h" 
  39. #define   MAXNUM  32      /*存储的总数据量(字节),最大128*/
  40. /*由于每个数据都需要备份,总数据量越小速度越快,不要留太多余量*/
  41. /*后面存储、读取函数可用的存储地址空间为0~(MAXNUM-1)*/
  42.  
  43. #define   FLASH_SAVEADDR  (0x1080) /*Flash数据存储区首地址(InfoB)*/
  44. #define   FLASH_COPYADDR  (0x1000) /*Flash备份存储区首地址(InfoA)*/
  45.  
  46. union LongChar      //长整字节  复合结构
  47. { unsigned long int Long;
  48.   struct ByteL4
  49.    { unsigned char  BHH;
  50.      unsigned char  BHL;
  51.      unsigned char  BLH;
  52.      unsigned char  BLL;
  53.    }Bytes;   
  54. };
  55. union FloatChar      //浮点字节  复合结构
  56. { float Float;
  57.   struct ByteF4
  58.    { unsigned char  BHH;
  59.      unsigned char  BHL;
  60.      unsigned char  BLH;
  61.      unsigned char  BLL;
  62.    }Bytes;   
  63. };
  64.  
  65. unsigned char FLASH_PSR;
  66. #define DISABLE_INT;  FLASH_PSR=__get_SR_register();_DINT();
  67. #define RESTORE_INT;  if(FLASH_PSR & GIE)           _EINT();
  68. /****************************************************************************
  69. * 名    称:Flash_Init()
  70. * 功    能:对Flash时钟进行初始化设置
  71. * 入口参数:无 
  72. * 出口参数:无
  73. * 说    明: 如需使用后面的读写函数,在程序开始必须先调用该初始化函数
  74.             配置Flash时钟必须在257~476KHz之间!!
  75. ****************************************************************************/
  76. void Flash_Init(void)
  77. {
  78.   FCTL2 = FWKEY + FSSEL_2 + FN1; // 默认 SMCLK/3 =349KHz 
  79. }
  80.   /* Flash时钟必须在257~476KHz之间, */
  81.   /* 分频系数= 32*FN5 + 16*FN4 + 8*FN3 + 4*FN2 + 2*FN1 + FN0 + 1 */
  82.  
  83.   // Flash时钟选择:   
  84.   /* FSSEL_0 Flash clock select: 0 - ACLK */
  85.   /* FSSEL_1 Flash clock select: 1 - MCLK */
  86.   /* FSSEL_2 Flash clock select: 2 - SMCLK */
  87.  
  88.  
  89. /****************************************************************************
  90. * 名    称:Flash_Busy()
  91. * 功    能:Flash忙等待
  92. * 入口参数:无 
  93. * 出口参数:无
  94. * 说    明: 若Flash忙则等待,直到Flash操作完成(空闲)才返回。
  95. ****************************************************************************/
  96. void Flash_Busy()
  97. {
  98.   while((FCTL3 & BUSY) == BUSY){_NOP();}    //Busy
  99. }
  100. /****************************************************************************
  101. * 名    称:Flash_Erase()
  102. * 功    能:擦除Flash的一个数据块
  103. * 入口参数:Addr:被擦除数据块的首地址 
  104. * 出口参数:无
  105. ****************************************************************************/
  106. void Flash_Erase(unsigned int Addr)  
  107. { unsigned char *Flash_ptr;
  108.   Flash_ptr=(unsigned char *)Addr;
  109.   FCTL1 = FWKEY + ERASE;                    // Set Erase bit
  110.   FCTL3 = FWKEY;                            // Clear Lock bit
  111.   DISABLE_INT;
  112.   *Flash_ptr = 0;                          // Dummy write to erase Flash segment B
  113.   Flash_Busy();                            //Busy
  114.   RESTORE_INT;
  115.   FCTL1 = FWKEY;                            // Lock
  116.   FCTL3 = FWKEY+LOCK;                       // Set Lock bit  
  117. }
  118. /****************************************************************************
  119. * 名    称:Flash_CopyA2B()
  120. * 功    能:将数据区的内容拷贝到备份区
  121. * 入口参数:无
  122. * 出口参数:无
  123. ****************************************************************************/
  124. void Flash_CopyA2B()
  125. {
  126.   unsigned char *Flash_ptrA;                      // Segment A pointer
  127.   unsigned char *Flash_ptrB;                      // Segment B pointer
  128.   unsigned int i;
  129.   Flash_ptrA = (unsigned char *) FLASH_SAVEADDR;  // Initialize Flash segment A pointer
  130.   Flash_ptrB = (unsigned char *) FLASH_COPYADDR;  // Initialize Flash segment B pointer
  131.   Flash_Erase(FLASH_COPYADDR);
  132.   FCTL1 = FWKEY + WRT;                      // Set WRT bit for write operation
  133.   FCTL3 = FWKEY;                            // Clear Lock bit
  134.   for (i=0; i<MAXNUM; i++)
  135.   {
  136.     DISABLE_INT;
  137.     *Flash_ptrB++ = *Flash_ptrA++;           // copy value segment A to segment B
  138.     Flash_Busy();                              //Busy
  139.     RESTORE_INT;
  140.   }
  141.   FCTL1 = FWKEY;                            // Clear WRT bit
  142.   FCTL3 = FWKEY + LOCK;                     // Set LOCK bit
  143. }
  144. /****************************************************************************
  145. * 名    称:Flash_WriteChar()
  146. * 功    能:向Flash中写入一个字节(Char型变量)
  147. * 入口参数:Addr:存放数据的地址
  148.             Data:待写入的数据
  149. * 出口参数:无
  150. * 范    例:Flash_WriteChar(0,123);将常数123写入0单元
  151.             Flash_WriteChar(1,a);将整型变量a写入1单元 
  152. ****************************************************************************/
  153. void Flash_WriteChar (unsigned int Addr,unsigned char Data)
  154. {
  155.   unsigned char *Flash_ptrA;                         // Segment A pointer
  156.   unsigned char *Flash_ptrB;                         // Segment B pointer
  157.   unsigned int i;
  158.   Flash_CopyA2B();                          //Flash内的数据先保存起来
  159.   Flash_ptrA = (unsigned char *) FLASH_SAVEADDR;// Initialize Flash segment A pointer
  160.   Flash_ptrB = (unsigned char *) FLASH_COPYADDR;// Initialize Flash segment B pointer
  161.   Flash_Erase(FLASH_SAVEADDR);  
  162.   FCTL1 = FWKEY + WRT;                      // Set WRT bit for write operation
  163.   FCTL3 = FWKEY;                            // Clear Lock bit
  164.   for (i=0; i<MAXNUM; i++)
  165.   {
  166.     DISABLE_INT;
  167.     if(i==Addr)
  168.     {
  169.      *Flash_ptrA++ =Data;                    // Save Data
  170.      Flash_Busy();                              //Busy
  171.      Flash_ptrB++;
  172.     }
  173.     else
  174.     {
  175.      *Flash_ptrA++ = *Flash_ptrB++;           // 恢复Flash内的其他数据
  176.      Flash_Busy();                              //Busy
  177.     }
  178.     RESTORE_INT;
  179.   }
  180.   FCTL1 = FWKEY;                            // Clear WRT bit
  181.   FCTL3 = FWKEY + LOCK;                     // Set LOCK bit
  182. }  
  183. /****************************************************************************
  184. * 名    称:Flash_ReadChar()
  185. * 功    能:从Flash中读取一个字节
  186. * 入口参数:Addr:存放数据的地址
  187. * 出口参数:读回的数据
  188. ****************************************************************************/
  189. unsigned char Flash_ReadChar (unsigned int Addr)
  190. { unsigned char Data;
  191.   unsigned char *Flash_ptrA;                         // Segment A pointer
  192.   Flash_ptrA = (unsigned char *) FLASH_SAVEADDR;             // Initialize Flash segment A pointer
  193.   Data=*(Flash_ptrA+Addr);
  194.   return(Data);
  195. }
  196. /****************************************************************************
  197. * 名    称:Flash_WriteWord()
  198. * 功    能:向Flash写入一个整型变量
  199. * 入口参数:Addr:被写入FlashROM单元的地址
  200.             Data:待写入的整型变量(2字节数据)
  201. * 出口参数:无
  202. * 说    明: 该函数保存数据将占用Addr和Addr+1两个存储单元
  203. * 范    例:Flash_WriteWord(2,1234);将常数1233写入2~3单元
  204.             Flash_WriteWord(4,a);将整型变量a写入4~5单元 
  205. ****************************************************************************/
  206. void Flash_WriteWord (unsigned int Addr,unsigned int Data)
  207. {
  208.   unsigned char *Flash_ptrA;                // Segment A pointer
  209.   unsigned char *Flash_ptrB;                // Segment B pointer
  210.   unsigned int i;
  211.   Flash_CopyA2B();                          //Flash内的数据先保存起来
  212.   Flash_ptrA = (unsigned char *) FLASH_SAVEADDR;// Initialize Flash segment A pointer
  213.   Flash_ptrB = (unsigned char *) FLASH_COPYADDR;// Initialize Flash segment B pointer
  214.   Flash_Erase(FLASH_SAVEADDR);
  215.   FCTL1 = FWKEY + WRT;                      // Set WRT bit for write operation
  216.   FCTL3 = FWKEY;                            // Clear Lock bit
  217.   for (i=0; i<MAXNUM; i++)
  218.   {
  219.     DISABLE_INT;
  220.     if(i==Addr)
  221.     {
  222.      *Flash_ptrA++ =Data/256;                    // Save Data
  223.      Flash_Busy();                                //Busy
  224.      *Flash_ptrA++ =Data%256;                    // Save Data     
  225.      Flash_Busy();                                //Busy
  226.      Flash_ptrB+=2;
  227.     }
  228.     else
  229.     {
  230.      *Flash_ptrA++ = *Flash_ptrB++;            // 恢复Flash内的其他数据
  231.      Flash_Busy();                              //Busy
  232.     }
  233.     RESTORE_INT;
  234.   }
  235.   FCTL1 = FWKEY;                            // Clear WRT bit
  236.   FCTL3 = FWKEY + LOCK;                     // Set LOCK bit
  237. /****************************************************************************
  238. * 名    称:Flash_ReadWord()
  239. * 功    能:从FlashROM读回一个整型变量
  240. * 入口参数:Addr:待读出变量FlashROM单元的起始地址(存入的地址)
  241. * 出口参数:读回的整型变量值
  242. ****************************************************************************/
  243. unsigned int Flash_ReadWord (unsigned int Addr)
  244. { unsigned int Data;
  245.   unsigned char *Flash_ptrA;                    // Segment A pointer
  246.   Flash_ptrA = (unsigned char *) FLASH_SAVEADDR;// Initialize Flash segment A pointer
  247.   Data=*(Flash_ptrA+Addr)*256+*(Flash_ptrA+Addr+1);
  248.   return(Data);
  249. }
  250. /****************************************************************************
  251. * 名    称:Flash_WriteLong()
  252. * 功    能:向FlashROM写入一个长整型变量
  253. * 入口参数:Addr:被写入FlashROM单元的地址
  254.             Data:待写入的长整型变量(4字节数据)
  255. * 出口参数:无
  256. * 说    明: 该函数保存数据将占用Addr到Addr+3 共4个存储单元
  257. * 范    例:Flash_WriteLong(7,123456);将长整型数123456写入7~10单元
  258.             Flash_WriteLong(11,a);将长整型变量a写入11~14单元 
  259. ****************************************************************************/
  260. void Flash_WriteLong (unsigned int Addr,unsigned long int Data)
  261. {
  262.   union LongChar LData;
  263.   unsigned char *Flash_ptrA;                         // Segment A pointer
  264.   unsigned char *Flash_ptrB;                         // Segment B pointer
  265.   unsigned int i;
  266.   LData.Long=Data;
  267.   Flash_CopyA2B();                          //Flash内的数据先保存起来
  268.   Flash_ptrA = (unsigned char *) FLASH_SAVEADDR;// Initialize Flash segment A pointer
  269.   Flash_ptrB = (unsigned char *) FLASH_COPYADDR;// Initialize Flash segment B pointer
  270.   Flash_Erase(FLASH_SAVEADDR);
  271.   FCTL1 = FWKEY + WRT;                      // Set WRT bit for write operation
  272.   FCTL3 = FWKEY;                            // Clear Lock bit
  273.   for (i=0; i<MAXNUM; i++)
  274.   {
  275.     DISABLE_INT;
  276.     if(i==Addr)
  277.     {
  278.      *Flash_ptrA++ =LData.Bytes.BHH;            // Save Data
  279.      Flash_Busy();                              //Busy
  280.      *Flash_ptrA++ =LData.Bytes.BHL;            // Save Data   
  281.      Flash_Busy();                              //Busy
  282.      *Flash_ptrA++ =LData.Bytes.BLH;            // Save Data
  283.      Flash_Busy();                              //Busy
  284.      *Flash_ptrA++ =LData.Bytes.BLL;            // Save Data     
  285.      Flash_Busy();                              //Busy
  286.      Flash_ptrB+=4;
  287.      }
  288.     else
  289.     {
  290.      *Flash_ptrA++ = *Flash_ptrB++;           // 恢复Flash内的其他数据
  291.      Flash_Busy();                              //Busy
  292.     }
  293.     RESTORE_INT;    
  294.   }
  295.   FCTL1 = FWKEY;                            // Clear WRT bit
  296.   FCTL3 = FWKEY + LOCK;                     // Set LOCK bit
  297. /****************************************************************************
  298. * 名    称:Flash_ReadLong()
  299. * 功    能:从FlashROM读回一个长整型变量
  300. * 入口参数:Addr:待读出变量所在FlashROM单元的起始地址(存入的地址)
  301. * 出口参数:读回的长整型变量值
  302. ****************************************************************************/
  303. unsigned long int Flash_ReadLong (unsigned int Addr)
  304. {
  305.   unsigned char *Flash_ptrA;                    // Segment A pointer
  306.   union LongChar Data;
  307.   Flash_ptrA = (unsigned char *) FLASH_SAVEADDR;// Initialize Flash segment A pointer
  308.   Flash_ptrA+=Addr;
  309.   Data.Bytes.BHH=*Flash_ptrA++;
  310.   Data.Bytes.BHL=*Flash_ptrA++;
  311.   Data.Bytes.BLH=*Flash_ptrA++;
  312.   Data.Bytes.BLL=*Flash_ptrA++;     
  313.   return(Data.Long);
  314. }
  315. /****************************************************************************
  316. * 名    称:Flash_WriteFloat()
  317. * 功    能:向FlashROM写入一个浮点型变量
  318. * 入口参数:Addr:被写入FlashROM单元的地址
  319.             Data:待写入的浮点型变量(4字节数据)
  320. * 出口参数:无
  321. * 说    明: 该函数保存数据将占用Addr到Addr+3 共4个存储单元
  322. * 范    例:Flash_WriteFloat(15,3.14159);将浮点数3.14159写入15~18单元
  323.             Flash_WriteFloat(19,a);将浮点变量a写入19~22单元 
  324. ****************************************************************************/
  325. void Flash_WriteFloat (unsigned int Addr,float Data)
  326. {
  327.   union FloatChar FData;
  328.   unsigned char *Flash_ptrA;                // Segment A pointer
  329.   unsigned char *Flash_ptrB;                // Segment B pointer
  330.   unsigned int i;
  331.   FData.Float=Data;
  332.   Flash_CopyA2B();                          //Flash内的数据先保存起来
  333.   Flash_ptrA = (unsigned char *) FLASH_SAVEADDR;// Initialize Flash segment A pointer
  334.   Flash_ptrB = (unsigned char *) FLASH_COPYADDR;// Initialize Flash segment B pointer
  335.   Flash_Erase(FLASH_SAVEADDR);
  336.   FCTL1 = FWKEY + WRT;                      // Set WRT bit for write operation
  337.   FCTL3 = FWKEY;                            // Clear Lock bit
  338.   for (i=0; i<MAXNUM; i++)
  339.   {
  340.     DISABLE_INT;
  341.     if(i==Addr)
  342.     {
  343.      *Flash_ptrA++ =FData.Bytes.BHH;            // Save Data
  344.      Flash_Busy();                              //Busy
  345.      *Flash_ptrA++ =FData.Bytes.BHL;            // Save Data   
  346.      Flash_Busy();                              //Busy
  347.      *Flash_ptrA++ =FData.Bytes.BLH;            // Save Data
  348.      Flash_Busy();                              //Busy
  349.      *Flash_ptrA++ =FData.Bytes.BLL;            // Save Data     
  350.      Flash_Busy();                              //Busy
  351.      Flash_ptrB+=4;
  352.     }
  353.     else
  354.     {
  355.      *Flash_ptrA++ = *Flash_ptrB++;           // 恢复Flash内的其他数据
  356.      Flash_Busy();                              //Busy
  357.     }
  358.     RESTORE_INT;
  359.   }
  360.   FCTL1 = FWKEY;                            // Clear WRT bit
  361.   FCTL3 = FWKEY + LOCK;                     // Set LOCK bit
  362. /****************************************************************************
  363. * 名    称:Flash_ReadFloat()
  364. * 功    能:从FlashROM读回一个浮点型变量
  365. * 入口参数:Addr:待读出变量所在FlashROM单元的起始地址(存入的地址)
  366. * 出口参数:读回的浮点型变量值
  367. ****************************************************************************/
  368. float Flash_ReadFloat (unsigned int Addr)
  369. {
  370.   unsigned char *Flash_ptrA;                   // Segment A pointer
  371.   union FloatChar Data;
  372.   Flash_ptrA = (unsigned char *) FLASH_SAVEADDR;// Initialize Flash segment A pointer
  373.   Flash_ptrA+=Addr;
  374.   Data.Bytes.BHH=*Flash_ptrA++;
  375.   Data.Bytes.BHL=*Flash_ptrA++;
  376.   Data.Bytes.BLH=*Flash_ptrA++;
  377.   Data.Bytes.BLL=*Flash_ptrA++;     
  378.   return(Data.Float);
  379. }
  380. //==============================================================================================
  381.  

复制代码


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);
  10.  

复制代码

 
点赞 关注

回复
举报
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/7 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表