历史上的今天
返回首页

历史上的今天

今天是:2025年08月05日(星期二)

正在发生

2019年08月05日 | STM32+IAP方案 实现网络升级应用固件

2019-08-05 来源:eefocus

概况:

什么是IAP,为什么要IAP

可实现的原理

实现过程

细节及实现 

以上基本都可以从【IAR环境下STM32+IAP方案的实现】中找到答案。这里只是贴图,醒目: 

IAP框架布局: 

 这里写图片描述 

STM32F103ZET6的启动方式有三种:内置FLASH启动、内置SRAM启动、系统存储器ROM启动,通过BOOT0和BOOT1引脚的设置可以选择从哪中方式启动,这里选择内置的FLASH启动。其FLASH的地址为0x08000000—0x0807ffff,共512KB,这些都能从芯片数据手册中直接得到。而这里首要的一个问题是中断的问题。正常情况下发生中断的过程为:发生中断(中断请求),到中断向量表查找中断函数入口地址,跳转到中断函数,执行中断函数,中断返回。也就是说在STM32的内置的Flash中有一个中断向量表来存放各个中断服务函数的入口地址,内置Flash的分配情况大致如下图2-1。 

 

 这里写图片描述 
这里写图片描述 
这里写图片描述 
这里写图片描述 

在内置的Flash里面添加一个BootLoader程序,BootLoader程序和user application各有一个中断向量表,假设BootLoader程序占用的空间为N+M字节,则程序的走向应该如图2-2所示(借用网友的原图并做改动,其中虚线部分为原图步骤④⑤的走向,本人改为指向灰色部分)。 

 这里写图片描述 

上电初始程序依然从0x08000004处取出复位中断向量地址,执行复位中断函数后跳转到IAP的main(标号①所示),在IAP的main函数执行完成后强制跳转到0x08000004+N+M处(标号②所示),最后跳转到新的main函数中来(标号③所示),当发生中断请求后,程序跳转到新的中断向量表中取出新的中断函数入口地址,再跳转到新的中断服务函数中执行(标号④⑤所示),执行完中断函数后再返回到main函数中来(标号⑥所示)。 

对于步骤④⑤,网友认为是:“在main执行的过程中,如果CPU得到一个中断请求,PC指针仍强制跳转到地址0x08000004中断向量表处,而不是新的中断向量表,如图标号④所示,程序再根据我们设置的中断向量表偏移量,跳转到对应中断源新的中断服务程序中,如图标号⑤所示”。我对此的理解是:“当发生中断后,程序从0x08000004(旧)处的中断向量表中得到相应的中断服务函数入口地址,继而跳转到相应的中断服务程序”。但是旧的中断向量列表里边存放的是IAP程序中断函数的入口地址,它是如何得到user程序中断函数的入口地址呢?所以我觉得此种说法是错误的。“当发生中断时PC指针强制会跳转到0x08000004处”这种说法并没有错,只是忽略了后续的一些知识要点而导致这个说法出现矛盾。 


对于步骤④⑤我认为的是,在main函数的执行过程中,如果CPU得到一个中断请求,PC指针本来应该跳转到0x08000004处的中断向量表,由于我们设置了中断向量表偏移量为N+M,因此PC指针被强制跳转到0x08000004+N+M处的中断向量表中得到相应的中断函数地址(待求证),再跳转到相应新的中断服务函数,执行结束后返回到main函数中来。


IAP流程描述:

1、IAP的bootloader引导程序

IAP在应用中编程,可以拓展成远程网络更新应用固件。 

片内的flash,至少划分成2个分区,对应至少两个完整的程序; 

低地址分区端推荐放入IAP程序==bootloader引导程序(这里边的手段可以是串口、网络等不同的方式),高地址分区端推荐烧写app固件。 


关键点提及: 

IAP程序中,当满足跳转条件(被触发)时,执行跳转代码到app应用固件程序,跳转代码流程: 

至少需要设定跳转目的地的app应用固件 栈顶指针,:


/* Initialize user application's Stack Pointer */

__set_MSP(*(__IO uint32_t*) USER_FLASH_FIRST_PAGE_ADDRESS);


其中,app应用固件的分区地址:


