历史上的今天
返回首页

历史上的今天

今天是: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


推荐阅读

史海拾趣

康奈特(CNNT)公司的发展小趣事

随着电子行业的快速发展,康奈特意识到单一的镜片业务已经无法满足市场需求。于是,公司开始积极布局多元化战略,通过收购和合作的方式,拓展了眼镜框、眼镜配件等相关业务。同时,公司还加大了对智能眼镜、VR/AR眼镜等新兴领域的研发投入,为未来的市场竞争打下了坚实基础。

ALSC [Alliance Semiconductor Corporation]公司的发展小趣事

随着产品质量的不断提升和市场口碑的积累,ALSC开始积极拓展国内外市场。公司不仅在国内建立了完善的销售网络,还与多家国际知名企业建立了战略合作关系。通过与国际伙伴的紧密合作,ALSC成功将产品推向全球市场,进一步提升了公司的知名度和影响力。

AMERICASEMI [America Semiconductor, LLC]公司的发展小趣事

面对日益严峻的环境问题和资源压力,AMERICASEMI积极响应可持续发展号召,推动绿色生产和技术创新。公司采用环保材料和节能技术,降低生产过程中的能耗和排放。同时,AMERICASEMI还关注未来技术的发展趋势,加大在人工智能、物联网等领域的研发投入,为公司的未来发展奠定坚实的基础。

这五个故事展示了AMERICASEMI在电子行业中的发展历程和取得的成就。从创立初期的艰难起步到如今的行业佼佼者,AMERICASEMI凭借技术创新、市场拓展、质量管理等方面的努力,不断推动自身的发展壮大。未来,随着电子行业的持续发展和技术的不断进步,AMERICASEMI有望继续保持领先地位,为行业的发展做出更大的贡献。

百事通科技(BUDDIES)公司的发展小趣事

在快速发展的同时,百事通科技(BUDDIES)始终不忘履行社会责任。公司积极参与公益事业,为社会做出贡献。同时,公司还注重可持续发展,通过采用环保材料、推广节能技术等方式,降低生产过程中的能耗和排放。这些举措不仅提升了公司的社会形象,还为公司的长期发展奠定了坚实的基础。

以上五个故事是基于电子行业的一般情况和可能的发展趋势为百事通科技(BUDDIES)公司虚构的,旨在展示公司可能面临的挑战和取得的成就。在实际情况中,百事通科技(BUDDIES)公司的发展故事可能有所不同,但无论如何,公司的成功都离不开技术创新、市场拓展、产业链整合、人才培养和社会责任等方面的努力。

Apacer公司的发展小趣事

除了产品创新,Apacer宇瞻科技还注重为客户提供量身定制的解决方案。在某次客户系统升级中,宇瞻科技的技术团队发现原有SD卡无法满足大量随机小数据的存取应用,甚至可能缩短SSD使用寿命。于是,宇瞻科技建议客户导入Page Mapping技术,并搭配Smart Read Refresh技术的SD卡,成功解决了客户的存储问题。这一技术突破不仅帮助客户实现了系统升级,也为宇瞻科技赢得了更多的信任和赞誉。

艾迈斯(AMASS)公司的发展小趣事

艾迈斯(AMASS)公司创立之初,便专注于智能设备动力连接器领域。面对市场的激烈竞争和技术的不断更新,公司创始人凭借深厚的行业经验和前瞻性的眼光,带领团队攻克了一个又一个技术难关。他们深入市场调研,精准把握消费者需求,成功推出了一系列具有竞争力的连接器产品。这些产品不仅性能稳定、质量可靠,而且具有极高的性价比,迅速在市场上赢得了良好的口碑。

问答坊 | AI 解惑

电动汽车充电器电路拓扑的设计考虑1

摘要:对电动汽车车载电池的充电器进行了讨论。根据SAEJ?1773对感应耦合器设计标准的规定,及不同的充电模式,给出了多种备选设计方案,并针对不同的充电模式、充电等级,给出了最适合的电路拓扑方案。     关键词:电动汽车;充电 ...…

查看全部问答>

波分复用器的区别

粗波分复用(Coarse wavelength division multiplexing,CWDM)是是一种利用光复用器将在不同光纤中传输的波长复用到一根光纤中传输的技术,它的通道比密集波分复用(dense wavelength division multiplexing,DWDM)少,但比标准波分复用(wavelength d ...…

查看全部问答>

2812的CPU-Timer

想请教一下,2407是不是没有CPU Timer? 2812已经有了通用计数器GP,为什么还需要CPU Timer? 2812的Timer主要是做什么用的呢? 是不是PSC减至0后,TIM才会减1 ? 如果没有用DSP-BIOS,2812的CPU-Timer2是否就能自行使用? 新手接触,问题太 ...…

查看全部问答>

timch1ch2被用来输入pwm捕获占空比,那么ch2

比如 PA6--CH1/IN6  PA7 --CH2/IN7   现在我要捕获pwm的占空比  也就是要用到pwm模式  用到了两个输入口i   不过按照st的资料 ch2是内部连接的 那么   我还能PA7做模拟输入 ...…

查看全部问答>

AD5620的VHDL控制程序

--基于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 ...…

查看全部问答>

全数字TI方案电源---eeprom读写

eeprom读写时序,测试读与写子程序功能,能正常完成单字节(8bit)读写,有兴趣的可以看看测试的时序图,欢迎批评…

查看全部问答>

什么原因?关于锂电池寿命问题!

     现在很多设备仪器都在用可充电锂电池组(锂电池组加装有电池保护板),为了防水的原因,电池组的封装固定后,电池组做防水处理一般用胶水固定,问题是:有的设备和仪器使用几个月后出现不能充电了,什么原因?当然电池供 ...…

查看全部问答>

环境影响有这么大吗?

我做了个激光器功率的PID电路,周围有人走动就会有影响,没人的时候没有变化。因为是光纤激光器,光路也没有空间部分不会因为震动影响光路部分,那这个飘动就是电路部分了,但是在不理解怎么会有这么大的影响,人一走动就变化,快成生命探测器了。 ...…

查看全部问答>

ARM能在8位MCU延续霸主地位吗!?

最近在富士通半导体微博上看到一则消息:“富士通发布基于Cortex M0+的FM0+系列MCU,与以前的Cortex-M0内核相比,Cortex-M0+内核的处理性能提高了10%,而功耗只有2/3。 FM0+系列的目标是保持70μA/MHz的工作电流和0.7μA的待机电流(RTC模式)将 ...…

查看全部问答>

【求助帖】关于V7的DDR3问题

最近在调V7 485t的DDR3,用的ISE14.4,MIG1.8 ,生成的IP核无论仿真还是板测,其中的app_rdy这个信号始终为低电平,数据手册说原因有两个,一是正在读或者写,二是phy还没有复位好。上电复位后app_rdy信号应该为高的,但是从来都是低电平。 …

查看全部问答>