w282529350 发表于 2012-12-23 18:39:08

求教PIC16F1939单片机Flash擦除问题

如题
void Flash_Erase(unsigned int address)
{
        while(WR);
        EEADR = address;
        CFGS = 0;
        EEPGD = 1;
        FREE = 1;
        WREN = 1;
        GIE = 0;
        EECON2 = 0x55;
        EECON2 = 0xaa;
        WR = 1;
        asm("nop");
        asm("nop");
        while(FREE);
        GIE = 1;
        WREN = 0;
        while(WR);
}
在程序开始的控制字里面设置000H至1FFFH写保护,而2000H至3FFFH可以由EECON控制修改
小弟的意思是把2000H至3FFFH的空间当成EEPROM存放数据
现在的情况是flash的读写函数都写好了,且工作正常,唯一不足的地方就是这个flash的擦除函数,比如我在函数中调用Flash_Erase(0x2000),发现地址0x2000H以后的数据全部被擦除掉了,多次调试之后,仍没有解决这个问题,请问神坛里有没有哪位大虾写过这方面的程序,可否指教一下,不胜感激!

HadesHe 发表于 2012-12-23 18:56:26

为什么不用片内Eeprom

w282529350 发表于 2012-12-23 18:59:46

HadesHe 发表于 2012-12-23 18:56 static/image/common/back.gif
为什么不用片内Eeprom

感谢您的回复,我现在的数据有5K多,这个片子Flash有16K,留8K给程序,8K打算用来存数据,eeprom只有2K,不够,呵呵。可现在是flash只要擦除任意一个地址,全部被擦除掉,不知道怎么个问题~~

honami520 发表于 2012-12-23 19:01:48

FLASH又不是EEPROM,擦除的话,肯定不可能按照字节擦除的,肯定是按照PAGE或者SECTOR来擦除的,所以也许这是导致这个情况的原因

w282529350 发表于 2012-12-23 19:05:33

honami520 发表于 2012-12-23 19:01 static/image/common/back.gif
FLASH又不是EEPROM,擦除的话,肯定不可能按照字节擦除的,肯定是按照PAGE或者SECTOR来擦除的,所以也许这 ...

您好,是这样的,比如我靠mplab把片子的flash擦除干净,然后在2000H至21E0H之间写入数据,任意擦除一个位置,并且位于2000H地址之后,发现2000H至21E0H之间的数据全被擦除{:sad:}

snoopyzz 发表于 2012-12-23 19:05:53

除了ST的单片机,还真没见过其它能按字节擦除的MCU...

w282529350 发表于 2012-12-23 19:11:25

本帖最后由 w282529350 于 2012-12-23 19:15 编辑

snoopyzz 发表于 2012-12-23 19:05 static/image/common/back.gif
除了ST的单片机,还真没见过其它能按字节擦除的MCU...

您好,这是它手册的一段截图,我已经看了不下十遍了,至今没弄懂它所谓的按行擦除.....

snoopyzz 发表于 2012-12-23 19:29:46



估计是你的地址末尾5位不全是0的原故? 导致整片擦除了?

按理这个row可以是32字擦除的, 写入地址时估计要保证低5位为0

w282529350 发表于 2012-12-23 20:28:23

snoopyzz 发表于 2012-12-23 19:29 static/image/common/back.gif
估计是你的地址末尾5位不全是0的原故? 导致整片擦除了?

按理这个row可以是32字擦除的, 写入地址时估计要 ...

谢谢您的帮助,我再理解一下,呵呵,没办法,天生愚笨。。。

w282529350 发表于 2012-12-23 20:49:49

谢谢楼上诸位的帮忙,问题已经解决,我把程序中GIE=0;关中断的语句提到最前面就解决了
void Flash_Erase(unsigned int address)
{
      GIE = 0;
      while(WR);
      EEADR = address;
      CFGS = 0;
      EEPGD = 1;
      FREE = 1;
      WREN = 1;
      EECON2 = 0x55;
      EECON2 = 0xaa;
      WR = 1;
      asm("nop");
      asm("nop");
      while(FREE);
      GIE = 1;
      WREN = 0;
      while(WR);
}

yklstudent 发表于 2012-12-23 22:17:56

哎 楼主跟我搞的一样嘛
问下 楼主你这个用BOOTLOADER来修改数据了吗?
PIC内部的FLASH没法按字节来擦除、存储数据
但是软件可以帮忙做到的
感觉还是可以跟EEPROM样的来使用的

w282529350 发表于 2012-12-24 08:54:52

yklstudent 发表于 2012-12-23 22:17 static/image/common/back.gif
哎 楼主跟我搞的一样嘛
问下 楼主你这个用BOOTLOADER来修改数据了吗?
PIC内部的FLASH没法按字节来擦除、存 ...

我第一次用pic单片机,不怎么了解,呵呵
这个pic的程序存储器不是有16K么,我一半用来放程序,一半用来放数据
我都是在程序里操作flash的,比如说擦除,读写什么的~~,你说的那些不懂哎,呵呵

yklstudent 发表于 2012-12-24 09:19:51

w282529350 发表于 2012-12-24 08:54 static/image/common/back.gif
我第一次用pic单片机,不怎么了解,呵呵
这个pic的程序存储器不是有16K么,我一半用来放程序,一半用来放 ...

我的意思就是不是在运用程序部分来进行修改参数(即擦除、读写、修改FLASH)
而是FLASH中,分出一个FLASH部分,用来写BOOTLOADER程序;可以用来在线IAP下载运用程序和修改运用程序部分的参数
我现在就是这个BOOTLOADER写不起来
不知道具体怎么做,无从下手。
对PIC的BOOTLOADER还是很不了解

w282529350 发表于 2012-12-24 09:34:58

yklstudent 发表于 2012-12-24 09:19 static/image/common/back.gif
我的意思就是不是在运用程序部分来进行修改参数(即擦除、读写、修改FLASH)
而是FLASH中,分出一个FLASH ...

额 这些没有接触过,感觉bootloader很高端的样子,呵呵,就昨天的一个擦除就把我搞惨了,参考的网上的程序,看他们GIE=0的位置写的很随意,我也就没在意,哎 以后还得严格按照它们的手册来写{:dizzy:}

shjw 发表于 2012-12-25 11:04:15

学习了,忙完这段时间试试。以前不太考虑这个问题,因为有EEROM
页: [1]
查看完整版本: 求教PIC16F1939单片机Flash擦除问题