(本文为转载,感谢原文作者)
众所周知,MCU都会有调试,烧录,下载的工具,比如JLINK,STLINK,NULINK,等很多,不同厂家,不同品牌几乎都会有他们自己烧录,下载的方式,那么今天我给大家讲讲新唐的烧录方式:
在讲新唐单片机的烧录方式之前,有必要先讲讲ICP,IAP,ISP的关系。这是MCU通用的概念。
- ISP:In System Programing 在系统编程
- IAP:In applicating Programing 在应用编程
- ICP:In Circuit Programing 在电路编程
区别:
- ISP是把房子拆了再重造一间,那么在造好之前当然是不能住人的啦!
- IAP是在造好的房子里边进行一些装修,装修的时候人还住在里面!
- ICP是在电路编程,是LPC芯片的编程方式,相当于ATMEL的ISP,而LPC的ISP就相当于ATMEL的IAP了。
ISP是指可以在板级上进行编程,而不用把芯片拆下来放到烧写器中,即不脱离系统,所以称作“在系统编程”,它是对整个程序的擦除和写入,通过单片机专用的串行编程接口对单片机内部的Flash存储器进行编程。即使芯片焊接在电路板上,只要留出和上位机接口的串行口就能进行烧写。
IAP同样是在板级上进行编程,MCU获取新代码并对程序的某部分重新编程,即可用程序来改变程序,修改程序的一部分达到升级、消除bug的目的,而不影响系统的其它部分,烧写过程中程序可以继续运行,另外接口程序是自已写的,这样可以进行远程升级而不影响应用。IAP的实现更加灵活,通常可利用单片机的串行口接到计算机的RS232口,通过专门设计的固件程序来编程内部存储器。
ISP、IAP、ICP与传统烧写方式的区别
- 在开发阶段
改code时, 不再需要将MCU从板子上拔起来, 拿到烧录器上烧, 然后再装回去. 可以直接利用ISP/ICP Programmer做板上烧录, 为开发者提供了极大的便利性. - 在量产阶段
客户可以采用”先焊到板子上再烧code”的方式, 将烧code的动作安排在生产线的某一站.
那么传统的方式 (先将code烧好再焊到板子上)有什么缺点?
传统的方式是这样的: 拆封–>从tray盘取出chip–>烧录–>把chip放回tray盘.
这样的流程比起上面建议的方式: 增加了烧录时间, 容易造成QFP包装的chip弯脚, 或忘了烧code即放回tray盘. - 在成品阶段
已组装好的成品若要改code, 可以透过预留的接口, 利用ISP或ICP, 更新MCU, 不需要拆机.
什么是 IAP (In-Application Programming)?
IAP指的是, MCU在运行的状态下, 利用ISP的机制, 不透过外接工具 (例如: ISP Programmer) 的帮忙, 去更新APROM, DataFlash 或 CONFIG. 要实现这种功能,
系统必须有取得更新数据的能力, 例如: 处于某一种联机的状态.
(注: 有时候, ISP/IAP的分别并不是那么清楚!)
ISP(In-System Programming)
在系统可编程,指电路板上的空白器件可以编程写入最终用户代码,而不需要从电路板上取下器件,已经编程的器件也可以用ISP方式擦除或再编程。ISP技术是未来发展方向。
ISP的工作原理
ISP 的实现相对要简单一些,一般通用做法是内部的存储器可以由上位机的软件通过串口来进行改写。对于单片机来讲可以通过SPI或其它的串行接口接收上位机传来的数据并写入存储器中。所以即使我们将芯片焊接在电路板上,只要留出和上位机接口的这个串口,就可以实现芯片内部存储器的改写,而无须再取下芯片。
这里博主补充一句,其实很多人看到ISP下载就想到串口下载。其实ISP下载也可以用I2C,SPI,CAN等通信协议,甚至你自己定义一个通信协议也没问题,完全取决于ISP接收端的程序怎么写。只是串口通信比较简单,这种ISP相对常见而已
ISP的优点
ISP技术的优势是不需要编程器就可以进行单片机的实验和开发,单片机芯片可以直接焊接到电路板上,调试结束即成成品,免去了调试时由于频繁地插入取出芯片对芯片和电路板带来的不便。
ICP
ICP是一种串行编程方式,其通过一根时钟线和一根数据线串行传输编程指令及数据。
ICP的特点:
- 在产品发货前,可以随时装载最新版软件程序。
- 在开发过程中,不需将芯片从系统板上取下,即可实现重新编程。
- 不占用程序存储空间(ISP要占用一定空间驻留ISP服务程序)。
- 不受串口的影响。
ICP的应用
利用ICP的功能,实现在电路编程,可以提高电子产品的功能,甚至改变电子产业的科技。
IAP
In Application Programming的首字母缩写,IAP是用户自己的程序在运行过程中对User Flash的部分区域进行烧写,目的是为了在产品发布后可以方便地通过预留的通信口对产品中的固件程序进行更新升级。
通常在用户需要实现IAP功能时,即用户程序运行中作自身的更新操作,需要在设计固件程序时编写两个项目代码,第一个项目程序不执行正常的功能操作,而只是通过某种通信管道(如USB、USART)接收程序或数据,执行对第二部分代码的更新;第二个项目代码才是真正的功能代码。这两部分项目代码都同时烧录在User Flash中,当芯片上电后,首先是第一个项目代码开始运行,它作如下操作:
- 检查是否需要对第二部分代码进行更新
- 如果不需要更新则转到4)
- 执行更新操作
- 跳转到第二部分代码执行
第一部分代码必须通过其它手段,如JTAG或ISP烧入;第二部分代码可以使用第一部分代码IAP功能烧入,也可以和第一部分代码一道烧入,以后需要程序更新是再通过第一部分IAP代码更新。
对于STM32来说,因为它的中断向量表位于程序存储器的最低地址区,为了使第一部分代码能够正确地响应中断,通常会安排第一部分代码处于Flash的开始区域,而第二部分代码紧随其后。
在第二部分代码开始执行时,首先需要把CPU的中断向量表映像到自己的向量表,然后再执行其他的操作。
如果IAP程序被破坏,产品必须返厂才能重新烧写程序,这是很麻烦并且非常耗费时间和金钱的。针对这样的需求,STM32在对Flash区域实行读保护的同时,自动地对用户Flash区的开始4页设置为写保护,这样可以有效地保证IAP程序(第一部分代码)区域不会被意外地破坏。
好回到正题,不过我要先问一个问题,你知道什么是SWD接口么?
你可能知道JLINK的JTAG接口,先来一张图,看看它们之间的对应关系:
关于STLINK的4SWIM四线接口我觉得有必要说明一下:
下面是由于STM8的SWIM接口只需要4根连接线,所以ST-LINK/V2连接至STM8目标板时需要注意连接位置。
关于SWD,SWIM和JTAG之间的区别与联系,弄清楚明白剩下的就好理解了。今天先到这里,后续我会补上,上一篇是关于N76E003的学习的第一篇,我会继续完善的。
本文参考链接:http://blog.csdn.net/u014124220/article/details/50829713
http://blog.csdn.net/lj9010/article/details/51861605