前言
IAP(In Application Programming)即在应用编程,IAP 是用户自己的程序在运行过程中对 User Flash 的部分区域进行烧写,目的是为了在产品发布后可以方便地通过预留的通信口对产 品中的固件程序进行更新升级。
设备具备IAP功能的情况下,一般闪存中存在2个程序,第一个程序称之为 Bootloader 程序,其主要作用是判断设备是否需要升级以及接收程序完成升级这两个功能;第二个功能称之为APP程序,就是设备正常运行时的程序。
对于Bootloader 程序,需要完成串口接收,内部Flash读写等代码的编写;对于APP程序,在编写设备正常运行的代码后,还要设置地址偏移以及生成bin文件。
本文适合有一定STM32基础的学者参考学习。
一.软硬件准备
软件:CubeMX、Xcom(串口调试助手)
硬件:SMT32F103C8T6系统板,2个LED,2个外部按键
需要注意:C8的容量为:ROM=64KB,RAM=20KB ,实际项目中应用IAP功能这个容量是偏小的,但作为简单了解学习还是够用的。
二.CubeMX配置
这里需要完成Bootloader和APP两个程序,因此需要创建2个工程,大致实现的是上电运行Bootloader程序,现象为蓝灯闪烁,同时等待串口接收bin文件,接收bin文件后,通过按键1将文件烧录至内部Flash,再通过按键2执行APP程序,此时变为蓝绿灯闪烁。
CubeMX配置大致如下:
- 对于Bootloader:配置串口及打开串口接收中断,配置2个LED引脚(上拉输出),配置2个外部按键引脚(上拉输入模式)
- 对于APP:配置2个LED引脚(上拉输出模式)
三、程序配置
1. Bootloader程序
Bootloader程序较多,在此不方便贴出来,源码下载链接:点击跳转
这里主要讲一下要注意的点:
- 对于串口部分,printf打印配置可参考:使用串口打印的3种方式
- usart.c中缓存数组的大小设置,即
这里设置的是10K的大小,就是APP生成的bin文件不能大于10KB,不然接收会溢出。这里的 最大值可以先把缓存数组大小设为1,再通过芯片RAM容量减去RO-data,ZI-data的大小就能大致 判断出来,
比如我现在的变量大概占5K大小,C8的RAM容量20K,所以这个缓冲数组我最大可以设置为1024*15,超了编译会报错。
- iap.h头文件中需要注意
这里的偏移地址要和APP的偏移地址一致(后面会讲),因为APP的地址不再是默认的0x08000000
- stmflash.h头文件中1需注意
这里是芯片ROM大小,不同芯片数值大小不同。
2.APP程序
APP程序主要在Keil中会设置偏移地址和生成bin文件即可。
1.对于地址的偏移,操作如下:
C8T6的ROM大小为64KB,即10000H,这里我留前面32KB给Bootloader程序,所以APP起始地址变为0X8008000,剩下ROM大小为64-32=32KB,所以Size为0X8000。
2.生成bin文件,可参考:关于KEil5 / MDK5如何设置编译产生bin文件
3.中断向量表偏移,在APP程序初始化时(while循环前)执行如下语句:
SCB->VTOR=FLASH_BASE|0X8000;
这里的0x8000指的是APP程序的起始地址,因为前面32KB(=0X8000)给了Bootloader程序,所以这里可以理解为往后移0x8000。
4.编写APP程序,我做的功能就是2个LED灯闪烁。编译后检查APP程序的bin大小,不能超过Bootloader程序可接收的最大值,大小可以在生成的bin文件属性查看。
四、程序验证
1.板子上单执行Bootloader程序(蓝灯闪烁,绿灯熄灭,转GIF画质拉胯了)
2.串口助手发送bin文件
3.按下按键1将bin文件烧录至内部Flash区域
4.按下按键2跳转至APP程序
5.APP程序执行效果(蓝、绿灯闪烁,转GIF画质拉胯了)
其它F1芯片移植可直接套用模板,F4系列的需要修改内部flash读写程序,可直接从原子哥的例程Copy过来。