#define USER_FLASH_FIRST_PAGE_ADDRESS 0x08009000


2、app应用固件

需要两处的更改,不然错误未知 

IROM设置如图: 

 这里写图片描述 

中断向量表偏移:  


NVIC_SetVectorTable(NVIC_VectTab_FLASH,VectorTable_Offset);


其中:


#define NVIC_VectTab_FLASH           ((uint32_t)0x08000000)

#define VectorTable_Offset  0x9000 


查错:

如果做了上边的工作,IAP依然无法顺利执行跳转至app应用程序,可以查看.map和.bin文件,确定是否如实的改变的中断向量表的偏移和栈顶指针,如图: 

 这里写图片描述 

.bin文件: 

 这里写图片描述 

可以看到,主栈顶MSP地址=0x2000C8C8、reset_handler地址=0x08009189 

如此,才能生效,否则,可能原因: 

修改后的向量表偏移,在之后的程序中,又再次被还原,通过如下的函数:


void NVIC_SetVectorTable(uint32_t NVIC_VectTab, uint32_t Offset);

void SystemInit (void);

SCB->VTOR = FLASH_BASE | VECT_TAB_OFFSET;


附:

1、如需要.hex文件转.bin,参见上边的文章 

当然,就算使用.hex文件,同样可以升级,只是需要修改IAP中判定已经升级的文件是否有效,文件条件部分的代码,


if(((*(__IO uint32_t*)USER_FLASH_FIRST_PAGE_ADDRESS) & 0x2FFE0000 ) == 0x20000000)

1

2、地址偏移后的app应用程序,是否能够独立的运行? 

不能,理由: 

 这里写图片描述 

可知,开机上电并不能够找到我们指定的偏移后的向量表。

推荐阅读

史海拾趣

Centellax Inc公司的发展小趣事

Centellax Inc公司自成立以来,一直致力于电子通信技术的研发与创新。在成立初期,公司凭借其独特的测试测量技术,在光通信行业中崭露头角。随着技术的不断迭代和市场的扩大,Centellax逐渐积累了大量的专利和知识产权,为公司的长期发展奠定了坚实的基础。

在技术创新方面,Centellax不断投入研发资源,推出了一系列高性能的测试测量设备。这些设备不仅满足了客户对高速器件深入分析的需求,还提升了公司在行业内的竞争力。同时,Centellax还积极与高校、研究机构等合作,共同推动电子通信技术的进步。

Hama公司的发展小趣事

随着技术的不断成熟,H&D Wireless开始积极拓展市场。公司凭借其创新的物联网技术和解决方案,成功吸引了多个行业巨头的关注。2017年,H&D Wireless与全球知名汽车制造商Scania签署了为期12个月的物联网服务协议,为其Smart Factory提供Raven IoT Sensor Box827解决方案。这一合作不仅提升了Scania工厂的生产效率,还进一步验证了H&D Wireless在物联网领域的实力。

Excelsys公司的发展小趣事

品质是Excelsys公司的生命线。公司始终坚持严格的品质控制标准,从原材料采购到生产制造的每一个环节,都经过严格的质量检测。这种对品质的执着追求,让Excelsys的产品在市场上赢得了良好的口碑。同时,公司还建立了完善的售后服务体系,为客户提供及时、专业的技术支持,进一步提升了品牌的信誉度。

First Silicon Co., Ltd公司的发展小趣事

在电子行业快速发展的同时,环保问题也日益受到关注。First Silicon公司积极响应国家环保政策,将环保理念融入企业发展战略之中。公司投入巨资研发环保型半导体材料和生产工艺,努力减少生产过程中的污染排放和资源浪费。同时,公司还积极推广绿色电子产品,引导消费者树立环保意识。通过这一系列的环保举措,First Silicon不仅赢得了社会各界的广泛赞誉,还为其可持续发展奠定了坚实基础。

Densitron公司的发展小趣事

在电子行业的激烈竞争中,Densitron公司始终坚持技术创新作为发展的核心动力。早期,公司投入大量研发资源,成功开发出一种新型的铟锡氧化物(ITO)材料,这种材料在触摸屏领域具有出色的性能,使得公司的产品在市场上脱颖而出。随着技术的不断升级,Densitron公司又相继推出了一系列创新产品,不仅满足了客户日益增长的需求,也推动了整个行业的进步。

