STM32在应用编程(IAP)详解

什么是IAP?

STM32单片机的程序烧写有多种方法,分别为:JTAG/SW、ISP、IAP

    >  JTAG的方式需要专用的烧写工具,在产品布置到现场后,更新产品程序比较麻烦。

    >  ISP即为“在系统编程(In System Programming, ISP)”,通过ISP软件调用USART、USB、CAN等外设向内部Flash烧写新程序。该方式可以直接使用常见的串口线升级程序,十分方便,可以说是单片机默认的bootloader。

正常情况下,单片机系统启动后,会直接从用户程序执行;而进行系统升级时,单片机会进入bootloader,并在ISP中一直运行。

ISP虽然方便了升级,但是还是没法解决用户自定义和远程升级的问题。对于用户来说,有时候可能需要在单片机Flash的不同地址烧写多个应用程序,并根据不同条件启动不同应用程序;有时候,产品分布到全国各地,去所有现场升级程序明显不理智,解决方法是将升级程序放到服务器上,发送远程升级指令,设备进入IAP升级程序,从远程获取升级应用程序,实现在线升级。

    >  IAP即为“在应用编程(In Application Programming, IAP)”,可以通过任何通讯方式(USART、USB、CAN、SPI、Ethernet、WIFI等)向挂载在STM32上的存储器(内/外Flash、外部EEPROM、内/外RAM等)“有条件地”进行程序烧写(升级),简单的说就像是一个用户自定义的升级程序。


IAP的实现

1. 硬件

STM32单片机的启动方式有三种:

                            

单片机根据Boot0和Boot1的引脚来确定启动方式。主Flash即为用户程序空间,IAP启动将会从这里开始,系统存储器是ISP启动,内置SRAM不讨论。

正常情况下,Boot0管脚接入低电平,单片机从应用程序开始执行;当使用ISP升级时,Boot0为1,Boot1为0,系统进入ISP程序,等待串口升级,升级完成后,需要断电,改变Boot电平,重新启动,让单片机从应用程序执行(所以ISP升级时,还需要关注有关boot脚的电平开关问题)。

而IAP升级不需要改变任何管脚电平,因为它实际上就是一个应用程序,只是让单片机启动时先执行它,执行完后,跳转到真正的应用程序执行。

注意:单片机第一次烧写时,是需要通过JTAG或ISP烧写IAP的,如果打算用ISP,那最好留一个boot脚的硬件拨码开关用于首次ISP升级hex文件。

补充知识:—— 地址0x0000 0000的“Flash/系统存储器/SRAM别名区”的功能

在STM32F429存储器地址映射空间的地址0x0000 0000处的“Flash/系统存储器/SRAM别名区”是用来实现物理重映射的。这么做的原因在于:

Cortex-M4处理器复位时默认访问(PC指向)的地址是0x0000 0000,而在STM32F4xx系列中ST公司又将其内部Flash设计在了0x0800 0000的位置,那么在系统复位后,就必须通过物理重映射技术将地址0x0800 0000映射到地址0x0000 0000上。这样CPU在访问0x0000 0000时就等同于在访问0x0800 0000上的Flash(的内容),如此一来CPU才有指令可以执行,系统才能正常启动。

若通过BOOT引脚设置自举模式为SRAM自举或系统存储器自举,也同理,实际上就是将SRAM或系统存储器的首地址映射到了0x0000 0000的位置。

                      

2. 软件

弄清楚硬件之后,就知道什么样的硬件Boot对应什么样的启动方式。

加入IAP之后,系统启动时会先执行IAP程序用于判断是否达到升级条件(如:升级操作按钮是否被按下?)和执行什么样的升级配置,相应的逻辑类似于下图:

                              

用户可以根据自己的需求来设计IAP程序,详细设计可以参考ST官方资料:《使用STM32F10xxx的USART 实现在应用中编程》

最后,提醒注意一点的是,IAP程序和APP程序都分别有各自的“中断向量表”和一系列中断服务例程。

                                                

因此在IAP程序后面的APP程序都要在运行之前重新定义其“中断向量表”的位置,既将该表偏移到APP程序的地址空间内。这个过程是通过调用库函数或者直接给System Control Block中的向量表偏移量寄存器 VTOR(0xE000ED08)赋值来实现的。

                                  

                    
在APP正常执行过程中,系统产生中断后,Cortex-M4内核通过这个寄存器的值来找到“中断向量表”的地址,进而跳转并执行中断例程,M3/M4的这个VTOR寄存器一开始时它的值也是为默认值0。

  • 3
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值