STM32F103 串口-IAP程序升级

通常情况下我们给STM32系列的单片机烧录程序文件的时候,使用SWD、J-link或者通过设置BOOT引脚后,使用串口进行程序下载,这样的方式直接一次性将程序文件下载到单片机的flash中,比较适合绝大部分的应用。但是有些应用中产品装配完成后,下载口不便引出的情况下,或者是某些设备需要具有远程更新程序情况下,使用串口IAP的方式将会更加便捷。

一般我们常见的51单片机内部的flash空间,只能使用下载器进行烧录程序。芯片自身无法擦写内部flash空间。这样的情况下,如果我们后期需要升级芯片中的程序时,只能到现场使用下载器重新烧录程序,这样比较繁琐。但是STM32单片机内部的flash可以在程序中让单片机自身去擦写编程,同时官方也提供了相应的操作函数固件库。这样就可以实现单片机程序的远程升级,通过芯片外设的某种通信接口(一般常用串口),将程序文件发送给芯片,让芯片自身把程序文件写入内部flash,实现程序的远程升级操作。如果要实现让单片机自身去升级程序,就必须要将内部flash空间进行划分,分不同的区域写入不同工程的程序代码,才能实现该功能。

一般情况下,我们将单片机的内部flash空间划分为两大区域,为了方便理解,我们叫做bootloader区域和app区域(这里的bootloader和app为自定义名称,也可叫做其他名称)。分为两大区域的原因是,我们要给一块芯片(单片机)写入两个不同的工程文件,这个两个工程分别是“程序升级工程(bootloader)”和“应用程序工程(app)”。两个工程的区别是:

“程序升级工程”存放在flash的bootloader区域。它的作用:接收新版本的程序文件,将收到的文件写入内部flash的app区域中。这个工程的任务比较单一,所以它只占用较小的一部分flash空间”。

“应用程序工程”存放在flash的app区域。它的作用:执行真正的功能操作。如数据采集、执行一些运算等操作。也是单片机实际发挥作用的程序。升级程序的方式是,可以灵活应用,主要看开发人员的编程思路,在这里我们使用上电检测的方式进行程序的更新。

单片机上电后,首先在bootloader区域运行程序升级函数,检测是否有新版本的程序需要升级,如果需要升级时,就将接收的新版本程序数据写入app区域,之后跳转到app区域去运行正在的应用程序函数。如果不需要升级程序时,就直接跳转到app区域去执行程序。流程如下:

串口IAP程序的操作方式是,分时切换flash区域进行执行不同功能的函数,而不是两个区域中的程序都在运行。任何时候,单片机都不能同时执行两个工程代码,我们将flash空间划分如下(以STM32F103CB为例)flash的总大小是128Kb,划分bootloader区域大小为8Kb,app区域为120Kb。示意图和相关地址如下:



    如果想要将程序按照如上图所示的flash空间存放的话,就必须对编译环境进行一些设置,才能到达我们的目的,不再使用默认的编译设置。bootloader工程设置在编程软件keil5中设置如下:

app工程设置在编程软件keil5中设置如下:

在app工程的程序代码中除了设置工程代码的编译地址之外,还要将中断向量表偏移寄存器的值进行相对应的设置。设置中断向量表偏移寄存器的方法有两种:

①→可以在app应用程序的主程序while循环之前设置,设置格式为:

        CB->VTOR = FLASH_BASE | 0x2000;

②→还可以在官方的固件库设置,在固件库system_stm32f10x.c文件中,第267行使用了如下的设置:

而上述表达式中的“VECT_TAB_OFFSET”在该固件库文件的第128行进行了声明和初值定义:

可以看出,默认情况下,“VECT_TAB_OFFSET”的值等于0。也就是不进行偏移,我们在进行IAP编程的时候,可以将此处的初值改为对应的偏移量即可。通常我们不对官方固件库进行更改,所以常用第一种方式进行设置中断偏移量。在这里要注意的是,偏移量不能随意任意设置,由于ARM Cortex®-M3内核规定,中断向量表必须对齐原则。因此中断偏移量的值必须是0x200的倍数。

IAP代码中关于跳转部分的详解:

在编程中我们要清楚的知道,单片机任何时候只能运行一个代码工程,并不是两个区域的代码都在运行。所以就必须使单片机要在两个区域(bootloader区域和app区域)或者是两个工程代码之间进行跳转。跳转之前除了要将app工程代码中的中断偏移量进行相对应的设置外,还要在单片机跳转时,设置app区域代码的主堆栈栈顶地址。通过官方手册就可以知道,STM32默认启动地址是0x08000000,而这个首地址中保存的就是堆栈的栈顶地址,这个地址是在代码编译后,有编译器自动产生。同时根据相关手册可以看到STM32的程序存放规则和编译后的可执行文件的规则是,编译后的可执行文件中第一个字就是被下载到STM32内部flash中的第一个存储单元中,而这个就是我们需要的堆栈栈顶地址。

重新设置STM32的堆栈栈顶地址是属于内核级别的操作,因此C语言无法进行内核操作,只能借助嵌入汇编的形式进行操作,一般是使用MSR指令进行操作的。MSR指令是用于访问内核中特殊功能寄存器(如堆栈栈顶寄存器)专用汇编指令。其编写形式一般为如下:

