4406|4

2618

帖子

0

TA的资源

纯净的硅(高级)

楼主
 

利用好MSP430芯片内的information memory,无需外接EEPROM芯片 [复制链接]

我们用的MSP430时,  内部有几十个字节information memory 可以当EEPROM来用, 无需再外扩EEPROM芯片,  用量保存一下系数的掉电保存的数据. 这样做很方便的。

下面看一下这个代码的相关说明,方便广大朋友们移植还用。.      

     特别说明:

     1.说明我用的是IAR编译器,  在IAR上一定能通过

    2. 利用information memory 作为EEPROM 掉电保存数据,这是这段程序第一个亮点;

    3. 写information memory 必须在RAM中运行程序.  将程序从flash 跑到RAM中运行, 很有意思. 这是第二个亮点.

分享一下代码,见下。

#include "MSP430x16x.h"
#include "string.h"
#include"stdlib.h"
#include"flash.h"


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


void flashWriteBlock(unsigned char * td,unsigned char *sd, unsigned char size)
{
int i;

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

}
/*******************************************************************************/
/* 段擦除子程序 */
/*******************************************************************************/
void flashErase(unsigned char *td)
{
FCTL2=FWKEY+FSSEL_1+10; //flash模块时钟源位MCLK 分频2
FCTL3=FWKEY; //解锁
FCTL1=FWKEY+ERASE; //段擦除
*td=0; //在欲进行操作的段中空写,启动擦除操作
FCTL3=FWKEY+LOCK; //锁定
}

//功能:FLASH操作 BYTE数据写入
//编程时钟:257KHZ~476KHZ
void flashWriteByte(unsigned char * pdata, unsigned char data)
{
//WDTCTL = WDTPW + WDTHOLD; //关闭看门狗
_DINT(); //关闭总中断
FCTL2 = FWKEY+FSSEL1+12; //3686400/300K=12
FCTL3 = FWKEY; //LOCK=0;
FCTL1=FWKEY+WRT; //WRT=1;
*pdata = data;
FCTL3 = FWKEY+LOCK; //
//开通看门狗
_EINT(); //开放中断
}

void flashWriteWord(unsigned short * pdata, unsigned short data)
{
//WDTCTL = WDTPW + WDTHOLD; //关闭看门狗
_DINT(); //关闭总中断
FCTL2 = FWKEY+FSSEL1+12;
FCTL3 = FWKEY; //LOCK=0;
FCTL1=FWKEY+WRT; //WRT=1;
*pdata = data;
FCTL3 = FWKEY+LOCK; //
//开通看门狗
_EINT(); //开放中断
}

喜欢的可以下载该源代码了。 7824.flash.h (569 Bytes, 下载次数: 20) 2555.flash.c (4.11 KB, 下载次数: 20)

最新回复

这个功能确实很不错,我一直在用,用来保存少量掉电后能够保存的数据非常方便。不过有一点必须注意,这部分一般分为4个段,每段从几十个字节到上百个字节不等,根据单片机型号不同有所不同。每一段写数据的时候,必须全部擦除,然后再写数据,不能只擦除几个字节。  详情 回复 发表于 2018-12-7 18:34
 
点赞 关注(1)

回复
举报

935

帖子

1

TA的资源

禁止发言

沙发
 
 
个人签名存储芯片/MCU/SRAM/PSRAM/DDR/FLASH/MRAM。web.www.sramsun.com  QQ3161422826 TEL:13751192923
 

回复

9790

帖子

24

TA的资源

版主

板凳
 
就是容量太小,擦写次数太少,不过自从有了FR铁电系列,EEPROM才真正被干掉
 
个人签名虾扯蛋,蛋扯虾,虾扯蛋扯虾
 
 

回复

6366

帖子

4914

TA的资源

版主

4
 
这个功能确实很不错,我一直在用,用来保存少量掉电后能够保存的数据非常方便。不过有一点必须注意,这部分一般分为4个段,每段从几十个字节到上百个字节不等,根据单片机型号不同有所不同。每一段写数据的时候,必须全部擦除,然后再写数据,不能只擦除几个字节。

点评

是啊 谢谢分享 真心不错的经验 好东西  详情 回复 发表于 2018-12-10 09:42
 
 
 

回复

2618

帖子

0

TA的资源

纯净的硅(高级)

5
 
tiankai001 发表于 2018-12-7 18:34
这个功能确实很不错,我一直在用,用来保存少量掉电后能够保存的数据非常方便。不过有一点必须注意,这部分 ...

是啊   谢谢分享    真心不错的经验   好东西
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

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

 
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
快速回复 返回顶部 返回列表