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

一、什么是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所对应的按键(需要一定的手速)即可触发更新程序操作。

 


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

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

HCIA-综合实验(三)

综合实验(三) 1 实验拓扑2 IP 规划3 实验需求一、福州思博网络规划如下:二、上海思博网络规划如下:三、福州思博与上海思博网络互联四、网络优化 4 配置思路4.1 福州思博配置在 SW1、SW2、SW3 上配置交换网络SW1、SW2、SW3 运行 S…

Matlab通信仿真系列——变量、矩阵及其运算

微信公众号上线,搜索公众号小灰灰的FPGA,关注可获取相关源码,定期更新有关FPGA的项目以及开源项目源码,包括但不限于各类检测芯片驱动、低速接口驱动、高速接口驱动、数据信号处理、图像处理以及AXI总线等 本节目录 一、变量 (1)变量的赋值…

DNS服务器的访问日志

DNS服务器的访问日志的目录位置取决于具体使用的DNS服务器软件和操作系统。一般来说,常见的DNS服务器软件如Bind、PowerDNS、Unbound等会有各自的默认日志目录,例如: Bind:默认存储在/var/log/named/目录下。PowerDNS&#xff1a…

AI创作系统ChatGPT网站源码/支持DALL-E3文生图/支持最新GPT-4-Turbo模型+Prompt应用

一、AI创作系统 SparkAi创作系统是基于OpenAI很火的ChatGPT进行开发的Ai智能问答系统和Midjourney绘画系统,支持OpenAI-GPT全模型国内AI全模型。本期针对源码系统整体测试下来非常完美,可以说SparkAi是目前国内一款的ChatGPT对接OpenAI软件系统。那么如…

mysql查询json字符串内容

参考文章:mysql json 基础查询_mysql json查询-CSDN博客 mysql查询json字符串内容 (多层数组嵌套) select id,nameJSON_EXTRACT(JSON_UNQUOTE(JSON_EXTRACT(JSON_UNQUOTE(config_json), $.baseInfo)), $.template_list[*].sms_content) s…

3.3主存储器与CPU的连接

存储器芯片的输入输出信号 增加主存的存储字长-位扩展 增加主存的存储字数-字扩展 线选法译码片选法n条线->n个选片信号n条线->2的n次方个选片信号电路简单电路复杂地址空间不连续地址空间可连续 主存容量扩展-字位同时扩展 译码器 双端口RAM和多模块存储器 双端口RAM …

3D应用开发引擎HOOPS如何促进AEC数字化架构革新?

随着科技的不断发展,建筑、工程和施工(AEC)行业正在掀起令人瞩目的数字化转型浪潮。在这一变革的过程中,Tech Soft 3D的HOOPS SDK(软件开发工具包)正扮演着关键的角色,为构建世界一流的AEC和BIM…

经纬恒润为国产化芯片的AoU功能安全软件赋能

近日,经纬恒润成功为旗芯微FC4150开发出符合功能安全要求的AoU功能安全组件,并适配到门模块配套产品,为国产化芯片完善了符合功能安全的生态链。 AoU(Assumption of Use,安全假设)需求是芯片厂商在safety manual对最终…

Flutter笔记: 在Flutter应用中使用SQLite数据库

Flutter笔记 在Flutter应用中使用SQLite数据库(基于sqflite) 作者:李俊才 (jcLee95):https://blog.csdn.net/qq_28550263 邮箱 :291148484163.com 本文地址:https://blog.csdn.net/q…

Ansible密码正确但无法登录目标服务器

问题 通过ansible-playbook批量管理服务器,需要事先编写inventory文件,目标服务器均使用随机密码。在使用ansible-playbook和ansible命令时,均出现其中一台无法登录成功的问题。通过ssh命令,使用inventory中记录得用户名、密码测…

企业电脑监控软件,五款好用的员工电脑监控软件

企业电脑监控软件,五款好用的员工电脑监控软件 企业在日常工作中,为了保护企业信息安全和提高工作效率,通常会使用员工电脑监控软件,可以有效地保护企业的核心信息,避免员工泄露机密信息或者利用企业资源进行非法活动…

智能巡视新飞跃,揭秘巡检无人机的应用与意义

在科技迅猛发展的今天,无人机技术逐渐渗透各行各业,巡检领域尤为引人关注。本文将深入探索巡检无人机的广泛应用与其背后的深远意义。 一、巡检无人机的应用场景 如今巡检无人机已成为各行各业的利器,在电力、交通、环保等领域,…

数据增删改

Insert 添加数据 -- DNL 数据操作语句 -- DML 插入数据 -insert-- 1为 tb_emp 表 username ,name gender 字段插入值insert into tb_emp ( username, name, gender,crete_time,update_time) values (weoji,将无极, 1 ,now(),now());-- 2 为 tb_emp 表的 所有字段…

测试Bard和ChatGPT关于法规中劳动时间的规定,发现chatgpt更严谨

Bard是试验品,chatgpt是3.5版的。 首先带着问题,借助网络搜索,从政府官方网站等权威网站进行确认,已知正确答案的情况下,再来印证两个大语言模型的优劣。 想要了解的问题是,在中国,跟法定工作…

麒麟信安助力长沙市就业与社保数据服务中心政务系统向自主创新演进

应用场景 长沙市就业与社保数据服务中心依托长沙市“政务云”的公共基础资源和相应的支撑能力,围绕社保、就业、人事人才、劳动关系等人社全量业务服务,力求建立以“智慧服务、智慧监管、智慧决策”为核心的“智慧人社”综合服务平台,实现人…

leetcode刷题日志-58最后一个单词的长度

给你一个字符串 s,由若干单词组成,单词前后用一些空格字符隔开。返回字符串中 最后一个 单词的长度。 单词 是指仅由字母组成、不包含任何空格字符的最大子字符串。 示例 1: 输入:s “Hello World” 输出:5 解释&a…

uni-app 蓝牙打印, CPCL指令集使用

先上代码: GitHub - byc233518/uniapp-bluetooth-printer-demo: 使用uniApp 连接蓝牙打印机 Demo, CPCL 指令简单实用示例 (内含 芝珂,佳博,精臣 多个厂家指令集使用文档) 文件结构: ├── App.vue ├── CPCL 指令手册.pdf // 指令集参考手册 ├── LICENSE ├── R…

高防IP是什么,高防IP有什么作用?

什么是高防IP? 高防IP是一款专业解决大流量攻击的安全防护产品,支持网站和非网站类业务的DDoS、CC防护,用户通过配置转发规则,将攻击流量引至高防IP并清洗,保障业务稳定可用,具有灾备能力,线路…

Python aiohttp 完全指南:快速入门

aiohttp 就是 Python 中一款优秀的异步 Web 框架,它能够帮助我们构建高效的异步 Web 应用和异步 HTTP 客户端。在本文中,我们将深入探讨 aiohttp 是什么以及如何使用它,通过简单易懂的案例带领你理解异步编程,以及如何处理异步请求…

【Hello Go】Go语言运算符

Go语言运算符 算术运算符关系运算符逻辑运算符位运算符赋值运算符其他运算符运算符优先级 算术运算符 如果之前没有其他语言基础的小伙伴可以参考下我之前写的C语言运算符讲解 这里主要讲解下Go和C运算符的不同点 – 运算符 Go语言中只有后置 和后置– var a int 5a--fmt.P…