关于MSP430-Flash超过64K的读写操作方法

来源:互联网 发布:比特币交易 知乎 编辑:程序博客网 时间:2024/05/29 19:46
关于MSP430-Flash超过64K的读写操作方法
微控论坛原创专贴  作者:微控论坛特约嘉宾 Qiaohaikun 
下面例子是Qiaohaikun先生几年前一直用在MSP430FG4618...使用过的,一直都挺好使。希望在此分享出来能帮助到有需要的网友们。同样,希望各网友们如有精品程序例子的话同样可以发贴到微控论坛来。人人为我,我为人人! 
运行代码 复制代码
  1.  
  2. #include "msp430xG46x.h"  
  3. void WriteFlashErrorNum(void);  
  4. //----------------------------------------------------------------------  
  5. //功能:从flash中读出数据,只需给出首地址和取出数据的数量  
  6. //日期:2006.12.13  
  7. //输入:waddr为flash的地址,length为数据长度  
  8. //输出:无  
  9. //----------------------------------------------------------------------  
  10. void ReadFlash(unsigned long int waddr,unsigned int length)  
  11. {  
  12.   unsigned char i=0;  
  13.   if(FlashMangleFlag==0)  
  14.   {  
  15.     while(FCTL3 & BUSY);  
  16.     if(length>64) length=64;  
  17.     while(length--)  
  18.     {  
  19.       Internal_flashdata[i++]=__data20_read_char(waddr++);  
  20.     }  
  21.   }  
  22. }  
  23.  
  24. //----------------------------------------------------------------------  
  25. //功能:段擦除;  
  26. //日期:2006.12.13  
  27. //输入:waddr为flash的地址,  
  28. //输出:无  
  29. //----------------------------------------------------------------------  
  30. //void EraseFlashOneBlock(unsigned long int waddr)  
  31. void EraseFlash(unsigned long int waddr)  
  32. {  
  33.   if(FlashMangleFlag==0)  
  34.   {  
  35.     if((waddr>=0x1f400) && (waddr<0x20000))  
  36.     {  
  37.       while(FCTL3 & BUSY);  
  38.       _DINT();  
  39.       FCTL2 = FWKEY + FSSEL1 + FN4;  
  40.       FCTL3 = FWKEY;                            // Clear Lock bit  
  41.       FCTL1 = FWKEY + ERASE;                    // Set Erase bit  
  42.       __data20_write_char(waddr,0);             // Dummy write to erase Flash segment  
  43.       while(FCTL3 & BUSY);  
  44.       FCTL3 = FWKEY + LOCK;                     // Reset LOCK bit  
  45.       _EINT();  
  46.     }  
  47.   }  
  48. }  
  49.  
  50. //----------------------------------------------------------------------  
  51. //功能:将数据写入flash;  
  52. //日期:2006.12.13  
  53. //输入:waddr为flash的地址,length为数据长度,*buf为指向数据的指针  
  54. //输出:无  
  55. //----------------------------------------------------------------------  
  56. unsigned char  WriteFlash(unsigned long int waddr,unsigned char *buf,unsigned int length)  
  57. {  
  58.     unsigned int i;  
  59.     unsigned char temp,ErrorFlag = 0;  
  60.     if(FlashMangleFlag==0)  
  61.     {  
  62.       if((waddr>=0x1f400) && (waddr<0x20000))  
  63.       {  
  64.         while(FCTL3 & BUSY);  
  65.         _DINT();  
  66.         FCTL2 = FWKEY + FSSEL1 + FN4;  
  67.         FCTL3 = FWKEY;                            // Clear Lock bit  
  68.         FCTL1 = FWKEY + WRT;                      // Set WRT bit for write operation  
  69.         for(i=0;i<length;i++)  
  70.         {  
  71.           __data20_write_char(waddr,*buf);     // Write value to flash    
  72.           temp = __data20_read_char(waddr);    // Read one byte  
  73.            
  74.           if(temp!=(*buf))                     // 判断读出的数据和写入的数据是否相当  
  75.           {    
  76.             ErrorFlag = 1;                   //写入flash操作错误标志  
  77.             ErrorFlashNum ++ ;  
  78.           }    
  79.            
  80.           waddr++;buf++;  
  81.         }  
  82.           
  83.         while(FCTL3 & BUSY);  
  84.           
  85.         FCTL1 = FWKEY;  
  86.         FCTL3 = FWKEY + LOCK;                     // Reset LOCK bit  
  87.         _EINT();  
  88.         if(ErrorFlag == 1) WriteFlashErrorNum();  
  89.       }  
  90.     }  
  91.     return ErrorFlag;  
  92. }    

0 0
原创粉丝点击