加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-15 20:01:35 所属栏目:百科 来源:网络整理
导读:关于MSP430-Flash超过64K的读写操作方法 微控论坛原创专贴 ?作者:微控论坛特约嘉宾 Qiaohaikun? 下面例子是Qiaohaikun先生几年前一直用在MSP430FG4618...使用过的,一直都挺好使。希望在此分享出来能帮助到有需要的网友们。同样,希望各网友们如有精品程序例
关于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. void ReadFlash(unsigned long int waddr,unsigned int length) ?
  10. { ?
  11. ? unsigned char i=0; ?
  12. ? if(FlashMangleFlag==0) ?
  13. ? { ?
  14. ? ? while(FCTL3 & BUSY); ?
  15. ? ? if(length>64) length=64; ?
  16. ? ? while(length--) ?
  17. ? ? { ?
  18. ? ? ? Internal_flashdata[i++]=__data20_read_char(waddr++); ?
  19. ? ? } ?
  20. ? } ?
  21. } ?
  22. //功能:段擦除; ?
  23. //输入:waddr为flash的地址, ?
  24. //void EraseFlashOneBlock(unsigned long int waddr) ?
  25. void EraseFlash(unsigned long int waddr) ?
  26. ? ? if((waddr>=0x1f400) && (waddr<0x20000)) ?
  27. ? ? ? while(FCTL3 & BUSY); ?
  28. ? ? ? _DINT(); ?
  29. ? ? ? FCTL2 = FWKEY + FSSEL1 + FN4; ?
  30. ? ? ? FCTL3 = FWKEY; ? ?? ?? ?? ?? ?? ?? ?? ?? ?// Clear Lock bit ?
  31. ? ? ? FCTL1 = FWKEY + ERASE; ? ?? ?? ?? ?? ?? ? // Set Erase bit ?
  32. ? ? ? __data20_write_char(waddr,0); ? ?? ?? ?? ?// Dummy write to erase Flash segment ?
  33. ? ? ? FCTL3 = FWKEY + LOCK; ? ?? ?? ?? ?? ?? ?? // Reset LOCK bit ?
  34. ? ? ? _EINT(); ?
  35. //功能:将数据写入flash; ?
  36. //输入:waddr为flash的地址,length为数据长度,*buf为指向数据的指针 ?
  37. unsigned char ?WriteFlash(unsigned long int waddr,unsigned char *buf,246)"> ? ? unsigned int i; ?
  38. ? ? unsigned char temp,ErrorFlag = 0; ?
  39. ? ? if(FlashMangleFlag==0) ?
  40. ? ? ? if((waddr>=0x1f400) && (waddr<0x20000)) ?
  41. ? ? ? { ?
  42. ? ? ?? ?while(FCTL3 & BUSY); ?
  43. ? ? ?? ?_DINT(); ?
  44. ? ? ?? ?FCTL2 = FWKEY + FSSEL1 + FN4; ?
  45. ? ? ?? ?FCTL3 = FWKEY; ? ?? ?? ?? ?? ?? ?? ?? ?? ?// Clear Lock bit ?
  46. ? ? ?? ?FCTL1 = FWKEY + WRT; ? ?? ?? ?? ?? ?? ?? ?// Set WRT bit for write operation ?
  47. ? ? ?? ?for(i=0;i<length;i++) ?
  48. ? ? ?? ?{ ?
  49. ? ? ?? ?? __data20_write_char(waddr,*buf); ? ? // Write value to flash ? ?
  50. ? ? ?? ?? temp = __data20_read_char(waddr); ? ?// Read one byte ?
  51. ? ? ?? ?? ?
  52. ? ? ?? ?? if(temp!=(*buf)) ? ?? ?? ?? ?? ?? ?? // 判断读出的数据和写入的数据是否相当 ?
  53. ? ? ?? ?? { ? ?
  54. ? ? ?? ?? ? ErrorFlag = 1; ? ?? ?? ?? ?? ?? ?//写入flash操作错误标志 ?
  55. ? ? ?? ?? ? ErrorFlashNum ++ ; ?
  56. ? ? ?? ?? } ? ?
  57. ? ? ?? ?? waddr++;buf++; ?
  58. ? ? ?? ?} ?
  59. ? ? ?? ? ?
  60. ? ? ?? ?FCTL1 = FWKEY; ?
  61. ? ? ?? ?FCTL3 = FWKEY + LOCK; ? ?? ?? ?? ?? ?? ?? // Reset LOCK bit ?
  62. ? ? ?? ?_EINT(); ?
  63. ? ? ?? ?if(ErrorFlag == 1) WriteFlashErrorNum(); ?
  64. ? ? ? } ?
  65. ? ? return ErrorFlag; ?
  66. } ? ?

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读