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

这篇具有很好参考价值的文章主要介绍了【嵌入式开发学习】__扒一扒单片机串口IAP原理。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

一、什么是IAP?

二、串口IAP实验

1. 实验说明

2. 工程说明

IAP工程:

LED工程:

3. IAP源码说明 

(1)主函数:

(2)主菜单函数Main_Menu

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

4、下载验证

(1)下载IAP程序

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

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


一、什么是IAP?

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

在重新编程过程中可以使用任意类型的通信协议,如 UARTI2SSPI 等。这篇笔记分享的是使用 UART方式IAP

二、串口IAP实验

先理一理流程(本实验是以 STM32F103ZET6 为例):

1. 实验说明

做这个实验需要准备两个 keil 工程,一个工程用于编写IAP程序,另一个工程用于编写我们的应用程序(要实现某些功能的程序),这里我们以一个点灯程序为例。最终,两份工程编译出来的可执行文件都需要烧写到芯片的FLASH中。只不过需要烧写到不同的地址,简单的示意图如下:

应用内编程(iap),嵌入式开发,STC系列单片机开发,STM32系列单片机开发,单片机,嵌入式硬件,STM32,版本升级,IAP,串口,物联网

这里使用的STM32型号STM32F103ZET6 ,其FLASH大小是512KB,0x08000000为其FLASH被映射的地址,程序被烧写到的就是这个地址。此处,我们的IAP程序烧写到这个地址,根据IAP程序的大小,我们在keil里可以设置合适的IAP结束地址。 

注意:在没有IAP程序的情况下,0x08000000这个地址就是应用程序烧写的地址。

2. 工程说明

本实验用到的两个工程可按照文末的方式获取,其中IAP工程移植至ST官方例程。下面对两个工程进行简单的说明。

  • IAP工程:

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

应用内编程(iap),嵌入式开发,STC系列单片机开发,STM32系列单片机开发,单片机,嵌入式硬件,STM32,版本升级,IAP,串口,物联网

这里我们的IAP程序起始地址设为 0x08000000,大小设为 0x3000,即IAP所能用的FLASH空间为12KB。其中IAP所能占的占空间的大小可根据IAP的实际大小进行修改。

(2)需要修改程序中我们需要跳转到的应用程序的地址(即IAP程序的结束地址):

应用内编程(iap),嵌入式开发,STC系列单片机开发,STM32系列单片机开发,单片机,嵌入式硬件,STM32,版本升级,IAP,串口,物联网

  • LED工程:

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

应用内编程(iap),嵌入式开发,STC系列单片机开发,STM32系列单片机开发,单片机,嵌入式硬件,STM32,版本升级,IAP,串口,物联网

这里我们的 LED 程序起地址设为 0x08003000 ,大小设为 0x10000 ,即LED所能用的FLASH空间为 64KB 。其中结束地址可根据LED应用程序的实际大小进行修改。

(2)生成对应的 .bin文件 。这需要在 User 选项卡里添加如下命令(即编译后执行的命令):

应用内编程(iap),嵌入式开发,STC系列单片机开发,STM32系列单片机开发,单片机,嵌入式硬件,STM32,版本升级,IAP,串口,物联网

其中,fromelf.exe 是我们 keil安装目录 下的一个可执行程序,可以把 .axf文件 转换成 .bin文件 。要在keil中直接调用 fromelf 命令,必须要把 fromelf.exe 所在目录添加到环境变量中。添加环境变量的方法如下(该方法来自于《【野火】零死角玩转STM32—F429挑战者V2.pdf》):

本文以 Win7系统 为例添加工具链的路径到 PATH 环境变量,其它系统是类似的。

(1)右键电脑系统的 计算机图标 ,在弹出的菜单中选择 属性 ,如图:

应用内编程(iap),嵌入式开发,STC系列单片机开发,STM32系列单片机开发,单片机,嵌入式硬件,STM32,版本升级,IAP,串口,物联网

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

应用内编程(iap),嵌入式开发,STC系列单片机开发,STM32系列单片机开发,单片机,嵌入式硬件,STM32,版本升级,IAP,串口,物联网

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

 应用内编程(iap),嵌入式开发,STC系列单片机开发,STM32系列单片机开发,单片机,嵌入式硬件,STM32,版本升级,IAP,串口,物联网

(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),嵌入式开发,STC系列单片机开发,STM32系列单片机开发,单片机,嵌入式硬件,STM32,版本升级,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

应用内编程(iap),嵌入式开发,STC系列单片机开发,STM32系列单片机开发,单片机,嵌入式硬件,STM32,版本升级,IAP,串口,物联网

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

应用内编程(iap),嵌入式开发,STC系列单片机开发,STM32系列单片机开发,单片机,嵌入式硬件,STM32,版本升级,IAP,串口,物联网

程序文件不是 0x80000000x20000000 区域的

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

应用内编程(iap),嵌入式开发,STC系列单片机开发,STM32系列单片机开发,单片机,嵌入式硬件,STM32,版本升级,IAP,串口,物联网

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

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

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

