|
技术交流 | 电路欣赏 | 工控天地 | 数字广电 | 通信技术 | 电源技术 | 测控之家 | EMC技术 | ARM技术 | EDA技术 | PCB技术 | 嵌入式系统 驱动编程 | 集成电路 | 器件替换 | 模拟技术 | 新手园地 | 单 片 机 | DSP技术 | MCU技术 | IC 设计 | IC 产业 | CAN-bus/DeviceNe |
调试DM642外部FLASH奇怪的问题 |
作者:catiya 栏目:DSP技术 |
能耐心看完的大侠,请多多指点,问题是这样的: 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) |
2楼: | >>参与讨论 |
作者: aspl 于 2007/1/16 17:41:00 发布:
是不是程序优化导致的哦 |
3楼: | >>参与讨论 |
作者: catiya 于 2007/1/17 12:28:00 发布:
to 2楼 没有优化啊。能具体点吗? |
4楼: | >>参与讨论 |
作者: catiya 于 2007/1/23 12:29:00 发布:
自己顶一下 哪位帮我分析一下,估计是哪方面的原因? |
|
|
免费注册为维库电子开发网会员,参与电子工程师社区讨论,点此进入 |
Copyright © 1998-2006 www.dzsc.com 浙ICP证030469号 |