【嵌入式开发学习】__扒一扒单片机串口IAP原理

news2024/11/26 12:43:00

一、什么是IAP?

IAP 是 In Application Programming 的首字母缩写,IAP是用户自己的程序在运行过程中对 User Flash 的部分区域进行烧写,目的是为了在产品发布后可以方便地通过预留的通信口对产品中的固件程序进行更新升级。

在重新编程过程中可以使用任意类型的通信协议,如 UARTI2SSPI 等。这篇笔记分享的是使用 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 程序运行 。

学会配置 fromelf.exe ,也就学会配置了 MinGW 。MinGW是一个工具集,包含编译C与C++的gcc、g++,使用它就可以在Windows命令行下编译C程序。

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){}

  return0;
}

可见,我们按下复位的同时按下 PE2 对应的按键即可触发应用程序更新操作,否则跳转到应用程序的起始地址执行应用程序(断点重启也是默认执行应用程序),这里的 ApplicationAddress 就是我们上面设置的 0x08003000 。 

(2)主菜单函数Main_Menu

 这个函数里就是该 IAP 程序的功能,根据其中的打印信息:

可以知道,该IAP有三个功能(分别输入键盘上的数字1、2、3进行选择):

  • 1是下载程序(电脑->STM32);
  • 2是上传程序(STM32->电脑);
  • 3是执行新程序(即刚下载完成的程序)。

(3)下载程序功能函数SerialDownload 

 首先,上位机使用Ymodem协议进行数据下发,STM32根据协议解析数据,拿到有用的数据,并把这些数据写入FLASH对应的地址中,即ApplicationAddress。关于Ymodem协议及SerialDownload函数这里不展开讨论。

4、下载验证

(1)下载IAP程序

可以使用J-link等调试器进行下载,也可用串口ISP进行下载,我们选用的是 串口ISP 进行下载,借用的工具是 FlyMcu

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

程序文件不是 0x80000000x20000000 区域的

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

在点击 开始编程 按钮后,需要按下板子上的复位键,即可下载程序。 

 (2)通过IAP程序引导下载LED程序

上面提到下载程序使用的是 Ymodem 协议,所以得选用带有Ymodem协议传输方式的上位机软件来把应用程序下载到板子里。可以选用 SecureCRT ,也可以选用超级终端。这里选用的是超级终端:

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

终于LED闪烁起来了,点灯项目成功!断电重启之后,默认执行的是这个点灯程序,要想下载新的程序,按下复位的同时按下PE2所对应的按键(需要一定的手速)即可触发更新程序操作。

 


(* ̄︶ ̄)创作不易!期待你们的 点赞收藏评论喔。 

本文来源网络,免费分享知识,版权归原作者所有。如涉及作品版权问题,请联系我进行删除!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1219332.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

深入Android S(12.0) 探索 Android Framework 之 SystemServer 进程启动详解

深入学习 Android Framework 第三:深入Android S(12.0) 探索 Android Framework 之 SystemServer 进程启动详解 文章目录 深入学习 Android Framework前言一、Android 系统的启动流程1. 流程图2. 启动流程概述 二、源码详解1. 时序图2. 源代码1、ZygoteInit # main…

草图大师SketchUp Pro 2023

SketchUp Pro 2023 for Mac(草图大师)是一款三维建模软件,由Trimble Inc.开发。它可以用于创建、修改和分享3D模型,包括建筑、家具、景观等。 SketchUp Pro 2023 for Mac提供了简单易学的用户界面和强大的工具集,使用…

数据库表数据类型datetime 和 timestamp区别,以及优缺点

datetime和timestamp都是用于表示日期和时间的数据类型,但它们在存储和使用上有一些区别。 数据范围:datetime数据类型的有效范围是从1000年到9999年,精度为秒。timestamp数据类型的有效范围是从1970年到2038年,精度为秒。存储空…

element-china-area-data插件vue3做省市区的下拉选择,用3个独立的el-select实现

第1版,选择下拉没有优化 第2版,选择下拉时,做了优化

<蓝桥杯软件赛>零基础备赛20周--第6周--数组和队列

