能耐心看完的大侠,请多多指点,问题是这样的:
DM642外括FLASH,型号是S29AL008D,大小是1M,采用8位模式,用来做Boot,现在Boot调通了,FLASH也能顺利写入和读出,但在擦除的过程中遇到一个奇怪的问题:
假设我的主程序中仅包含如下语句:
main() { Uint32 j; Uint32 data_source1 = 0x90000000; EVMDM642_FLASH_chiperase(); //整片擦除 ● for(j=0; j<0x100; j++) //在前0xFF空间写入数据0x00到0xFF { FLASH_writeadata(data_source1+j,j); //写入一个字节 //ReadDeviceID(); } while(1) ; }
现在如果我在for语句前面设个断点,在写入数据成功后,希望对整片FLASH进行擦除,则将程序运行到断点处(擦除完毕但没运行for语句),在CCS的0x90000000空间看到FLASH空间在一段时间后确实变成了0xFF,但系统掉电重启后,直接打开0x90000000,发现上次写如的数据依然存在,说明擦除实际上没有成功。 但是,如果我在写入数据后,将for语句中包含的函数换成ReadDeviceID()或是其他函数,同样执行到断点处(擦除完毕但也没运行for语句),或者干脆将擦除函数后面的语句全部注释掉,这样在CCS里也能看到擦除成功,而且掉电重启后,访问0x90000000空间,数据全是0xFF,实际擦除成功。 请问这个现象是什么原因?换了函数,没有执行,是不是编译的时候堆栈溢出什么的?请哪位帮我做一下问题定位,谢谢! 另外,EVMDM642_FLASH_chiperase()函数很简单,如下: void EVMDM642_FLASH_chiperase(void) { Uint32 i; /* Start chip erase sequence */ //BYTE mode *((Uint8 *)EVMDM642_FLASH_CTLAAA) = 0xaa; *((Uint8 *)EVMDM642_FLASH_CTL555) = 0x55; *((Uint8 *)EVMDM642_FLASH_CTLAAA) = 0x80; *((Uint8 *)EVMDM642_FLASH_CTLAAA) = 0xaa; *((Uint8 *)EVMDM642_FLASH_CTL555) = 0x55; *((Uint8 *)EVMDM642_FLASH_CTLAAA) = 0x10; for(i=0; i<10000000; i++) ; } EVMDM642_FLASH_CTLAAA是在另一个头文件里定义的外部常量:
#define EVMDM642_FLASH_BASE 0x90000000 #define EVMDM642_FLASH_CTLAAA (EVMDM642_FLASH_BASE + 0xaaa)
|