一、先了解ICP和ISP、IAP之间的区别:
1、 ISP(In System Programing 在系统编程)的实现相对要简单一些,一般通用做法是内部的存储器可以由上位机的软件通过串口来进行改写。对于单片机来讲可以通过SPI或其它的串行接口接收上位机传来的数据并写入存储器中。所以即使我们将芯片焊接在电路板上,只要留出和上位机接口的这个串口,就可以实现芯片内部存储器的改写,而无须再取下芯片。例如,我们开始接触到的STC51单片机的程序下载方式(点击上位机下载----->复位(断电)----->下载)

2、 IAP(In applicatin programming 在应用编程)的实现相对要复杂一些,在实现IAP功能时,单片机内部一定要有两块存储区,一般一块被称为BOOT区,另外一块被称为APP存储区。单片机上电从BOOT区开始运行,如果有外部改写程序的条件满足,则对存储区的程序进行改写操作。如果外部改写程序的条件不满足,程序指针跳到APP存储区,开始执行放在存储区的APP程序,这样便实现了IAP功能。

3、 ICP(In-Circuit Programming 在线编程)通过JTAG/SWD协议或者系统加载程序(Bootloader)下载用户应用程序到微控制器中。这种情况使用仿真器下载或者芯片厂商提供的ICP软件。

总结:(1)(重要!!!)IAP和ISP是我们研发生产中使用的比较多的情况,使用ISP外部条件触发(网上说有四种方式这里不介绍了,感兴趣的可以百度一下),IAP升级完全是芯片内部控制的(这个是很大的优点,试想当你的产品嵌入其他产品内部时候,你不可能打开外壳再外部触发升级。)。

(2)在嵌入式产品生产阶段,往往一些公司使用ICP或ISP的方式将裸芯片烧写IAP+APP程序,烧写的程序是bin文件格式或者加密后的bin文件格式(加密后的bin文件只能使用自己公司的上位机软件进行烧写否则产品无法正常启动)。

(3)在研发阶段,使用的IAP程序是通过JTAG或ISP烧入到芯片,然后通过上位机通过USB,UART或SPI的方式将应用程序(APP)烧写到芯片。

二、了解一下RAM和ROM的区别:
1、 RAM: 随机存储器,可以随时进行读写操作,速度很快,掉电以后数据会丢失。比如内存条、SRAM、SDRAM、DDR 等都是 RAM。RAM 一般用来保存程序数据、中间结果。

2、 ROM:只读存储器,笔者认为目前“只读存储器”这个定义不准确。比如我们买手机,通常会告诉你这个手机是 4+64 或 6+128 配置,说的就是 RAM 为 4GB 或 6GB,ROM 为 64G 或128GB。但是这个 ROM 是 Flash,比如 EMMC 或 UFS 存储器,因为历史原因,很多人还是将Flash 叫做 ROM。但是 EMMC 和 UFS,甚至是 NAND Flash,这些都是可以进行写操作的。

总结:(重要!!!)RAM 速度快,可以直接和 CPU 进行通信,但是掉电以后数据会丢失,容量不容易做大(和同价格的 Flash 相比)。ROM(目前来说,更适合叫做 Flash)速度虽然慢,但是容量大、适合存储数据(ROM程序的存储位置)。

三、IAP升级的机制讲解:
1、先看你STM32的内存地址架构图

从图上可以看出:
(1)内部flash 是从0x0800 0000开始 到0x0803 FFFF 结束, 0x0803FFFF-0x0800 0000= 0x20000 =256k flash的大小是256k;

(2)SRAM的开始地址是 0x2000 0000 开始到0x2000 FFFF结束,大小为64K
而刚刚说了我们程序是放在ROM中,那IAP(在线升级程序)代码放到Flash Memory里以0x0800 0000 开始的位置(有些RAM内核的芯片的内部flah起始地址是0x00000000)。

2、芯片BOOT脚配置

