电子工程师技术服务社区
公告
登录
|
注册
首页
技术问答
厂商活动
正点原子
板卡试用
资源库
下载
文章
社区首页
文章
单片机程序烧录的3种方式(ISP、ICP、IAP)是什么?
分 享
扫描二维码分享
单片机程序烧录的3种方式(ISP、ICP、IAP)是什么?
单片机
烧录
码农爱学习
关注
发布时间: 2021-04-26
丨
阅读: 1166
说起给单片机烧录程序,大家应该都不陌生吧,我最早接触单片机是从51单片机开始的,型号是STC89C52RC,当时烧录程序就是用的下面这种烧录软件——STC-ISP。 这种方式,通过**串口**连接单片机,选择一个合适的波特率就可以烧录了。 后来学习STM32,编程时使用KEIL软件自带的下载按钮就能下载程序,方便了不少,但需要额外使用**J-Link**等下载器。 再后来,接触到产品研发,给已经发布出的产品升级,都是要靠远程**无线升级**的(想想看,产品已经到客户那里了,当软件需要升级时,要是还使用有线的方式烧录程序,得有多麻烦) ![](https://cf02.ickimg.com/bbsimages/202104/b2366b6ce2e135a67e7a89c22fe9608d.png) 既然给单片机烧录程序的方式有多种,那烧录方式具体怎么分类呢? 可以分为3种: - ISP(In-System Programming) 在系统编程,使用引导程序(Bootloader)加上外围**UART/SPI等接口**进行烧录。 - ICP (In-circuit programmer) 在电路编程,使用**SWD/JTAG接口**。 - IAP(In-Application Programming) 指MCU可以在系统中获取新代码并对自己重新编程,即**用程序来改变程序**。 这3种烧录方式的原理是什么呢?在分析原理之前,需要先了解一下单片机Flash的访问地址,看看程序是烧录到哪个位置了。 ## 单片机Flash在地址映射表中位置 下图是一张STM32F4xx的地址映射表,从0x0000 0000到0xFFFF FFFF,总计4Gbyte。单片机的片上Flash、片上RAM、片上外设以及外部扩展接口的访问地址,都被映射到这4Gbyte的范围之内。 ![](https://cf02.ickimg.com/bbsimages/202104/52a2480b724e3b6dda6ee94ca3ac5f33.png) 这张图中,我们需要先注意下半部分 - Main memory 主存储区 通常,我们编写的代码,是放到主存储区的起始位置(0x0800 0000)开始运行的,烧录程序时,直接将程序烧录到这里即可(KEIL软件给STM32烧录程序的默认烧写地址就是0x0800 0000开始) - System memory系统存储区 System memory(起始位置0x1FFF 000)是STM32在出厂时,由ST在这个区域内部预置了一段BootLoader, 也就是我们常说的ISP程序 ,这是一块ROM,出厂后无法修改。 了解了程序的具体地址,还要看一下单片机的启动方式: ## 启动方式选择 STM32有两个BOOT引脚,通过配置不同的高低电平,可以让单片机从不同的地址开始运行。 - BOOT0=0, BOOT1任意 通常我们是在Main memory 主存储区(0x0800 0000)运行程序,BOOT0引脚拉低即可。 这种情况,KEIL软件给STM32烧录程序,就是直接在这个地址烧录,烧录完,直接在这个地址处运行。 - BOOT0=1,BOOT1=0 这种情况就用在使用串口方式给STM32烧录程序,这时单片机从系统存储器(0x1FFF 0000)启动,运行的是出厂预置的BootLoader程序,可以接收串口发来的程序,并将其写入Main memory(0x0800 0000),程序烧录完成后,再将BOOT0引脚拉低,Main memory(0x0800 0000)处运行刚烧录的代码了。 - BOOT0=1,BOOT1=1 这种情况是从内存中启动,内置SRAM(也就是STM32的内存中),既然是SRAM,自然也就没有程序存储的能力了,这个模式一般用于程序调试。目前我还没用过这种方式,大家平时用这种方式的多么? | BOOT0 | BOOT1 | 启动方式 | 说明 | | ----- | ----- | ------------ | -------------------------- | | 0 | × | 主闪存存储器 | 主闪存存储器被选为启动区域 | | 1 | 0 | 系统存储器 | 系统存储器被选为启动区域 | | 1 | 1 | 内置SRAM | 内置SRAM被选为启动区域 | 有了上面的了解,再来看一下ISP、ICP和IAP ## ISP(串口烧录) 特点: - **BOOT0 = 1**,BOOT1 = 0 - 启动地址:**0x1FFF0000** - 使用串口下载程序 - 系统存储器(System memory)启动方式运行内置的Bootloader,将程序写入主存储区 - 重启后,需要再将BOOT0拉低,从主存储区启动程序 下图是ISP方式的烧录,使用FlyMcu这个软件,通过串口给STM32烧录程序 ![](https://cf02.ickimg.com/bbsimages/202104/0a40ea4457a3115cf924d77fbab1a03d.png) ## ICP(JTAG口烧录) 特点: - **BOOT0 = 0**,BOOT1 = x - 启动地址:**0x08000000** - 使用JTAG或者SWD模式下载程序 - 主闪存存储器(Flash memory)启动方式,将程序在主存储区写入 - 重启后也直接从这启动程序 下图是ICP方式的烧录,使用JFlash软件或KEIL,通过J-Link给STM32烧录程序 ![](https://cf02.ickimg.com/bbsimages/202104/9b89512559bcd52f3acc4385e364a879.png) KEIL软件的默认下载地址,就是从0x0800 0000 开始的。 ![](https://cf02.ickimg.com/bbsimages/202104/60ec4d939ae6157f11a3e4806c2f203d.png) ## IAP IAP的原理与上面两种有较大区别,这种方式将主存储区又分成了两个区域(根据实际需要由开发者自行分配),0800 0000起始处的这部分,存储一个开发者自己设计的Bootloader程序,另一部分存储真正需要运行的APP程序。 单片机的Bootloader程序,其主要作用就是给单片机升级。在单片机启动时,首先从Bootloader程序启动,一般情况不需要升级,就会立即从Bootloader程序跳转到存储区另一部分的APP程序开始运行。 假如Bootloader程序时,需要进行升级(比如APP程序运行时,接收到升级指令,可以在flash中的特定位置设置一个标志,然后触发重启,重启后进入Bootloader程序,Bootloader程序根据标志位就能判断是否需要升级),则会通过某种方式(比如通过WIFI接收升级包,或借助另一块单片机接收升级包,Bootloader再通过串口或SPI等方式从另一块单片机获取升级包数据)先将接收到的程序写入存储区中存储APP程序的那个位置,写入完成后再跳转到该位置,即实现了程序的升级 ![](https://cf02.ickimg.com/bbsimages/202104/88a62367b05f2f0960ccd38f427697d3.png) wan
原创作品,未经权利人授权禁止转载。详情见
转载须知
。
举报文章
点赞
(
1
)
码农爱学习
关注
评论
(0)
登录后可评论,请
登录
或
注册
相关文章推荐
MK-米客方德推出工业级存储卡
Beetle ESP32 C3 蓝牙数据收发
Beetle ESP32 C3 wifi联网获取实时天气信息
开箱测评Beetle ESP32-C3 (RISC-V芯片)模块
正点原子数控电源DP100测评
DP100试用评测-----开箱+初体验
Beetle ESP32 C3环境搭建
【花雕体验】16 使用Beetle ESP32 C3控制8X32位WS2812硬屏之二
X
你的打赏是对原创作者最大的认可
请选择打赏IC币的数量,一经提交无法退回 !
100IC币
500IC币
1000IC币
自定义
IC币
确定
X
提交成功 ! 谢谢您的支持
返回
我要举报该内容理由
×
广告及垃圾信息
抄袭或未经授权
其它举报理由
请输入您举报的理由(50字以内)
取消
提交