大连创客空间

 找回密码
 立即注册吧!

QQ登录

只需一步,快速开始

一键登录:

搜索
查看: 4878|回复: 21
收起左侧

【大赛原创经验贴】内部Flash的读写包含对单个地址的修改

[复制链接]
发表于 2012-7-15 22:27:39 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多交流,硬件的世界向你敞开大门!

您需要 登录 才可以下载或查看,没有帐号?立即注册吧!

x
MSP430G2553 的Flash分为 主Flash和 信息Flash
主flash就是存储程序的
信息flash就是我们可以存储我们想要存储的数据的

信息存储器的大小是256byte ,分为4个64byte的存储段
flash的是能一个地址一个地址的写  , 但是只能整段擦除
#define  SegA    0x010C0
#define  SegB    0x01080
#define  SegC    0x01040
#define  SegD    0x01000
上面是各个段的其实地址
经我的发现 , SegA不能写 , 里面可能放了单片机的一些数据吧, 还是不要强制擦除了
所以实际可用的是有192byte
还有一点就是flash里面的数据只能又"1"变为"0" , 不能又 "0"变为"1", 所以写的时候要注意

大概函数分为
flash初始化
段擦除
向某个地址写数据
向某个地址读数据
向某个地址修改数据
连续写数据

flash初始化
void  FlashInit()  //select clock & divider
{
    FCTL2 = FWKEY + FSSEL_2 + FN1;          //选择时钟SMCLK    2 分频
}

段擦除
void FlashErase(int SegX)
{
    _DINT();                                //关中断
    FlashCheckBusy();                       //检忙
    FCTL3 = FWKEY ;                         //lock = 0 开锁
    FCTL1 = FWKEY + ERASE;                  //使能段擦除
    *((int *)SegX) = 0x00;                  //段擦除
    FlashCheckBusy();                       //检忙
    FCTL3 = FWKEY | LOCK;                   //lock = 1 上锁
}

向某个地址写数据
void FlashWriteChar(unsigned int addr , char wdata)
{
    _DINT();                                //关中断, 防止读写的时候发生意外
    FlashCheckBusy();                       //检忙
    FCTL3 = FWKEY;                          //开锁
    FCTL1 = FWKEY + WRT;                    //准备写
    *((unsigned char *)addr) = wdata;       //写
    FCTL1 = FWKEY;                          //
    FCTL3 = FWKEY + LOCK;                   //上锁
    return ;
}

向某个地址读数据
char FlashReadChar(unsigned int addr)
{
    char rdata;
    rdata = *(char *)addr;
    return rdata;
}

连续写数据
void FlashBurstWrite(int SegX , int *pStr)
{
    int i = 0;
    FlashErase(SegX);
    FCTL3 = FWKEY ;         //lock = 0 开锁
    FCTL1 = FWKEY + WRT;    //
    for(i = 0 ; i < sizeof(pStr) ; i ++)
    {
      *(unsigned char *)(SegX + i) = *(pStr + i);
    }
    FCTL1 = FWKEY;
    FCTL3 = FWKEY + LOCK;
}

连续读我不提供 , 我不能什么都做完了吧 , 即使后面的程序包里我也删除了的
其实很简单 , 就是地址加 , 再读 , 一个循环就搞定了

下面是修改某个地址的数据
因为msp430只能只能整段擦除 , 所以修改某个地址的数据的话过程比较复杂 , 其实还是挺简单的
先把要修改的那一段存入缓存数组  --> 修改要修改地址的数据 -->  再写入那一段 -->搞定
void FlashModifyChar(uint SegX, char AddrNum , char wdata)
{
    char i,TempArry[SegSize];
    for ( i = 0 ; i < SegSize ; i ++)   //读入内存
    {
        TempArry = *(uint *)(SegX + i);
    }
    TempArry[AddrNum] = wdata;
    FlashErase(SegX);
    FCTL3 = FWKEY ;         //lock = 0 开锁
    FCTL1 = FWKEY + WRT;    //
    for (i = 0 ; i < SegSize ; i ++)
    {
      *(unsigned char *)(SegX + i) = TempArry;
    }
    FCTL1 = FWKEY;
    FCTL3 = FWKEY + LOCK;
}

提醒大家一句flash的读写要注意数据类型 , 不然的话flash的数据的读写不会像你要求的那样读写 ,
多用调试 ,

写程序的时候多用宏定义  , 使程序的移植性更好

我DS1302的程序和AT24C02的程序也全部调试完了 , 什么时候找了时间上传上来与大家分享


flash module.zip (31.91 KB, 下载次数: 372)
回复

使用道具 举报

发表于 2012-7-20 16:25:46 | 显示全部楼层
学习了
回复 支持 反对

使用道具 举报

发表于 2012-7-21 00:25:45 | 显示全部楼层
想请教下,FLASH的擦写只是信息断吗? 那不停往里烧程序算是擦写嘛?

点评

