
我找到一个比较好的折中办法: 1 IAP 起始地址0x08000000,APP 起始地址0x08004000,上电复位进入IAP 程序; 2 APP 程序的长度和CRC32校验码存放在0x0800FC00(Flash最后一页);
1、检查代码跳转方式是否正确:IAP程序为了跳转到bootloader中,使用函数指针+汇编指令的方式进行跳转,这样可以保证代码跳转的正确性。需要检查跳转代码中是否有误,确保可以正常跳转到指定的ROM段。
2、检查内存布局是否正确:在跳转前,需要确保在IAP和bootloader两段程序之间有足够的空间,以免跳转后出现内存溢出等问题。需要检查bootloader程序所在的ROM段以及可以被复制和更新的数据段是否设置正确。
近期 我也遇到了类似的问题,
不过我用的是LPC2214芯片,解决办法应该类似,
在调用IAP程序之前,要保证所有的中断是关闭状态,然后
uint8 a[10];
uchar i;
for(i=0;i<10;i++)
{
a[i]=0x0B;
}
SelSector(START_SECTOR,END_SECTOR);
//选择扇区 将要保存的数据放在,第十扇区,
EraseSector(START_SECTOR,END_SECTOR);
//擦除扇区
BlankCHK(START_SECTOR,END_SECTOR);
//查空扇区
SelSector(START_SECTOR,END_SECTOR);
//选择扇区 将要保存的数据放在,第十扇区,
RamToFlash(START_ADDR,(uint32)p_Config_Init,BYTE_NUM_1);
SelSector(START_SECTOR,END_SECTOR);
//选择扇区 将要保存的数据放在,第十扇区,
RamToFlash(BAK_ONE_START_ADDR,(uint32)p_Config_Bak,BYTE_NUM_1);
前面定义一个数组并进行初始化没有什么实质意义,但是却能够使程序正常运行,我想应该是在 *** 作时RAM地址出现冲突,以至于使SelSector(START_SECTOR,END_SECTOR)会进入“取指令中断错误”。加上前面对数组定义可能会对RAM地址有所影响,从而使对IAP的 *** 作能够正常进行。
我所用的是LPC2214,可能和你的问题不太一样,试试吧!
isp是在系统编程技术,是指给单片机烧写程序不用吧芯片从电路板上拆下来,就能完成烧录程序。iap是在应用编程,是指单片机在上电工作过程中实现程序修改烧写,就好比手机不关机安装应用程序。eeprom是一种存储器技术,可以靠电擦除内容,并实现掉电后不丢失,而且可以按字节读写。isp,iap一般是对flash
rom读写,和eeprom技术类似,但只能批量擦写,不能单个字节写入。isp程序是单片机出厂前写在芯片里面特殊位置的,不能修改的。
ISP:在线编程,通过串口或JTAG接口,由电脑主导“下载”程序到单片机。
IAP:在应用编程,可以通过串口,也可以通过其他介质如优盘等,关键是由单片机主导写入程序。
ICP:在电路编程,一般借助编程器,在12V高压下将代码写入到单片机。电脑主导。
ISP是在系统编程,即可以在应用板或目标板上编程或更新,而过去的编程器编程,需先将单片机写好程序,再焊在电路板上,想修改程序,还要拿下来
IAP是应用过程中编程,更进了一步,可以在程序运行中更新程序并运行,能够实现远程更新,就好象我们的台式电脑, *** 作系统运行起来后,再安装应用程序并运行
IAP程序也是自己写的另一个工程,你按照普通APP那样下载仿真即可,只是需要连接通信口进行获取升级文件代码,需要上位机或手动发送。要是以文件的形势访问,则无需通信,只需要读取文件的相关代码和IAP代码即可。
以上就是关于有谁正确使用过STM32的USB IAP功能全部的内容,包括:有谁正确使用过STM32的USB IAP功能、stm32iap跳转后停留在boot、LPC1768进行IAP编程时,SelSector准备扇区时就死在那里了,请问该怎么解决等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)