STM32串口IAP分享
什么是IAP?
IAP是In Application Programming的首字母缩写,IAP是用户自己的程序在运行过程中对User Flash的部分区域进行烧写,目的是为了在产品发布后可以方便地通过预留的通信口对产品中的固件程序进行更新升级。
在重新编程过程中可以使用任意类型的通信协议,如UART、I2S、SPI等。这篇笔记分享的是使用UART方式IAP。
串口IAP实验
先理一理流程(本实验是以STM32F103ZET6为例):
1、实验说明
做这个实验需要准备两个keil工程,一个工程用于编写IAP程序,另一个工程用于编写我们的应用程序(要实现某些功能的程序),这里我们以一个点灯程序为例。最终,两份工程编译出来的可执行文件都需要烧写到芯片的FLASH中。只不过需要烧写到不同的地址,简单的示意图如下:

这里,使用的STM32的型号为STM32F103ZET6,其FLASH大小是512KB,0x08000000为其FLASH被映射的地址,程序被烧写到的就是这个地址。此处,我们的IAP程序烧写到这个地址,根据IAP程序的大小,我们在keil里可以设置合适的IAP结束地址。
注意:在没有IAP程序的情况下,0x08000000这个地址就是应用程序烧写的地址。
2、工程说明
本实验用到的两个工程可按照文末的方式获取,其中IAP工程移植至ST官方例程。下面对两个工程进行简单的说明
IAP工程:
(1)需要在target选项卡里设置我们IAP程序的起始地址与大小,如:

这里我们的IAP程序起始地址设为0x08000000,大小设为0x3000,即IAP所能用的FLASH空间为12KB。其中IAP所能占的占空间的大小可根据IAP的实际大小进行修改。
(2)需要修改程序中我们需要跳转到的应用程序的地址(即IAP程序的结束地址):

LED工程:
(1)需要在target选项卡里设置我们LED程序的起始地址与大小,如:

这里我们的LED程序起地址设为0x08003000,大小设为0x10000,即LED所能用的FLASH空间为64KB。其中结束地址可根据LED应用程序的实际大小进行修改。
(2)生成对应的.bin文件。这需要在User选项卡里添加如下命令(即编译后执行的命令):

其中,fromelf.exe是我们keil安装目录下的一个可执行程序,可以把.axf文件转换成.bin文件。要在keil中直接调用fromelf命令,必须要把fromelf.exe所在目录添加到环境变量中。添加环境变量的方法如下(该方法来自于《【野火】零死角玩转STM32—F429挑战者V2.pdf》):
本文以 Win7 系统为例添加工具链的路径到 PATH 环境变量,其它系统是类似的。
(1) 右键电脑系统的计算机图标,在弹出的菜单中选择属性 ,如图:

(2) 在弹出的属性页面依次点击高级系统设置 ->环境变量,在用户变量一栏中找到名为PATH的变量,若没有该变量,则新建一个。编辑PATH变量,在它的变量值中输入工具链的路径,如本机的是;D:\work\keil5\ARM\ARMCC\bin,注意要使用分号;让它与其它路径分隔开,输入完毕后依次点确定,如图:

(3) 打开 Windows 的命令行,点击系统的开始菜单,在搜索框输入cmd,在搜索结果中点击cmd.exe即可打开命令行, 如图:

