STM32F103-IAP设计与应用

大部分MCU系统会具备下面三种编程方式:

  • IAP(In Application Programming)在应用编程
  • ISP(In System Programing)在系统编程
  • ICP(In Circuit Programing)在电路编程

IAP是用户自己的程序在运行过程中对User Flash的部分区域进行重新烧写,产品发布后可以方便地通过预留的通信端口对产品中的固件程序进行更新升级。实现IAP有两个很重要的前提:

  • 单片机程序能对自身内部User Flash进行擦写
  • 单片机要有能够与外部进行通讯,如使用USART、IIC、SPI等

在实现IAP功能时,通常要设计两个程序:IAP程序、APP(应用)程序。IAP程序的功能就是作为Bootloader的角色,通过某种通讯协议(如USART)来接收APP程序并将其烧录到指定的User Flash中(注:IAP与APP程序在同一个FLASH中的不同地址上),然后跳转到APP中执行程序。ST官方提供STM32F10x的IAP相关资料,这里针对官方的STM32F10x的IAP资料进行应用,内容分为以下部分:

  • STM32程序运行过程分析
  • STM32F10x IAP例程介绍
  • STM32F10x IAP例程测试

STM32程序运行过程分析

想要设计STM32的IAP程序,必须先了解STM32的运行过程,下面以STM32F103的MCU为例介绍它的正常启动运行流程与加入IAP后的程序运行流程。

STM32正常启动流程

  1. STM32上电后会从0x08000004处出去复位中断向量的地址,并跳转执行复位中断服务程序,如
  2. 复位中断程序执行完后就会跳转到main函数中,如
  3. main函数一般为死循环,当收到中断请求后STM32会强制把PC指向中断向量表,如
  4. 这时会查询中断向量表,根据中断源跳转到相应的中断服务程序中执行,如
  5. 执行完中断函数后再重新返回main函数中继续执行,如

STM32加入IAP启动流程

  1. STM32上电后会从0x08000004处出去复位中断向量的地址,并跳转执行复位中断服务程序,如
  2. 执行完复位中断服务程序后进入到IAP的main函数中,将新的APP代码烧写到指定的User Flash中,然后跳转到APP中执行程序,如
  3. 在APP中跳转到指定新的向量表,取出复位中断向量地址,并跳转执行新的复位中断服务程序,然后跳转至APP的main函数,如
  4. 这时FLASH中存在两个向量表,当有中断请求到来时,PC指针仍然会指向地址0x08000004中断向量表,如
  5. 查询中断向量表,根据中断来源跳转到新(APP)的中断服务程序中执行,如
  6. 执行完中断函数后再重新返回main函数中继续执行,如
    注:灰色部分为APP代码

IAP例程介绍

ST官方提供STM32F10x IAP资源包和一份应用笔记:

  • STM32F10x IAP例程包,下载地址 :point_right: ST官网
  • STM32F10x IAP应用笔记,下载地址 :point_right: ST官网

IAP相关文件介绍

把ST官方的STM32F10x IAP例程包下载并解压,在STM32F10x_AN2557_FW_V3.3.0\Project\IAP目录下有EWARM、HiTOP、MDK-ARM、RIDE、TrueSTUDIO的工程目录,以常用的MDK-ARM为例打开工程,根据目标MCU平台选择工程Target,如MCU平台为STM32F103C8T6(中容量产品),则工程Target选择STM3210B-EVAL,然后编译,IAP主要的代码在工程目录的User Groups下

User Groups下包含的IAP驱动相关的源文件和描述如下:

  • main.c:初始化串口,然后从common.c文件中执行主菜单
  • common.c:内容显示函数和主菜单程序
  • ymodem.c和download.c:用于接收超级终端发送过来的数据(采用ymodem协议)并下载到STM32F10x内部RAM中
  • upload.c:把内部FLASH中的APP代码通过ymodem协议进行上传

整个IAP程序的运行框架如下图:

IAP程序运行过程:判断用户按键是否按下(STM3210B-EVAL使用的是PB9,判断PB9是否为低电平),没有按下(PB9为高电平)就直接跳转到用户APP程序执行;如按下,初始化串口1,(连接到超级终端,超级终端)显示IAP菜单,菜单有:1-下载,2-上传,3-跳转(如检测到FLASH被写保护,就会有4-解除写保护)。

