[资料分享] 【转】如何利用好MSP430芯片内的information memory 作为掉电数据保存(EEPROM)

wstt   2013-11-25 00:00 楼主
受朋友之托,今天第一次给大家发帖子,  把珍藏的成年老窖, 让大家尝尝,  下面是我珍藏多年的代码,我自认为有价值,  如果对你有点点帮助,请个我回个帖子.
我们用的MSP430时,  内部有几十个字节information memory 可以当EEPROM来用, 无需再外扩EEPROM芯片,  用量保存一下系数的掉电保存的数据. 我一直用这个, 很好用.      
     特别说明:
     1.说明我用的是IAR编译器,  在IAR上一定能通过
    2. 利用information memory 作为EEPROM 掉电保存数据,这是这段程序第一个亮点;
    3. 写information memory 必须在RAM中运行程序.  将程序从flash 跑到RAM中运行, 很有意思. 这是第二个亮点.
    4. 源文件,下载
2555.flash.c (4.11 KB)
(下载次数: 2, 2013-11-25 00:00 上传)
7824.flash.h (569 Bytes)
(下载次数: 2, 2013-11-25 00:00 上传)
  1. #include "MSP430x16x.h"
  2. #include "string.h"
  3. #include"stdlib.h"
  4. #include"flash.h"

  5. /************************************************************************************
  6. ** 函数名称: flashWrite
  7. ** 功能描述: 在MSP430flash中写数据
  8. **
  9. ** 输  入: td:写入地址, sd:源数据指针, size:写入字节数
  10. ** 输  出: 无
  11. ** 返 回 值: 返回需要发送给其他任务处理的数据块的指针。
  12. ** 全局变量:
  13. ** 调用模块:
  14. ** 作  者: 陈文浩
  15. ** 日  期: 2010年07月12日
  16. ************************************************************************************/
  17. void flashWrite(unsigned char * td, unsigned char *sd, unsigned char size)
  18. {
  19. typedef void(*funp)(unsigned char*,unsigned char *, unsigned char); //定义函数指针类型
  20. funp FLASHBLK;
  21. char ramcode[100]; //ram内程序及数组地址指针
  22. _DINT();
  23. //ramcode=(char *)malloc(sizeof(char)*100); //为放入内存的子程分配空间(需先将heap值设为180)
  24. FLASHBLK = flashWriteBlock; //函数指针赋值
  25. memcpy(ramcode,(char *)FLASHBLK,100); //将块写子程放入ram中已分配空间
  26. FLASHBLK=*(funp)ramcode; //将函数指针指向ram中的块写子程
  27. flashErase(td); //段擦
  28. (FLASHBLK)(td,sd, size); //块写(调用的是ram中的块写子程)
  29. //free(ramcode); //释放空间
  30. _EINT(); //开放中断
  31. }


  32. void flashWriteBlock(unsigned char * td,unsigned char *sd, unsigned char size)
  33. {
  34. int i;

  35. while((FCTL3&BUSY)!=0x00); //检测busy位
  36. FCTL2=FWKEY+FSSEL_1+20; //flash模块时钟源为MCLK 分频2
  37. FCTL3=FWKEY; //解锁
  38. FCTL1=FWKEY+BLKWRT+WRT; //块写
  39. for(i=0;i
  40. {
  41. *td++=*sd++; //写入
  42. while((FCTL3&WAIT)==0); //检测wait位 是否写入该字
  43. }
  44. FCTL1=FWKEY; //BLKWRT WRT位复位
  45. while((FCTL3&BUSY)!=0x00); //检测BUSY位
  46. FCTL3=FWKEY+LOCK; //锁定

  47. }
  48. /*******************************************************************************/
  49. /* 段擦除子程序 */
  50. /*******************************************************************************/
  51. void flashErase(unsigned char *td)
  52. {
  53. FCTL2=FWKEY+FSSEL_1+10; //flash模块时钟源位MCLK 分频2
  54. FCTL3=FWKEY; //解锁
  55. FCTL1=FWKEY+ERASE; //段擦除
  56. *td=0; //在欲进行操作的段中空写,启动擦除操作
  57. FCTL3=FWKEY+LOCK; //锁定
  58. }
  59. //功能:FLASH操作 BYTE数据写入
  60. //编程时钟:257KHZ~476KHZ
  61. void flashWriteByte(unsigned char * pdata, unsigned char data)
  62. {
  63. //WDTCTL = WDTPW + WDTHOLD; //关闭看门狗
  64. _DINT(); //关闭总中断
  65. FCTL2 = FWKEY+FSSEL1+12; //3686400/300K=12
  66. FCTL3 = FWKEY; //LOCK=0;
  67. FCTL1=FWKEY+WRT; //WRT=1;
  68. *pdata = data;
  69. FCTL3 = FWKEY+LOCK; //
  70. //开通看门狗
  71. _EINT(); //开放中断
  72. }
  73. void flashWriteWord(unsigned short * pdata, unsigned short data)
  74. {
  75. //WDTCTL = WDTPW + WDTHOLD; //关闭看门狗
  76. _DINT(); //关闭总中断
  77. FCTL2 = FWKEY+FSSEL1+12;
  78. FCTL3 = FWKEY; //LOCK=0;
  79. FCTL1=FWKEY+WRT; //WRT=1;
  80. *pdata = data;
  81. FCTL3 = FWKEY+LOCK; //
  82. //开通看门狗
  83. _EINT(); //开放中断
补充一点,部分MSP430中A区中存有部分芯片调校数据,如果需要利用A区,需要仔细看一下DATASHEET.原文:http://www.deyisupport.com/question_answer/microcontrollers/msp430/f/55/t/30948.aspx
《MCU工程师炼成记》作者之一

回复评论 (1)

为什么必须放到ram中运行,这个得解释清楚呀
点赞  2013-11-25 08:48
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复