因为我们从flash烧写IAP程序,所以一般我们芯片引脚原理图设计为(BOOT0=0/1,BOOT1=0):

当产品开发完成时候,只能选择IAP升级方式,即:BOOT0=0,BOOT1=0;
三、如何编写IAP程序?
1、程序地址分配图:

上图是IAP+APP程序的大致结构图,在MDK配置IAP程序的地址空间分布为:

2、USB方式的IAP升级(UART,SPI等方式都大同小异)
(1)芯片正常执行在APP(应用程序)中(0x08004000-0x08030000)段,当要进行升级时候,上位机或者其他产品发送升级指令,升级指令,我们将会将升级标志位(假如是0xA0A0A0A0)写到flash的0x08003000开始的Flag区(大小为0x1000=4KByte,Flag区是我自己命名的)某个位置,写入标志位后,进行软复位。(写入我们预留的Flag区,可以写入APP文件的大小或者上位机分了多少包)

(2)复位后,程序又从0x00000000地址开始执行即进入IAP程序,这里为啥从0x08000000开始执行可以看我上篇文章STM32的Flash地址是0x08000000,从0x00000000不可以?
https://blog.csdn.net/weixin_42231514/article/details/106178653

(3)进入IAP程序后,我们将读flash的0x08003000起始的Flag区对应的标志位是不是0xA0A0A0A0,如果是,则上位机通过约定好的协议分包发固定字节的APP对应的bin文件或者加密后的bin文件(这里你的上位机会将加密的bin文件解密)写到0x08004000为起始的APP区。

(4)如果最后一包数据不满足约定的固定字节,这种情况下上位机可以填充0来满足固定字节或者IAP程序进行特别处理最后一包写入flash。

(5)IAP程序接收完最后一包APP 程序并写入flash后,此时跳转到0x08004000位置去执行APP程序,在APP程序初始化部分清除Flag区域的标志位0xA0A0A0A0。
下图为APP程序中地址空间的分配:

需要注意点:(重要!!!
(1) 在IAP程序中:
#define ApplicationAddress 0x08004000
#define NVIC_VectTab_FLASH ((uint32_t)0x08000000)
NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0000);

JumpAddress = *(vu32*) (ApplicationAddress + 4);//用户代码区第二个字为程序开始地址(复位地址)
Jump_To_Application = (pFunction) JumpAddress;
MSR_MSP(*(vu32*)ApplicationAddress);        //初始化APP堆栈指针(用户代码区的第一个字用于存放栈顶地址)
Jump_To_Application();      //跳转到APP.

(2)在APP程序中:

 #define NVIC_VectTab_FLASH           ((uint32_t)0x08000000)
NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x4000); //APP中,中断向量表的起始地址

如果有什么疑问,欢迎大家留言讨论。