BNS Solutions公司的发展小趣事

随着电子行业的不断发展,新技术和新应用层出不穷。BNS Solutions公司紧跟时代步伐,不断加大研发投入,推动技术创新。公司团队不断探索新技术、新材料的应用,开发出了一系列具有创新性和前瞻性的电子产品。这些产品不仅提高了行业的整体技术水平,还引领了行业变革的潮流。通过持续创新,BNS Solutions公司在电子行业中保持了领先地位,成为了行业的佼佼者。

问答坊 | AI 解惑

可靠性设计-车载电子十分需要

现在看设计的产品,无论是手机还是车载DVD还有导航等。都是注重了产品设计。强调了外观、功能、接口等。这样的产品设计是电脑、手机等消费电子的设计观念。用在车载产品上是不合适的。一个车的使用平均无故障时间是2年左右。现在用设计手机的概念去 ...…

查看全部问答>

[FPGA]Verilog三段式状态机描述

时序电路的状态是一个状态变量集合,这些状态变量在任意时刻的值都包含了为确定电路的未来行为而必需考虑的所有历史信息。 状态机采用VerilogHDL语言编码,建议分为三个always段完成。 三段式建模描述FSM的状态机输出时,只需指定case敏感表为次 ...…

查看全部问答>

请教WINCE下USB AUDIO设备驱动问题

在WINCE6.0上做一个基于PCM2704芯片的USB AUDIO设备驱动。这是一个USB混合设备,有Audio Class 和HID Class两种接口。此设备有三个Interface,分别是Audio Control,Audio Stream,HID Interface。三个EndPoint,分别是Default EP0,Audio Stream Int ...…

查看全部问答>

IAR环境下,如果要往RF-CC2430下载协议栈,要怎样设置?

总是下载不成功,不知道option里的参数该怎样设置?求大牛指教,不胜感激!…

查看全部问答>

知名外资通讯企业招聘软件开发工程师,协议工程师,算法分析和实现工程师及算法分析系统仿真工程师!!!

无线产品软件开发工程师 职责描述: 负责无线产品软件模块的设计、编码、调试、单元测试等工作,参与相关质量活动,确保设计及实现工作按时保质完成。 职位要求: 1. 本科以上学历,计算机软件、通信、电子、数学、物理及相关专业,有扎实的 ...…

查看全部问答>

急求一个可用的DXP2004

小弟在网上下了好多DXP2004都有些问题,这两天搞得焦头烂额的,希望那位有的能传给我,不胜感激! wanglei198661@163.com  有sp3的最好,sp2的也行 可以用的话给100分!!!…

查看全部问答>

WCE基本问题!急!!!!!

我最近期购买了一套ARM开发板子,后来发现我的笔记本上没有串口,请问下用USB转串口线能现实学习板的下载,调试等功能吗,急!…

查看全部问答>

用什么代码能开启pda的无线功能?

用什么代码能开启pda的无线功能? wince高手们,小弟现在用的是华硕的626的一款pda,操作系统是windows   mobile6.0,支持无线Wi-Fi; 小弟现有一个问题,我在程序中用什么函数能够自动启用无线功能?…

查看全部问答>

关于单片机控制GSM模块的问题

刚刚接触GSM模块,在写程序。对于GSM模块的功能不太了解。 1、收到手机短信了,模块读取短信的过程,是收到新短信之后给单片机一个信号,然后单片机发一个读的AT指令进行读取吗? 2、单片机第一次向模块指令,直接发“AT+XXXX”就可以了吗? 3、 ...…

查看全部问答>

TI 芯片TPS92310非隔离拓扑--LED驱动电路图

TPS92310:TI大功率LED驱动器,下图是一个LED非隔离拓扑电路图 德州仪器 (TI) 宣布针对其非调光 LED 驱动器产品系列推出一款最新离线式初级侧感应控制器。最新支持功率因数校正 (PFC) 的 TPS92310 AC/DC 恒流驱动器TPS92310 是支持 PFC 的初级侧稳 ...…

查看全部问答>