报名明年4月蓝桥杯软件赛的同学们,如果你是大一零基础,目前懵懂中,不知该怎么办,可以看看本博客系列:备赛20周合集 20周的完整安排请点击:20周计划 每周发1个博客,共20周(读者可以按…

SystemVerilog学习 (10)——线程控制

一、概述 在实际硬件中,时序逻辑通过时钟沿来激活,组合逻辑的输出则随着输人的变化而变化。所有这些并发的活动在Verilog 的寄存器传输级上是通过initial和 always块语句、实例化和连续赋值语句来模拟的。为了模拟和检验这些语句块,测试平台使用许多并发执行的线程。在测试平台…

Python 集成 Nacos 配置中心

Python 集成 Nacos 配置中心 下载 Nacos 官方 pyhton 库 pip install nacos-sdk-python # 指定国内阿里云镜像源 pip3 install nacos-sdk-python -i http://mirrors.aliyun.com/pypi/simple/ --trusted-host mirrors.aliyun.com配置 Nacos 相关信息 Global:nacos:port: 8848…

线下保薪班开启

大家都知道我们有线上班,对于想技能提升的同学来说,线上足以满足技能提升需求,对于想转行找工作,或者学生想就业的同学来说,线上却并不是一个好的选择,担心的可能有:担心自身基础较弱怕学不懂,担…

一文搞懂 Prompt 编程

大家好,我是木川 一、什么是 Prompt 编程 Prompt 编程是一种基于自然语言处理的编程方式,属于一种创新的编程范式,通过向大模型提供 Prompt(提示词),引导其生成特定的文本输出。 与传统的编码方式相比&…

开发知识点-Git

团队协作-Git Giteegitee 创建仓库打开项目所在目录,右键选择Git Bush Here(你要确定电脑上已经安装了Git)初始化本地仓库配置验证信息。 完美解决github访问速度慢介绍Git 与 SVN 区别IDEA 添加 gitee Gitee Git Gitee 大家都知道国内访问 Github 速度…

简单认识泛型【java】

目录 1.什么是泛型 2.引出泛型 2.1语法 3. 泛型类的使用 3.1 语法 4 泛型如何编译的 4.1 擦除机制 5.泛型的上下界 5.1 语法 6.注意 1.什么是泛型 一般的类和方法,只能使用具体的类型: 要么是基本类型,要么是自定义的类。如果要编写可以应用于…

PS 吸管工具基本使用方法

这里 我们先打开PS软件 我们 在左侧 导航来中 找到 有吸管工具的这一组工具 这边 我们先选择这个 吸管工具 选择之后呢 左上角 属性配置 第一个是 取样大小 这个 我们之前学魔棒工具时 是有接触过的 这里 我们选择 取样点 然后 后面一个是样本 这个 用的最多的是 所有图层 …

postgresql:记录表膨胀引起的io问题的处理

文章目录 1. io异常2.查看profile报告2.1 生成事发时间段的pgprofile2.2 查看报告 3.检查table是否膨胀4.执行vacuum full5.总结 1. io异常 iostat -x 1 20 Device r/s w/s rkB/s wkB/s rrqm/s wrqm/s %rrqm %wrqm r_await w_await aqu-sz rareq…

【环境准备】NodeJs(压缩包版本)安装与配置

一、NodeJs(压缩包版本)安装与配置 1、下载、解压 访问 NodeJs官网,选择Window版本的.zip格式进行下载,下载完成后进行解压(ps: 本人解压路径为D:\nodejs) 2、 环境变量配置 配置环境变量,找到系统变量下的path并选中&#xf…

009.网络配置

Rocky Linux的定位是提供服务的网络型操作系统,所以为其配置完整的网络参数至关重要。通常,Linux可以通过两种方式为系统配置网络参数:一种是通过命令行配置,另一种是通过修改系统配置文件来配置。下面分别介绍这两种配置网络参数…

腾讯云服务器新用户优惠活动有哪些?腾讯云新用户优惠活动汇总

对于新用户来说,腾讯云服务器提供了许多优惠活动,让你享受到超值的优惠。下面我们就来一起看看,腾讯云服务器新用户优惠活动有哪些吧! 1、腾讯云双十一领9999代金券(https://1111.mian100.cn) 腾讯云双十…

深度探讨丨关于工作量证明的常见误解

有一种基本误解认为,工作量证明机制在本质上是不可扩展的,并且会产生过度的能源耗费。 按照工作量证明区块链的最初设计,以及BSV区块链协会的推广,这一技术旨在实现可扩容性,同时确保高效能系统内的安全性和互操作性。…

调整Windows键盘上只能看到拼音而无法看到实际的文本以及关闭输入法悬浮窗方法

一、输入法设置 如果您在键盘上只能看到拼音而无法看到实际的文本,这可能是因为您的输入法设置为中文拼音输入法或其他仅显示拼音的输入法。 要解决这个问题,您可以尝试以下方法: 1. 切换输入法:按下 Shift Alt 组合键或 Wind…

yolo增加Inner-IoU,一文搞定(Inner-SIoU,Inner-WIoU,Inner-EIoU,Inner-MPDIoU)

论文:https://arxiv.org/pdf/2311.02877.pdf 简介 随着检测器的迅速发展, 边框回归取得了巨大的进步。然而,现有的基于 IoU 的边框回归仍聚焦在通过加入新的损失项来加速收敛,忽视 IoU 损失项其自身的限制。尽管理论上 IoU 损失能够有效描述…

linux systemd start stop enable disable命令区别

一、systemd 的服务在三个文件件下 /lib/systemd/system /etc/systemd/system /usr/lib/systemd/system 终于明白这几个命令的区别 systemd star systemd stop systemd enable systemd disable 二、 1、用ssh服务为例,,ssh是客户端,远程ss…