【IAP】IAP在线升级流程

IAP,全称是“In-Application-Programming”,中文解释为“在程序中编程”。不同于ISP通过设置MCU内部的BootLoader程序引导烧写或者是ICP通过SWD、JTAG在线仿真烧写。IAP是一种对通过微控制器的对外接口如:USART,IIC,CAN,USB,以太网接口甚至是无线射频通道等对正在运行程序的微控制器进行内部程序的更新的技术

如何实现?

1、实现IAP技术的核心是一段预先烧写在单片机内部的IAP程序。这段程序主要负责与外部的上位机软件进行握手同步,然后将通过外设通信接口将来自于上位机软件的程序数据接收后写入单片机内部指定的闪存区域,然后再跳转执行新写入的程序,最终就达到了程序更新的目的。

2、在STM32微控制器上实现IAP程序之前首先了解STM32的内部闪存组织架构和其启动过程。关于启动过程:

【FreeRTOS】读书笔记,嵌入式微操作系统

3、STM32的内部闪存地址起始于0x8000000,一般情况下,程序文件就从此地址开始写入。程序启动后,将首先从“中断向量表”(“中断向量表”来响应中断)取出复位中断向量执行复位中断程序完成启动。“中断向量表”的起始地址是0x8000004,当中断来临,STM32的内部硬件机制亦会自动将PC指针定位到“中断向量表”处,并根据中断源取出对应的中断向量执行中断服务程序。最后还需要知道关键的一点,通过修改STM32工程的链接脚本可以修改程序文件写入闪存的起始地址

 

 

 

 

①、 STM32复位后,从地址为0x8000004处取出复位中断向量的地址,并跳转执行复位中断服务程序,随后跳转至IAP程序的main函数。

 

 

 

 

②、 执行完IAP过程后(STM32内部多出了新写入的程序,地址0x8000004+N+M)跳转至新写入程序的复位向量表,取出新程序的复位中断向量的地址,并跳转执行新程序的复位中断服务程序,随后跳转至新程序的main函数,注意在STM32的内部存储空间在不同的位置上出现了2个中断向量表。

③、 在新程序main函数执行的过程中,一个中断请求来临,PC指针仍会回转至地址为0x8000004中断向量表处,由于中断向量表地址强制偏移而跳转新程序的中断向量表。⑤⑥⑦过程(内部存在两个中断向量表)

④、 根据中断源跳转至对应的中断服务,注意此时是跳转至了新程序的中断服务程序中。

⑤、 中断服务执行完毕后,返回main函数。

 

void NVIC_SetVectorTable(u32 NVIC_VectTab, u32 Offset);

参数NVIC_VectTab为中断向量表起始位置,而参数Offset则为地址偏移量,如将中断向量表移至0x8002000处,则应调用该函数如下:(这个地方应该是固件库里面的,HAL库应该没有)

void NVIC_SetVectorTable(0x8000000, 0x2000);

注意:函数只会修改STM32程序中用于存储中断向量的结构体变量,而不会实质地改变中断向量表在闪存中的物理位置。

设计IAP方案:

1、STM32复位后,利用一个按键的状态进行同步,当按键按下时表示将要进行IAP过程。

2、IAP过程中,通过上位机软件向STM32的USART设备发送所要更新的程序文件,(程序在flash存储中起始地址由自己在BootLoader中设定好,每次复位检测是否有新程序)

3、STM32借助定时器来判断数据是否完全接收,完全接收后IAP过程结束。

4、再次复位后,跳转0x8000004+N+M地址开始运行新写入的程序。

注意事项:

  • 利用IAP写入的程序文件最好是.bin格式的文件。
  • 向STM32发送程序文件时尽量慢一些,因为STM32对FLASH的写入速度往往跟不上通讯外设接口的速度。
  • 防错机制。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值