应用内编程(iap),嵌入式开发,STC系列单片机开发,STM32系列单片机开发,单片机,嵌入式硬件,STM32,版本升级,IAP,串口,物联网

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

应用内编程(iap),嵌入式开发,STC系列单片机开发,STM32系列单片机开发,单片机,嵌入式硬件,STM32,版本升级,IAP,串口,物联网

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


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

本文来源网络,免费分享知识,版权归原作者所有。如涉及作品版权问题,请联系我进行删除!文章来源地址https://www.toymoban.com/news/detail-829313.html

到了这里,关于【嵌入式开发学习】__扒一扒单片机串口IAP原理的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 嵌入式一开始该怎么学?学习单片机

    学习单片机: 模电数电肯定必须的,玩单片机大概率这两门课都学过,学过微机原理更好。 直接看野火的文档,芯片手册,外设手册。 学单片机不要纠结于某个型号,我认为stm32就OK,主要是原理和感觉。 看 野火文档 的时候,可以做笔记(记忆力好的人可以忽略),各种手

    2024年02月14日
    浏览(57)
  • 单片机STM32看门狗详解(嵌入式学习)

    单片机STM32的看门狗(Watchdog)是一种硬件定时器,用于监控系统的运行状态并在出现故障或死锁时采取措施以恢复正常操作。看门狗的主要功能是定期检查系统是否正常运行,并在系统出现问题时触发复位操作。 STM32系列单片机通常配备了内置的看门狗定时器(通常称为独立

    2024年02月13日
    浏览(63)
  • 探索嵌入式开发领域:单片机、ARM、Android底层的紧密联系

    作为一个曾编写ARM教程和参与Android产品开发的专家,我发现单片机、ARM、嵌入式开发和Android底层开发之间存在紧密的联系。对于那些希望在嵌入式开发领域发展的人来说,了解这些领域的知识至关重要。为了帮助你更好地学习这些内容,我总结了一些嵌入式资料,你可以在

    2024年02月11日
    浏览(50)
  • 嵌入式物联网单片机项目开发实例-4G DTU边缘数据采集网关开发

    链接:https://pan.baidu.com/s/163D-kElFqXov629YaSrWDw?pwd=1688 提取码:1688 [1.EC200S_STM32F103_4G CAT1网络TCP和UDP的透传字符串] [2.EC200S_STM32F103_4G CAT1网络TCP和UDP的透传十六进制包含0x00] [3.EC200S_STM32F103_4G CAT1通过外置MQTT协议发送定位和固定数据到ONENET] [4.EC200S_STM32F103_4G CAT1通过外置MQTT协议发送

    2024年01月16日
    浏览(52)
  • 要单片机和RTOS有必要学习嵌入式linux吗?

    学习嵌入式 Linux 是否有必要,取决于你的项目需求和职业发展目标。以下是一些考虑因素: 项目需求:如果你的项目需要处理复杂的网络、文件系统、多任务管理等功能,嵌入式 Linux 可能是更适合的选择。Linux 提供了丰富的开源软件包和驱动程序,可以加速开发过程并提供

    2024年02月14日
    浏览(57)
  • 适合嵌入式开发的GUI(嵌入式学习)

    嵌入式开发中的GUI(图形用户界面)是指在嵌入式系统中实现图形化的用户界面,以便用户可以通过触摸屏、按钮、鼠标或其他输入设备与系统进行交互。 以下是一些常见的嵌入式GUI开发方法: 轻量级GUI库:一些轻量级的GUI库适用于嵌入式系统,例如uGFX、LittlevGL、Nanogui等。

    2024年02月09日
    浏览(69)
  • 单片机 嵌入式开发软件介绍对比与推荐(Keil、IAR、VSCode、Clion、STM32CubeIDE)

    单片机 嵌入式开发软件介绍对比与推荐(Keil、IAR、VSCode、Clion、STM32CubeIDE) KEI官网:www.keil.com         Keil与MDK(Microcontroller Development Kit)是同一个软件开发工具套件的不同名称。         Keil是一家德国公司,而MDK是他们开发的一款集成开发环境(IDE),通常称为Keil

    2024年02月06日
    浏览(91)
  • RK3588平台开发系列讲解(嵌入式AI篇)嵌入式AI的学习步骤

    沉淀、分享、成长,让自己和他人都能有所收获!😄 📢 本篇将给大家介绍什么是嵌入式AI。

    2024年02月04日
    浏览(53)
  • 【嵌入式开发-8051】详细:基于AT89C52单片机设计的温控风扇(Proteus仿真设计-含设计原理图、程序源码)

    1、本设计是基于AT89C51/52单片机为核心的温控风扇系统,使用Proteus进行仿真分析。 2、由于上传后图片压缩,可以私信联系获取清晰图片。 3、本次为本人结课设计,整体比较简单,如有疑问欢迎大家交流讨论!   目录 【嵌入式开发-8051】详细:基于AT89C52单片机设计的温控风

    2024年02月07日
    浏览(59)
  • 华清远见嵌入式学习——驱动开发——作业1

    通过字符设备驱动分步注册过程实现LED驱动的编写,编写应用程序测试,发布到CSDN

    2024年02月20日
    浏览(57)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包