搜索
bottom↓
回复: 5

奇怪了,msp430f149的flash擦除一次只能擦掉一段(512Byte),但我的擦除函数一次只能擦掉25

[复制链接]

出0入0汤圆

发表于 2011-7-9 10:14:28 | 显示全部楼层 |阅读模式
我经过仿真发现我的函数一次只能擦除256B,下面是仿真截图:
擦除前得flash中的内容:


(原文件名:1.jpg)

擦除后就变成FF了,但少擦了256B

(原文件名:2.jpg)


下面是我的部分函数:
//*************************************************************************
// 描述:时钟初始化,使用外部晶振7.3728M
// 输入:无  输出:无
//*************************************************************************
void CLK_init(void)
{
        unsigned int i=0;
        BCSCTL1 &= ~XT2OFF;       // XT2on,使能外部高速晶振
        do
        {
            IFG1&=~OFIFG;//清除振荡器失效标志
            P5OUT ^=1<<7;  //喂狗语句,只需要该脚取反即可
            for (i = 0xFF; i > 0; i--);// 延时,等待XT2起振
        }
        while ((IFG1 & OFIFG) != 0);   // 判断XT2是否起振
        P5OUT ^=1<<7;  //喂狗语句,只需要该脚取反即可
        BCSCTL2 |= SELM_2 + SELS;  // MCLK = SMCLK = XT2 (safe),选择外部晶振
}

//**************************************************************************
// 描述: FLASH擦除操作
// 输入: 16位 FLASH地址
// 输出: 无
// 注:只能擦除一段flash,512B,2011-07-06
//*************************************************************************
void EraseFlash(unsigned int waddr)
{
        _BIC_SR(GIE);                        // 关闭总中断        
       
        unsigned int *Flash_ptr;
        Flash_ptr = (unsigned int *) waddr; // Initialize Flash pointer
        FCTL2 = FWKEY + FSSEL0 + FN1;  //选择DCO为flash时钟,MCLK/2,FN1 4分频
        FCTL1 = FWKEY + ERASE;       //FWKEY表示写安全键值A5,ERASE为擦除一段
        FCTL3 = FWKEY;              //flash不加锁,即解锁
        *Flash_ptr = 0;             //在要擦除的地址内空写一次,用以启动擦除操作
        while(FCTL3 & BUSY);        //等待擦除操作完成,BUSY为1则没有完成
        FCTL3=FWKEY+LOCK;           //锁定
       
        _BIS_SR(GIE);              //  再次开总中断使能
}

阿莫论坛20周年了!感谢大家的支持与爱护!!

该献的血还是要献的。你不献他不献。难道让我去献? --- 出自坛友:lovejp1981

出0入0汤圆

发表于 2011-7-9 16:37:40 | 显示全部楼层
149一共512,分A,B段,一段就是256吧

出0入0汤圆

 楼主| 发表于 2011-7-10 15:43:30 | 显示全部楼层
回复【1楼】15085362
-----------------------------------------------------------------------

我擦写的主存,每段512B,信息存储器有2段A、B,每段256B的,,,,

出0入0汤圆

发表于 2011-10-15 08:35:14 | 显示全部楼层
回复【2楼】guxingganyue
回复【1楼】15085362  
-----------------------------------------------------------------------
我擦写的主存,每段512b,信息存储器有2段a、b,每段256b的,,,,
-----------------------------------------------------------------------

如果一直往里写数据,一段写完后,是否按地址顺序直接跳到下一段执行(继续写数据
)?

出0入0汤圆

发表于 2011-10-15 16:23:04 | 显示全部楼层
回复【楼主位】guxingganyue
-----------------------------------------------------------------------

我仔细看了下你的问题,两个建议
1 确定一下你CODE MEMORY的起始地址,(这个可以在调试的时候看到的),如果是从0x1100开始的,那么你一上来,就erase这个段的 512B的地址,那你就死定了,事实上,你已经把你刚烧写进来的代码erase了!那出现这个问题就很正常
2 MSP430,一般来说,FLASH写是可以bit ,BYTE,WORD,并且任意地址写的,但是erase,只能是段,在msp430149中,一段应该是512BYTES,你可以换一个稍大点的地址erase,应该是没有问题的.
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-9-2 07:22

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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