(4) 在弹出的命令行窗口中输入fromelf回车,若窗口打印出 formelf 的帮助说明,那么路径正常,就可以开始后面的工作了;若提示不是内部名外部命令,也不是可运行的程序…信息,说明路径不对,请重新配置环境变量,并确认该工作目录下有编译工具链。
这个过程本质就是让命令行通过“PATH”路径找到fromelf.exe程序运行 。
3、IAP源码说明
(1)主函数:
int main(void)
{
FLASH_Unlock(); /* FLASH解锁 */
KEY_Init(); /* 按键初始化 */
IAP_Init(); /* IAP初始化 */
/* 按键按下则进入主菜单开始更新程序(注意:需要按下复位键的同时按下该按键触发程序更新) */
if (GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_2) == 0x00)
{
SerialPutString("\r\n======================================================================");
SerialPutString("\r\n= (C) COPYRIGHT 2010 STMicroelectronics =");
SerialPutString("\r\n= =");
SerialPutString("\r\n= In-Application Programming Application (Version 3.3.0) =");
SerialPutString("\r\n= =");
SerialPutString("\r\n= By MCD Application Team =");
SerialPutString("\r\n======================================================================");
SerialPutString("\r\n\r\n");
Main_Menu ();
}
/* 保持运行用户应用程序 */
else
{
/* Test if user code is programmed starting from address "ApplicationAddress" */
if (((*(__IO uint32_t*)ApplicationAddress) & 0x2FFE0000 ) == 0x20000000)
{
/* Jump to user application */
JumpAddress = *(__IO uint32_t*) (ApplicationAddress + 4);
Jump_To_Application = (pFunction) JumpAddress;
/* Initialize user application's Stack Pointer */
__set_MSP(*(__IO uint32_t*) ApplicationAddress);
Jump_To_Application();
}
}
while (1){}
return 0;
}
可见,我们按下复位的同时按下PE2对应的按键即可触发应用程序更新操作,否则跳转到应用程序的起始地址执行应用程序(断点重启也是默认执行应用程序),这里的ApplicationAddress就是我们上面设置的0x08003000。
(2)主菜单函数Main_Menu
这个函数里就是该IAP程序的功能,根据其中的打印信息:

可以知道,该IAP有三个功能(分别输入键盘上的数字1、2、3进行选择):一是下载程序(电脑->STM32);二是上传程序(STM32->电脑);三是执行新程序(即刚下载完成的程序)。
(3)下载程序功能函数SerialDownload
首先,上位机使用Ymodem协议进行数据下发,STM32根据协议解析数据,拿到有用的数据,并把这些数据写入FLASH对应的地址中,即ApplicationAddress。关于Ymodem协议及SerialDownload函数这里不展开讨论。
4、下载验证
(1)下载IAP程序
可以使用J-link等调试器进行下载,也可用串口ISP进行下载,我们选用的是串口ISP进行下载,借用的工具是FlyMcu:

这里下载的是.hex文件,如果下载.bin文件,则会提示如下错误:

程序文件不是0x8000000和0x20000000区域的
使用ISP方式下载需要进行的硬件操作是:BOOT0引脚拉高,BOOT1引脚接地。即系统存储器被选为启动区域:

在点击开始编程按钮后,需要按下板子上的复位键,即可下载程序。
(2)通过IAP程序引导下载LED程序
上面提到下载程序使用的是Ymodem协议,所以得选用带有Ymodem协议传输方式的上位机软件来把应用程序下载到板子里。可以选用SecureCRT,也可以选用超级终端。这里选用的是超级终端:

首先按下数字键1触发下载程序操作,此时会不断打印CCCCC...。然后点传送->发送文件,选择要下载的.bin文件及Ymodem协议。下载完成后按下数字3即可执行新下载得应用程序:

终于,LED闪烁起来了,点灯项目成功~。断电重启之后默认执行的是这个点灯程序,要想下载新的程序,按下复位的同时按下PE2所对应的按键(需要一定的手速,哈哈)即可触发更新程序操作。
以上就是本次笔记分享的内容,如有错误,欢迎指出!
我的个人博客:https://zhengnianli.github.io/
我的微信公众号:嵌入式大杂烩,关注并回复【1024】获取1TB大杂烩资料。

