搜索
bottom↓
回复: 5

LPC1754 Flash IAP求助

[复制链接]

出0入0汤圆

发表于 2013-7-1 17:21:13 | 显示全部楼层 |阅读模式
本帖最后由 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碗,继续卖。说白了,通货膨胀就是,你的钱是挣来的,他的钱是印来的,掺和在一起,你的钱就贬值了。

出0入0汤圆

 楼主| 发表于 2013-7-2 16:09:04 | 显示全部楼层
有人知道吗?

出0入0汤圆

 楼主| 发表于 2013-7-4 11:41:09 | 显示全部楼层
都没遇到过吗?

出0入0汤圆

 楼主| 发表于 2013-7-5 11:51:07 | 显示全部楼层
本帖最后由 steaven2000 于 2013-7-5 11:55 编辑

如图。

在擦除Flash的0扇区后,使用变量temp读取地址0x00处的一个字,读出来为0xFFFFFFFF表明已经擦除了,但是IAR的memory窗口没有更新,即使手动输入0x00地址并回车,也不会更新。

奇怪的是问题只存在于使用JLINK烧录代码的那些扇区,其他未用到的扇区是可以自动/手动更新memory窗口的,使用的是IAR V6.3,是IAR/JLINK bug?

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

发表于 2014-9-30 14:50:19 | 显示全部楼层
把自己的程序文件擦除了(0-17扇区),那还会执行自己的代码吗?楼主我也碰到你和一样的问题了

出0入0汤圆

 楼主| 发表于 2014-9-30 15:26:47 | 显示全部楼层
benhaha 发表于 2014-9-30 14:50
把自己的程序文件擦除了(0-17扇区),那还会执行自己的代码吗?楼主我也碰到你和一样的问题了 ...

你根本没有看完我的帖子。我最后的帖子已说明IAP没有问题,只是IAR的显示有问题而已。

IAP当然不能擦除自己的代码,事实上也擦除不了。你可以把IAP的函数加上__ramfunc标识,让它在RAM里执行,这样你就能擦除FLASH了。

或者你让它在sector N运行,而擦除sector N之外的sectors也是可以的。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-10-2 23:15

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表