STM32芯片IAP升级机制详解相关推荐

  1. STM32 USB设备远程唤醒机制详解

    目录 1.USB Resume信号 2.USB远程唤醒的方式 3.J状态和K状态 4.STM32 USB设备远程唤醒机制详解 5.主机对设备远程唤醒功能状态的获取.清除和设置 1.USB Resume ...

  2. STM8 IAP升级程序设计详解 - IAR环境

    一 STM8 IAP 原理分析 IAP原理非常简单,首先我们需要设计两个程序,然后在第一个程序(即Bootloader)中接收(通过串口.IIC.SPI等)第二个程序(即App)的代码,并写入Flas ...

  3. iar升级芯片库_STM8 IAP升级程序设计详解 - IAR环境

    1.STM8内存空间分配 首先我们在STM8L15x的官方手册中查看一下CPU的内存空间分配: 除了系统预留的部分我们实际用到的内存空间并不多,下面简单说明主要部分: -- RAM 0x00 0000 ...

  4. 芯片常用协议种类详解,含多协议转换器

    题目:芯片常用协议种类详解,含多协议转换器 目录 1. 引言 1.1常用通信样式 1.2 FPGA芯片上的UART也是一样的 1.3 FPGA用verilog实现UART 1.4基于FPGA的SPI协 ...

  5. SSL / TLS 协议运行机制详解

    转载自  SSL / TLS 协议运行机制详解 互联网的通信安全,建立在SSL/TLS协议之上. 本文简要介绍SSL/TLS协议的运行机制.文章的重点是设计思想和运行过程,不涉及具体的实现细节.如果想 ...

  6. 反射 数据类型_Java基础:反射机制详解

    一.什么是反射: (1)Java反射机制的核心是在程序运行时动态加载类并获取类的详细信息,从而操作类或对象的属性和方法.本质是JVM得到class对象之后,再通过class对象进行反编译,从而获取t对 ...

  7. python内存的回收机制_python的内存管理和垃圾回收机制详解

    简单来说python的内存管理机制有三种 1)引用计数 2)垃圾回收 3)内存池 接下来我们来详细讲解这三种管理机制 1,引用计数: 引用计数是一种非常高效的内存管理手段,当一个pyhton对象被引用 ...

  8. MySQL锁、事务隔离级别、MVCC机制详解、间隙锁、死锁等

    一. 简介 1. 锁定义 锁是计算机协调多个进程或线程并发访问某一资源的机制. 在数据库中,除了传统的计算资源(如CPU.RAM.I/O等)的争用以外,数据也是一种供需要用户共享的资源.如何保证数据并 ...

  9. 【Android签名机制详解】二:Android V1、V2、V3、V4签名方案

    前言 书接上回[Android签名机制详解]一:密码学入门,在了解了消息摘要.非对称加密.数字签名.数字证书的基本概念后,我们趁热打铁.直奔主题,讲解签名在Android中的实际应用. 基础知识 An ...

最新文章

  1. 自动驾驶场景下的高效激光里程计
  2. C++知识点23——使用C++标准库(顺序容器list的其他操作)
  3. master-slave(主/从)模式
  4. AGV控制器设计与融合
  5. sqlite数据类型、关键词及创建、修改、删除数据表
  6. java运算符使用总结_Java运算符知识点总结
  7. SkyWalking 观测 Service Mesh 技术大公开
  8. python可以自学编程吗-编程学习第一步,让你20天搞定Python编程
  9. WPF之Binding基础三 Binding的路径Path
  10. 2022最新RTMP+HTTP直播地址汇总(亲测可用)
  11. 百度Java后端:MySQL索引老大难问题,精讲总结
  12. LIN总线开发:智能雨量传感器
  13. 常见五轴机床的机械结构形式讲解!
  14. 航运人工智能提升全球集装箱海陆各环节作业效率,箱管控,CIMCAI自动化集装箱况残损检测/箱信息识别数字化录入,智慧航运智能航运
  15. 深入理解Java虚拟机——加载和存储指令
  16. 联通物联卡 显示“已停用”
  17. 忆享科技聚焦|数字中国发展报告、政务云市场规模、网络安全、中小企业数字化……近期热点资讯一览
  18. 《深入理解JAVA虚拟机》周志明 第三版 - 第一章 走近JAVA
  19. HBuilderX的介绍与语法提示
  20. 电脑图标变大了怎么办?

热门文章

  1. linux新建用户只能查看自己的目录,Linux创建用户只能访问某个目录
  2. C语言调用的常用数学函数
  3. 一个网恋致毁者的独白
  4. 《高等代数学》(姚慕生),例1.5.7
  5. 安装Windows Server 2016操作系统
  6. 打印机显示与计算机链接中断,解决打印机怪异提示之打印连接受到限制
  7. 买5000到5500的计算机的配置,这样的电脑配置单报价5500元,客户都嫌贵:劝您还是再看看吧!...
  8. switch简易计算器
  9. [luogu3258] [JLOI2014]松鼠的新家
  10. linux服务器增加虚拟内存