|
本帖最后由 steaven2000 于 2013-7-2 16:29 编辑
做Flash IAP遇到拦路虎了,求助各位。、
使用的是LPC1754(128KB FLASH),现在是按照用户手册第32章来调试IAP功能。也参考了网上一些IAP的做法,比如FLASH分2个区等。
现在遇到的问题是,FLASH擦除有问题,具体描述如下。
1、测试程序大概有几十KB,IAP代码单独写了一个IAP_Test()函数,操作是在中断开启之前。
2、关于IAP操作的代码都加了__ramfunc标识,意图可以将Flash全部擦除,但是IAR会报警,说从__ramfunc函数中执行IAP_Entry是访问ROM的动作,忽略了它。
顺便说一下,如果是更新Flash全部代码,那么IAP代码应该是只能从RAM中执行吧(不要说分块了,因为代码可能就差不多128KB)。
Warning[Ta022]: Possible rom access (<ptr>) from within a __ramfunc function E:\..\source\Flash.c 42
__ramfunc INT8U IAP_Prepare_Secotr( INT8U start_sector, INT8U end_sector )
{
IAP_Command[0] = CMD_PREPARE_SECTOR;
IAP_Command[1] = start_sector;
IAP_Command[2] = end_sector;
IAP_Entry( IAP_Command, IAP_Result );
return IAP_Result[0];
}
3、IAP测试代码
result = IAP_Read_ChipID();
result = IAP_Read_BootVer();
result = IAP_Read_ChipSN();
result = IAP_Prepare_Secotr( 0, 17 );
result = IAP_Erase_Sector( 0, 17, CPU_CLOCK_IN_KHZ );
result = IAP_Prepare_Secotr( 0, 17 );
result = IAP_Write_Flash( 0x00018000, (INT32U)(&IAP_Buffer), 0x100, CPU_CLOCK_IN_KHZ );
result = IAP_Write_Flash( 0x00010000, (INT32U)(&IAP_Buffer), 0x100, CPU_CLOCK_IN_KHZ );
result = IAP_Write_Flash( 0x0000F000, (INT32U)(&IAP_Buffer), 0x100, CPU_CLOCK_IN_KHZ );
result = IAP_Write_Flash( 0x0000E000, (INT32U)(&IAP_Buffer), 0x100, CPU_CLOCK_IN_KHZ );
result = IAP_Write_Flash( 0x0000D000, (INT32U)(&IAP_Buffer), 0x100, CPU_CLOCK_IN_KHZ );
result = IAP_Write_Flash( 0x0000C000, (INT32U)(&IAP_Buffer), 0x100, CPU_CLOCK_IN_KHZ );
result = IAP_Write_Flash( 0x0000B000, (INT32U)(&IAP_Buffer), 0x100, CPU_CLOCK_IN_KHZ );
result = IAP_Write_Flash( 0x0000A000, (INT32U)(&IAP_Buffer), 0x100, CPU_CLOCK_IN_KHZ );
result = IAP_Write_Flash( 0x00009000, (INT32U)(&IAP_Buffer), 0x100, CPU_CLOCK_IN_KHZ );
result = IAP_Write_Flash( 0x00008000, (INT32U)(&IAP_Buffer), 0x100, CPU_CLOCK_IN_KHZ );
result = IAP_Write_Flash( 0x00007000, (INT32U)(&IAP_Buffer), 0x100, CPU_CLOCK_IN_KHZ );
result = IAP_Write_Flash( 0x00006000, (INT32U)(&IAP_Buffer), 0x100, CPU_CLOCK_IN_KHZ );
result = IAP_Write_Flash( 0x00005000, (INT32U)(&IAP_Buffer), 0x100, CPU_CLOCK_IN_KHZ );
result = IAP_Write_Flash( 0x00004000, (INT32U)(&IAP_Buffer), 0x100, CPU_CLOCK_IN_KHZ );
result = IAP_Write_Flash( 0x00003000, (INT32U)(&IAP_Buffer), 0x100, CPU_CLOCK_IN_KHZ );
result = IAP_Write_Flash( 0x00002000, (INT32U)(&IAP_Buffer), 0x100, CPU_CLOCK_IN_KHZ );
result = IAP_Write_Flash( 0x00001000, (INT32U)(&IAP_Buffer), 0x100, CPU_CLOCK_IN_KHZ );
result = IAP_Write_Flash( 0x0000D000, (INT32U)(&IAP_Buffer), 0x100, CPU_CLOCK_IN_KHZ );
发现IAP_Erase_Sector()执行后,发现Flash并没有被完全擦除,但是执行结果是CMD_SUCCESS, 以上所有的 IAP_Write_Flash()执行的结果页都是CMD_SUCCESS,但显然有些没有将数据编程到Flash中。
现象是128KB Flash中已经被测试代码占用的, 这部分擦除及编程都有问题;其余的Flash可以正常擦除和编程。
4、再问,LPC1754是不是没有Flash加速模块啊,ioLPC1754.h中根本没有定义Flash加速模块的寄存器。
试验了用LPC1768的头文件设置加速没有解决问题
试验了把LPC1754系统时钟从100MHz改为50MHz也没有解决问题
any help please?
|
阿莫论坛20周年了!感谢大家的支持与爱护!!
你熬了10碗粥,别人一桶水倒进去,淘走90碗,剩下10碗给你,你看似没亏,其实你那10碗已经没有之前的裹腹了,人家的一桶水换90碗,继续卖。说白了,通货膨胀就是,你的钱是挣来的,他的钱是印来的,掺和在一起,你的钱就贬值了。
|