STM32的IAP功能应用

背景

在做的那个路灯项目,协议里面有个在线远程升级功能,而且由于交付工期态赶,我们并不能在工期前完全实现好全部协议内容,只能有针对性地去实现几个功能,然后剩下功能区远程升级,这个远程是通过onenet按照一定帧格式来下发bin文件来做到的。

IAP简介

IAP :在编编程的简介,用户自己的程序在运行过程中对User Flash的部分区域进行烧写,目的是为了在产品发布后可以方便地通过预留的通信口对产品中的固件程序进行更新升级。
明白IAP原理必须先了解STM32的启动过程,在我们一般应用开发过程中,都是从main函数开始。那么在单片机开机执行的第一条代码真的是从main函数开始的吗?其实不是,可以想一下,C语言的执行是需要堆栈环境的,在我们的main函数中我们并没有手动建立堆栈环境,所以在main函数之前一定是有一段代码帮我们建立了堆栈环境,其实这段代码不仅仅帮我们建立了堆栈环境,还做了很多其他的事情,这段代码就是:

Reset_Handler  	PROC
		                EXPORT  Reset_Handler             [WEAK]
		                IMPORT  __main
		                IMPORT  SystemInit
		                LDR     R0, =SystemInit		;跳转到SystemInit	函数中
		                BLX     R0               
		                LDR     R0, =__main		;跳转到__main函数中,这是MDK内置的一个函数,这个函数中会跳到main函数中
		                BX      R0
		                ENDP

在stm32上电一瞬间,系统从Reset_Handler向量表来取指,然后进入SystemInit执行,再到__main函数,最后到main函数,大工告成。
在这个过程中有个至关重要的过程发生在SystemInit中了,就是中断向量表的建立…为什么说他重要?下面再讲

SCB->VTOR = FLASH_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal FLASH */

正常的MCU程序在此就可以正常运行了。但是IAP通常将代码分为两个区域bootloader和app部分,IAP程序在这里开始与正常程序不一样了。

我的两部分代码功能部分大概是

bootloader:引导、在需要升级程序的时候进行升级、跳转到app程序
app:执行业务代码、在接收到升级BIN文件时,将其找到合适位置进行保存,然后软件复位

在IAP程序中我们一般会配置一个eeprom,在eeprom某个位置存放Update_flag,如果Update_flag显示不需要升级就直接跳过升级,运行到app首地址,app首地址存放的是堆栈指针,首地址+4是app的Reset_Handler函数,然后直接运行app的SystemInit,重新建立向量表映射,然后运行app的main函数,大功告成。
其实 建设向量表映射操作就是 填充向量表偏移寄存器,不论在任何代码中,STM32的中断向量表的相对位置是固定的,第一个存放的是堆栈指针,第二个是复位地址。。但是第一个向量的绝对地址是可以改变的,就是向量表的绝对地址可以变,相对于起始地址向量表地址是不变的。在IAP代码中如果发生中断,首先会取出向量表偏移地址(SCB->VTOR ),然后根据中断号来计算得到中断服务例程的入口,进一步跳转,之前没有强调是因为没有重定位向量表的时候,向量表偏移地址都是零。
在很多其他介绍IAP的博客中关于这部分介绍都有误,看下图
在这里插入图片描述
这个中断请求步骤5和步骤6都是不对的…,这个问题仔细想了一下,最后在Cortex M3权威指南中找到了答案,看图

在这里插入图片描述

下面贴一张实际工作流程图
在这里插入图片描述

过段时间来贴代码,其实也可以用flash来模拟eeprom,只要不冲突就ok,还有防止误操作应该还要校验版本号,发布者密钥之后才能真正的去擦除flash升级固件(防止误操作),需要自己手动修改BIN文件等。

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值