完成对工程的设置与程序代码的编写之后,我们还需要得到相应工程的BIN格式文件,keil软件自带输出BIN文件的功能,但是一般情况下我们不使用BIN文件,所以程序代码编译完毕后,软件默认是不输出BIN格式的文件。如想要keil在编译完成之后,同时输出BIN文件,则需要进行设置,设置方法是在工程管理的选项卡的User选项中的Run #1处编写命令“fromelf.exe --bin -o "$L@L.bin" "#L"”即可,如图:

STM32F103 串口-IAP程序升级的更多相关文章

  1. STM32F103/429串口IAP+Ymodem升级

    起因: 串口IAP升级在正点原子的例程中有讲解,正点原子的方法是:在RAM中开辟一个120K的数据空间,用来存放bin文件,bin文件通过串口一次性发送到单片机,然后再实现程序的跳转.但是这种方法在实 ...

  2. STM32之串口IAP更新升级

    一.IAP简介 IAP是应用编程,目的是为了在产品发布后可以方便地通过预留的通信口对产品中的固件程序进行更新升级,后续产品发布后,更新程序我只需要把.bin文件通过串口发送给芯片就可以执行更 新,很方 ...

  3. STM32F4 串口IAP程序要点

    1. IAP(bootloader)程序 1.1 内部Flash地址分配 /* Start of the Flash address */ #define STM32_FLASH_BASE 0x080 ...

  4. STM32 Bootloader基于ymodem传输协议串口IAP升级详解

    硬件:stm32f103cbt6 软件:STM32F10x_StdPeriph_Lib_V3.5.0 文章目录 1 预备知识 2 Bootloader 2.1 启动流程 2.2 校验跳转地址是否有效 ...

  5. STM32f103x IAP远程升级小结

    最近在面试的时候遇到一个关于IAP远程程序升级的问题,由于之前所做的项目没有涉及到远程升级需求,当时一脸懵呆,不过回答的还是不错的,今天针对STM32F103系列调试了IAP的程序,这里做一下小结,如 ...

  6. STM32 IAP 在线升级详解(转)

    源:http://blog.csdn.net/yx_l128125/article/details/12992773 (扩展-IAP主要用于产品出厂后应用程序的更新作用,考虑到出厂时要先烧写IAP   ...

  7. STM32串口IAP实验笔记

    STM32的IAP功能确实方便,以前对此如何实现有所了解,但是一直没去测试,这两天来练了下,可谓困难重重,搞了两天问题也一一解决,下面做些简要的笔记 IAP就是在线应用编程,方便程序升级,可以不用打开 ...

  8. STM32串口IAP分享

    什么是IAP? IAP是In Application Programming的首字母缩写,IAP是用户自己的程序在运行过程中对User Flash的部分区域进行烧写,目的是为了在产品发布后可以方便地通 ...

  9. 【转载】STM32 IAP 在线升级详解

      (扩展-IAP主要用于产品出厂后应用程序的更新作用,考虑到出厂时要先烧写IAP  再烧写APP应用程序要烧写2次增加工人劳动力基础上写了“STM32 IAP+APP ==>双剑合一”链接稍后 ...

随机推荐

  1. JPA分页查询与条件分页查询

    情有独钟的JPA 平时在写一些小项目时,比较喜欢引用 Spring Data Jpa,其实还是图他写代码快~在日常的开发工作中,分页列表查询基本是随处可见,下面一起看一下如何使用 jpa 进行多条件查 ...

  2. C/C++語言 - 日常算法 - 蛇形填數

    C/C++語言 - 日常算法 - 蛇形填數 日期 : 2019-06-11 問題描述: 在n×n方阵里填入1,2,…,n×n,要求填成蛇形. 例如,n=4时方阵为: 10   11  12  1 9 ...

  3. Zookeeper的典型应用场景(转)

    在寒假前,完成了Zookeeper系列的前5篇文章,主要是分布式的相关理论,包括CAP,BASE理论,分布式数据一致性算法:2PC,3PC,Paxos算法,Zookeeper的相关基本特性,ZAB协议 ...

  4. linux 文件夹分享

    1.在 linux 安装 samba,安装好之后 配置文件在 /etc/samba/smb.conf 目录下. yum install samba samba-client(yum install s ...

  5. igel udc2 config

    igel udc2 config 系统安装盘下载地址 http://www.myigel.biz/?forcedownload /config/bin/igelone_config #!/bin/sh ...

  6. 2-python元组和列表

    目录 元组 列表 1.元组 - 元素有序排列 - 一个元组中的元素不需要具有相同的类型 - 元素不可增添.修改和删除 1.1.创建元组 # 创建元组 tup1 = (1,2,3,4) tup2 = t ...

  7. JVM性能优化--JVM参数配置,使用JMeter简单测试配合说明参数调优

    一.JVM参数配置 1.常见参数配置 -XX:+PrintGC 每次触发GC的时候打印相关日志 -XX:+UseSerialGC 串行回收 -XX:+PrintGCDetails 更详细的GC日志 - ...

  8. 小米手机安装Google框架

    方法一 打开应用商店,搜索谷歌安装器下载即可. 方法二 搜索Gmail.Google+.Youtube等软件跳到豌豆荚,自动下载Google框架.

  9. ubuntu16.04安装openssh中报错解决

    在使用apt-get直接进行安装时会报错: sudo apt-get install openssh-server 正在读取软件包列表... 完成 正在分析软件包的依赖关系树       正在读取状态 ...

  10. ubuntu16.04+GTX2080Ti+torch7安装记录

    环境说明 ubuntu16.04 cuda10.0 2080Ti显卡 拉取代码和修改编译脚本 拉取代码 用户先clone代码: git clone https://github.com/torch/d ...