FLASH分为main flash and information flash , main flash主要用于装程序文件 , information flash 才是我们用的 main flash要用const @0x xxxx 可以手动配置存放位置 , 亲测可用 information flash有4个段 ,每个段  详情 回复 发表于 2012-7-24 16:19
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-7-24 16:19:54 | 显示全部楼层

FLASH分为main flash and information flash ,
main flash主要用于装程序文件 , information flash 才是我们用的
main flash要用const  @0x xxxx 可以手动配置存放位置 , 亲测可用
information flash有4个段 ,每个段64byte, 只能整段擦除 , 而且只能有1变为0
  而且我写的话有一个段不能擦除 , 我猜想可能存放的是DCO的一些信息
  所以实际可用的只有3*64byte  
  SegA不能擦除 , 详细见程序
回复 支持 反对

使用道具 举报

发表于 2012-7-26 19:06:40 | 显示全部楼层
昨日依然 发表于 2012-7-24 16:19
FLASH分为main flash and information flash ,
main flash主要用于装程序文件 , information flash 才是 ...

哦哦,多谢。
回复 支持 反对

使用道具 举报

发表于 2012-7-26 19:19:33 | 显示全部楼层
学习了!~~
回复 支持 反对

使用道具 举报

发表于 2012-7-26 19:39:46 | 显示全部楼层
void FlashWriteChar(unsigned int addr , char wdata)
{

}
回复 支持 反对

使用道具 举报

发表于 2012-7-26 19:40:07 | 显示全部楼层
这里面没有return吧。。

点评

这个可以有 , return说白一点 --- 结束  详情 回复 发表于 2012-7-29 15:32
回复 支持 反对

使用道具 举报

发表于 2012-7-26 20:17:19 | 显示全部楼层
说好的
“我DS1302的程序和AT24C02的程序也全部调试完了 , 什么时候找了时间上传上来与大家分享”

点评

这个程序调完后就走了 , ,,所以,,,昨天才回来  详情 回复 发表于 2012-7-29 15:32
回复 支持 反对

使用道具 举报

发表于 2012-7-27 22:02:21 | 显示全部楼层
不错,谢谢lz共享!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-7-29 15:32:13 | 显示全部楼层
jay152789733 发表于 2012-7-26 20:17
说好的
“我DS1302的程序和AT24C02的程序也全部调试完了 , 什么时候找了时间上传上来与大家分享”
呢{:soso ...

这个程序调完后就走了 , ,,所以,,,昨天才回来
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-7-29 15:32:53 | 显示全部楼层
jay152789733 发表于 2012-7-26 19:40
这里面没有return吧。。

这个可以有 , return说白一点 --- 结束
回复 支持 反对

使用道具 举报

发表于 2012-7-29 17:23:47 | 显示全部楼层
开始学习
回复 支持 反对

使用道具 举报

发表于 2012-8-2 22:40:36 | 显示全部楼层
我DS1302的程序和AT24C02的程序也全部调试完了 , 什么时候找了时间上传上来与大家分享
灰常希望楼主共享,今天弄了一整天都没整出来
回复 支持 反对

使用道具 举报

发表于 2012-8-4 21:53:58 | 显示全部楼层
嗯  不错  
回复 支持 反对

使用道具 举报

发表于 2012-8-8 21:44:41 | 显示全部楼层
感谢分享。。。。。。。。。。。。。。
回复 支持 反对

使用道具 举报

发表于 2012-8-9 08:47:46 | 显示全部楼层
学习了
回复 支持 反对

使用道具 举报

发表于 2012-8-13 16:42:19 | 显示全部楼层
学习 谢谢
回复 支持 反对

使用道具 举报

发表于 2012-9-2 11:54:31 | 显示全部楼层
请问一下 *((int *)SegX) = 0x00;                  //段擦除
这个段擦除为什么要这样写呢

点评

强制转换为地址指针  详情 回复 发表于 2012-9-17 14:00
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-9-17 14:00:21 | 显示全部楼层
sunweijie19 发表于 2012-9-2 11:54
请问一下 *((int *)SegX) = 0x00;                  //段擦除
这个段擦除为什么要这样写呢
...

强制转换为地址指针
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册吧!

本版积分规则

单片机开发者1群:235808606;会员QQ 6群:254085994; 1群:12835691(满); 2群:121061287(满); 3群:237320668(满);4群:249652919(满);5群:253578883(满);大赛1群:187926790(满),2群:231577758(满),3群:249652919(满)。 TI杯4群:58129202(满)。
载入中

QQ|手机版|小黑屋|Archiver|大连创客空间 ( 辽ICP备15004617号-2  

GMT+8, 2017-3-1 00:55 , Processed in 0.316759 second(s), 33 queries .

地址:辽宁省大连市高新园区火炬路7号17层 QQ:2401085253

Copyright © 2010-2015 创客空间(大连)科技有限公司 All Rights Reserved.

快速回复 返回顶部 返回列表