当前位置: 代码迷 >> 单片机 >> C8051F060 写FLASH有关问题
  详细解决方案

C8051F060 写FLASH有关问题

热度:56   发布时间:2016-04-28 15:49:46.0
C8051F060 写FLASH问题
唉 纠结这个单片机的FLASH读写快一个星期了..痛苦不堪...先上代码
C/C++ code
void FLASH_write( unsigned int dec_addr,unsigned char *scr_buff ,unsigned int len  ){    unsigned int    i;    unsigned char xdata *pwrite ;    char SFRPAGE_SAVE= SFRPAGE;    SFRPAGE= 0x00;    EA = 0;            // 禁止中断    pwrite = (unsigned char xdata *)dec_addr;  //初始化地址        FLACL |= 0x80 ;  //解锁0x8000--0xFFFF存储器块,可以通过JTAG接口进行读操作          FLSCL |= 0x01;    // set FLWE,允许通过用户软件写/擦除FLASH    PSCTL |= 0x02;    // set PSEE,允许FLASH擦除    PSCTL |= 0x01;    // 使MOVX写指令指向FLASH,允许写        *pwrite  = 0x55;   // 用movx指令向待擦除扇区的任何一个地址写入一个数据    [color=#FF0000]PSCTL &= ~0x02;        //clr PSEE, 禁止擦除[/color]    for( i=0;i<len;i++)     // 向被擦除页内的期望地址写入一个数据字节。重复该步,直到写完所有字节    {            *pwrite++ = *scr_buff ++;    }        PSCTL &= ~0x01;    // 清除PSWE位,使MOVX命令指向XRAM数据空间    FLSCL &= ~0x00 ; // 禁止通过用户软件写/擦除flash    EA = 1;            // 重新允许中断     SFRPAGE=SFRPAGE_SAVE;} 


我在加红那里加了个断点,然后F10 下一步发现它直接跳过for循环了...也就是说写flash操作根本没执行....
调用FLASH_write(....)函数实在main()里面 
  .....
  unsigned char buffer1[256] = { 0x55,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0a,0x0b,0x0c,0x0d,0x0e,0x0f,
  0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18,0x19,0x1a,0x1b,0x1c,0x1d,0x1e,0x1f,
  };
FLASH_write(0x8000,buffer1,256);
  .....
  求指点啊啊啊啊啊

------解决方案--------------------
估计memory model没有设对,需要设成small mode

或者显示指出,
void FLASH_write( unsigned int dec_addr,unsigned char *scr_buff ,unsigned int len )
{
unsigned int i;
unsigned char xdata * data pwrite ;
char SFRPAGE_SAVE= SFRPAGE;

------解决方案--------------------
看到两个问题,不知道有没有关系:
1.PSCTL &= ~0x02; //clr PSEE, 禁止擦除
这句太靠前了,应该在FOR之后

2.*pwrite = 0x55; // 用movx指令向待擦除扇区的任何一个地址写入一个数据
这里多写了一次,后面应该不能再写一次这个地址,搞不好,还会产生FLASH读写错误

  相关解决方案