历史上的今天
今天是:2025年08月20日(星期三)
2018年08月20日 | 嵌入式应用编程经验之谈-IAP(在线升级)
2018-08-20 来源:eefocus
开发环境:Keil4
固件库开发
目标芯片:STM32F107VC
前言:
这里公司项目要求需要写一个带有网口bootlood根据新项目的硬件,也就是IAP(In Application Programming).这样我们在实际项目中当我们需要更新硬件代码的时候就不需要把设备拆卸下来,只需要对着预留的网络接口配合上位机下载就可以了。这里当我遇到问题也看了很多网上网友写的帖子,让我受益匪浅。本人也始终相信分享是大家共同进步的强大动力。下面我会写出我在项目中遇到的问题,以及最终解决问题的办法。当你看到这篇帖子哪怕对你有一点点帮助也将是我继续分享下去的强大推动力。当然自己的知识水平也有限如果文中有哪些不对的地方,还望各位网友给予指正,感谢。
问题:
关于IAP具体实现这里在网上我们也能看到很多的帖子,当然官方也有范例这里我就不累述。这里切入重点,这里我发现自己的IAP可以成功的配合上位机实现代码的下载,但是通过打印调试发现代码进入到实际的应用层代码便出现重启又回到了bootlood开始的代码段。下面直接给出我们在做IAP的时候需要注意的点,这也是我自己的实际调试经验。
经验分享:
1.准确的内存分配(确保IAP)的代码段不会溢出到我们实际应用的代码段,以及正确的软件配置。
这里IAP代码段在0x8000000~0x8010000(根据自己实际IAP代码量来分配)
应用层代码Keil设置
代码中的实现设置
NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x10000); (这里是应用层的实现配置 )
2.lAP看门狗
这里我们必须要注意的是我们在IAP代码中配置了看门狗,要么在关闭他,要么在应用代码工程中记得喂狗,不然到应用层代码段中会因为看门狗而且不断重启。
3.注意IAP代码段中的那些中断函数
这里我相信对于初次搞IAP的朋友不熟悉整个跳转和代码启动的过程最容易犯下的错误。这里我在调试过程中遇到的问题就在看门狗和IAP代码段的中断函数上。这里我们必须要有一个概念,虽然我们这里是两个工程代码,但是都是在同一块主控上运行,两者之间的关系不是分离的而是紧密相连的。这里简述一下我们在实现IAP代码跳转实现的流程,这里关于具体的实现细节我也在不断的学习。我们的工程代码是从main函数开始运行的,但是代码能成功跑到这里是靠启动文件(汇编)实现的跳转,其实在进入主函数之前已经完成了很多前期的主控制器的初始化,这里当然也包括时钟的初始化(默认下的情况)。这里当代码跳转到应用层代码的时候,代码层的最开始的四个字节分别是系统的复位向量接下来就是一些中断向量表的读取。这里我们在里面IAP实现代码中也可以当判断有误应用层代码是否需要跳转的判断就是靠这几个字节,在当我们跑完IAP代码的时候我们设置的一些中断向量表当我们跑到应用层代码的时候这些向量表依然保存着,如果这个时候我们应用层的代码没有这些中断向量表的函数,代码便找不到这个中断向量的地址而导致代码无法正常运行。
这里总结两点:
@1:当你在IAP中开启的中断函数,在进入应用层代码前关掉这些中断
@2:当你没有关闭IAP代码工程中的中断函数,在应用层代码也写出这些函数的中断函数。
if(((*(__IO uint32_t*)ApplicationAddress) & 0x2FFE0000 ) == 0x20000000) //判断应用层有无成功更新代码
{
SysTick->CTRL &= ~(1< TIM_ITConfig(TIM2,TIM_IT_Update,DISABLE); //关闭定时器2的中断 IWDG_ReloadCounter(); //喂狗 JumpAddress = *(__IO uint32_t*) (ApplicationAddress + 4); //实际应用代码段的后4个字节 Jump_To_Application = (pFunction) JumpAddress; __set_MSP(*(__IO uint32_t*) ApplicationAddress); Jump_To_Application(); } 这里看到一篇关于IAP从原理到实现非常好的帖子,大家在代码跳转的逻辑上可以看这篇帖子,写的非常的好!也非常感谢这位朋友的分享!下年给出链接: http://www.openedv.com/thread-11494-1-1.html
下一篇:msp430 看门狗设置
史海拾趣
|
摘要:对电动汽车车载电池的充电器进行了讨论。根据SAEJ?1773对感应耦合器设计标准的规定,及不同的充电模式,给出了多种备选设计方案,并针对不同的充电模式、充电等级,给出了最适合的电路拓扑方案。 关键词:电动汽车;充电 ...… 查看全部问答> |
|
想请教一下,2407是不是没有CPU Timer? 2812已经有了通用计数器GP,为什么还需要CPU Timer? 2812的Timer主要是做什么用的呢? 是不是PSC减至0后,TIM才会减1 ? 如果没有用DSP-BIOS,2812的CPU-Timer2是否就能自行使用? 新手接触,问题太 ...… 查看全部问答> |
|
比如 PA6--CH1/IN6 PA7 --CH2/IN7 现在我要捕获pwm的占空比 也就是要用到pwm模式 用到了两个输入口i 不过按照st的资料 ch2是内部连接的 那么 我还能PA7做模拟输入 ...… 查看全部问答> |
|
--基于AD56XX的VHDL控制程序--设计者 eeleaderlibrary ieee;use ieee.std_logic_1164.all; use ieee.std_logic_arith.all;use ieee.std_logic_unsigned.all;entity Wr_Ad56XX is port ( clk: in std_logic;------20M ...… 查看全部问答> |
|
现在很多设备仪器都在用可充电锂电池组(锂电池组加装有电池保护板),为了防水的原因,电池组的封装固定后,电池组做防水处理一般用胶水固定,问题是:有的设备和仪器使用几个月后出现不能充电了,什么原因?当然电池供 ...… 查看全部问答> |
|
我做了个激光器功率的PID电路,周围有人走动就会有影响,没人的时候没有变化。因为是光纤激光器,光路也没有空间部分不会因为震动影响光路部分,那这个飘动就是电路部分了,但是在不理解怎么会有这么大的影响,人一走动就变化,快成生命探测器了。 ...… 查看全部问答> |
|
最近在富士通半导体微博上看到一则消息:“富士通发布基于Cortex M0+的FM0+系列MCU,与以前的Cortex-M0内核相比,Cortex-M0+内核的处理性能提高了10%,而功耗只有2/3。 FM0+系列的目标是保持70μA/MHz的工作电流和0.7μA的待机电流(RTC模式)将 ...… 查看全部问答> |
|
最近在调V7 485t的DDR3,用的ISE14.4,MIG1.8 ,生成的IP核无论仿真还是板测,其中的app_rdy这个信号始终为低电平,数据手册说原因有两个,一是正在读或者写,二是phy还没有复位好。上电复位后app_rdy信号应该为高的,但是从来都是低电平。 … 查看全部问答> |




