公司要求增加USB在线升级的功能。起初都很顺利,USB连接,程序下载都没有问题。最后的最后却出现了一个令人抓狂的问题:单独用KEIL下载IAP和APP都可以正常工作。拔掉调试线。反复上电,不管是进入IAP(按键进入)和APP,都正常。但是用DfuSe demo这个工具下载就无法正常进入APP。调试看,情况是在跳转APP-MAIN的时候取到了一个错误的地址。程序跑到FLASH异常中断的while(1)里去了。
实在没办法,我不使用自己的APP。试着调试KEIL提供的例子,情况一样。
程序的模板我用的是KEIL里自带的ST文件夹下的升级例子。查了很多网上的资料,也都是按照这个例子为模板修改的。
我改动了以下内容:
1.进入IAP按键的IO口,改成了我自己的。
2.USB D+上拉引脚,改成了我自己的。
3.IAP和APP工程的
芯片型号 从
STM32f103ZE 改成了 stm32f103RB.
4. 因为容量不一样 改了一下ROM区。IAP-0x8000000 SIZE 0x3000 APP-0x8003000 SIZE 0x1D00。
5.APP里的中断向量首地址,原本例子就是写好的,偏移IAP的SIZE。
(APP也是例子里提供的,很简单 就是让一个LED闪烁)
然后就是正常的进入连接USB->转文件格式->下载并更新。不知道我这个改法哪里出了问题,或者是有什么需要注意的地方我没有注意到,一直是上面所说的问题。但是,我用KEIL单独下载都是正常的啊。求各位大神不吝赐教。
因为小公司就我一个做设计的,公司也不给配网络,这不是我工作的电脑,所以没办法上图。本来应该上图的,实在抱歉。如果有人遇到过类似的问题或者知道问题的原因,请留言,我用U盘COPY切图过来。
希望大家帮帮忙,老板的眼神已经很怪异了。
DFU_Button_Config(); //初始化跳转APP程序按键
//检测是否进入DFU模式按键,开机没有按下则跳转到APP程序中执行
if(DFU_Button_Read() == 0)
{
if(((*(__IO uint32_t*)ApplicationAddress) & 0x2FFE0000 ) == 0x20000000)
{
//跳转到APP地址开始执行,地址+4位置是复位中断入口
JumpAddress = *(__IO uint32_t*) (ApplicationAddress + 4);
Jump_To_Application = (pFunction) JumpAddress;
//设置APP程序堆栈指针
__set_MSP(*(__IO uint32_t*) ApplicationAddress);
//跳转到APP程序中执行 ---- 到这一步都能进 ---- 再往下执行的时候就会读到一个错误的地 址然后跳转过去 酿成悲剧
Jump_To_Application();
}
}
一周热门 更多>