键盘输入1:提示下载APP程序文件,通过超级终端的ymodem协议把APP程序的二进制文件传输下载到指定的User FLASH中,如果出现错误则会在超级终端中显示出来,传输下载完成后会重新返回显示IAP主菜单

键盘输入2:提示把FLASH中APP程序通过ymodem协议在超级终端上传,如果出现错误则会在超级终端中显示出来

键盘输入3:跳转到APP程序运行

键盘输入4:解除FLASH写保护(该操作在系统检测到FLASH处于写保护才会显示到超级终端上)

IAP例程使用概要

IAP驱动程序也是需要下载到FLASH里运行的,IAP程序占用FLASH大小约为12KByte,在不同密度的产品占用FLASH的页数不一样(低、中密度为1KByte字节每页,超高、高密度为2KByte字节每页)

  • 在低、中密度产品中,IAP程序占用FLASH的页0~页11
  • 在超高、高密度产品中,IAP程序占用FLASH的页0~页5

IAP例程还需要一个支持ymodem协议的PC上位机(超级终端),使用STM32的串口连接PC,通过上位机来进行程序的上传和下载,这里使用的上位机软件是:SecureCRT8.3(安装和使用请参考百度)

打开STM32F10x_AN2557_FW_V3.3.0\Project\IAP目录下的MDK-ARM工程,选择Target为STM3210B-EVAL,编译并下载到测试目标板中(测试目标板MCU型号为STM32F103C8T6),通过串口连接测试目标板与PC,打开SecureCRT8.3建立基于串口通讯的快速连接(波特率:115200,数据位:8位,无奇偶校验,停止位:1位,无流控),然后把PB9引脚接低电平,复位测试目标板,可以看到上位机显示


注:程序检测到FLASH没有处于写保护状态时,不会显示FLASH擦除选项

下载APP例程文件

在下载APP例程文件前,需要知道IAP程序中设置的APP程序FLASH地址,该地址位于工程的common.h文件下

1
#define ApplicationAddress    0x8003000

APP程序下载的FLASH起始地址为0x8003000。打开STM32F10x_AN2557_FW_V3.3.0\Project\IAP\binary_template目录下的MDK-ARM工程,选择Target为STM3210B-EVAL,该工程为官方提供的APP例程,打开工程的Options窗口,在Target栏下做如下修改(STM32F103C8T6的FLASH大小为64KB,APP例程的FLASH起始地址设为0x08003000,大小为:64KB-IAP使用的12KB = 52KB = 0xD000)

在User栏下,After Build/Rebuild选项下勾选Run #1,然后在对于的右侧填入D:\Keil_v5\ARM\ARMCC\bin\fromelf.exe --bin -o ./STM3210B-EVAL/@L.bin ./STM3210B-EVAL/@L.axf,该语句的作用是在工程下的STM3210B-EVAL目录下生成STM3210B-EVAL.bin和STM3210B-EVAL.axf文件(如KEIL安装目录不一样,则需要修改D:\Keil_v5\ARM\ARMCC\bin\fromelf.exe

编译之后就会生成STM3210B-EVAL.bin,该APP例程的效果是4个LED闪烁,LED的IO口定义在stm3210b_eval.h文件下,可根据实际硬件LED连接来修改。

生成.bin文件后,回到上位机界面,然后键盘输入数字:1,此时上位机提示等待接收APP程序文件,在上位机菜单栏点击Transfer–>Send Ymodem…,选择生成的APP程序文件STM3210B-EVAL.bin,然后点击Add,最后点击OK,发送成功后会显示发送的文件文件名和大小,然后再次返回IAP注菜单


注:发送超时会自动返回IAP主菜单

最后键盘输入数字:3,程序跳转到APP运行,可以看到LED闪烁。

本文标题:STM32F103-IAP设计与应用

文章作者:LGG001

发布时间:2018年08月15日 - 23:08

最后更新:2019年01月17日 - 21:01

原始链接:http://yoursite.com/2018/08/15/STM32F103-IAP设计与应用/

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。

-------------本文结束感谢您的阅读-------------
Thank You For Your Approval !