STM32串口IAP分享的更多相关文章
- STM32串口IAP实验笔记
STM32的IAP功能确实方便,以前对此如何实现有所了解,但是一直没去测试,这两天来练了下,可谓困难重重,搞了两天问题也一一解决,下面做些简要的笔记 IAP就是在线应用编程,方便程序升级,可以不用打开 ...
- STM32的IAP实现
STM32的IAP实现 2014年07月28日 16:31:06 Stylesen 阅读数:556 IAP,全称是“In-Application Programming”,中文解释为“在程序中编程 ...
- STM32的IAP方案
from: http://bbs.eeworld.com.cn/thread-294115-1-1.html 几乎所有的同类书籍都介绍综合性的应用示例如“万年历 + 温度显示 + 闹钟响铃 + 计 ...
- STM32F103 串口-IAP程序升级
STM32F103 串口-IAP程序升级 通常情况下我们给STM32系列的单片机烧录程序文件的时候,使用SWD.J-link或者通过设置BOOT引脚后,使用串口进行程序下载,这样的方式直接一次性将程序 ...
- 关于STM32的IAP与APP互相跳转
关于STM32的IAP与APP互相跳转 之前做了一个不带系统的IAP与APP互相跳转,在网上找了资料后,很顺畅就完成了,后来在IAR集成开发环境下,IAP无系统,APP用UCOS系统做互相跳转出现了很 ...
- stm32串口之存储与解析
最近在做一个小项目,需要用stm32串口接受Arduino发送的一个不定长的数据,并且解析数据,执行其中的命令:秉着不在中断中做过多任务的思想,我们将从串口中接受到的字符放到一个数组当中. 定义数组 ...
- STM32 串口DMA方式接收(转)
STM32 是一款基于ARM Cortex-M3内核的32位MCU,主频最高可达72M.最近因为要在车机上集成TPMS功能, 便开始着手STM32的开发工作,STM32F10x系列共有5个串口(USA ...
- STM32串口寄存器操作(转)
源:STM32串口寄存器操作 //USART.C /************************************************************************** ...
- stm32串口通讯问题
stm32串口通讯问题 在串口试验中,串口通讯不正常,则可能会出现以下问题: 1. 配置完成后,串口没有任何消息打印. 原因:1,端口配置有问题,需要重新检查I/O口的配置 2,接线有问题,检查接线是 ...
随机推荐
- 纯css制作电闪雷鸣的天气图标
效果 效果图如下 实现思路 使用box-shadow属性写几个圆,将这些圆错落的组合在一起,形成云朵图案 after伪元素写下面的投影样式 before伪元素写黄色闪电的样式 dom结构 用两个嵌 ...
- 爬取凤凰网站财经类的新闻,函数时编程,可全部实现,由于内容量大,需要时间太长,服务器会禁止,为了防止,可以将time.sleep()设置的时间长点
import requests from selenium import webdriver import time def grasp(urlT): driver = webdriver.Chrom ...
- 【深入浅出-JVM】(77):SPI
概念 Service Provider Interface 规则 在resource/META-INF/services 创建一个以接口全限定名为命名的文件,内容写上实现类的全限定名 接口实现类在cl ...
- response中文乱码问题
1.要确定I代码的编码格式为UTF-8 2.乱码原因:浏览器和服务器的编码格式不同: 服务器的默认编码为:ISO-8859-1,如果浏览器的编码不是ISO-8859-1,就会出现乱码: public ...
- Java第二次作业第三题
四叶玫瑰线的图形设计:当用鼠标拖拽改变窗口大小时,四叶玫瑰线会重新绘制 package naizi; import java.awt.*; import java.awt.event.*; impor ...
- 【教程】Bluestacks0.7.9.860以上版3分钟教你摇一摇
Bluestacks 0.7.9.860 版或以上 , 打开文件夹Win 7 用户 : C:\ProgramData\Bluestacks\UserData\InputMapperWin XP 用户 ...
- Aspose.Cell导出带chart图表
最终实现的效果就是这样,代码比较多,我放在了CSDN上了,是无需模板的,别听网上瞎吹,说什么要模板,地址是:https://download.csdn.net/download/chanelwtt/1 ...
- ASP.NET Core 3.0 : 二十五. TagHelper
什么是TagHelper?这是ASP.NET Core 中新出现的一个名词,它的作用是使服务器端代码可以在Razor 文件中参与创建和呈现HTML 元素.(ASP.NET Core 系列目录) 一.概 ...
- centos赋予访问权限
chmod u+x *.sh (代表授权现在所处的文件目录下的所有以:.sh的文件 启动tomcat:/usr/local/tomcat9/bin/shutdown.sh 关闭tomcat:/usr/ ...
- Flask关于request一些方法和属性的整理(持续更新)
前提:基于纯后端服务, post 请求 (Content-Type: application/json,) 1.获取未经处理过的原始数据而不管内容类型,如果数据格式是json的,则取得的是json字符 ...