唉 纠结这个单片机的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读写错误