下面的内容从网上资料整合的,先前一直对ISP、IAP、stm32的BOOT模式、JTAG的概念不清晰,现在清楚一点了,整理下来,希望对大家有些帮助。有问题欢迎指出。ps:这些内容是针对stm32来说的。
单片机在线编程
在线编程目前有两种方式:在系统编程(ISP),在应用编程(IAP)
在系统编程(ISP)
系统一般指电路系统。ISP一般是通过单片机专用的编程接口(一般是串口)对单片机内部的Flash存储器进行编程,ISP的实现一般需要很少的外部电路辅助实现。所以即使我们将芯片焊接在电路板上,只要留出和上位机接口的这个串口,就可以实现芯片内部存储器的改写,而无须再取下芯片。
在应用编程(IAP)
IAP技术是从结构上将Flash存储器映射为两个存储体,当运行一个存储体上的用户程序(boot)时,可对另一个存储体重新编程,之后将控制从一个存储体转向另一个。IAP的实现更加灵活,通过专门设计的固件程序来编程内部存储器,通常可利用单片机的串行口接到计算机的RS232口,也可以通过现有的INTERNET或其它通讯方式很方便地实现远程升级和维护。
程序需要由两部分组成:1.bootloader;2.应用程序
bootloader:负责更新程序的拷贝和跳转到应用程序;
应用程序:运行程序要实现的功能和更新程序的下载、保存。
第一部分代码必须通过其它手段,如JTAG或ISP烧入;第二部分代码可以使用第一部分代码IAP功能烧入,也可以和第一部分代码一道烧入,以后需要程序更新是再通过第一部分IAP代码更新。
首先,开机时运行bootloader,bootloader检测片内Flash(或者片外Flash或者FRAM)“程序更新标志”是否置位,如果没有,则直接跳转到应用程序。应用程序运行时检测无线模块收到的数据命令,如果有updata命令,则接收程序,并保存到片内Flash的靠后的代码段(或者片外Flash),接收保存完数据后,片内Flash(或者片外Flash或者FRAM)“程序更新标志”置位,然后重启MCU。MCU重新运行bootloader,此时bootloader检测到有程序更新标志,则将片内Flash的靠后的代码段(或者片外Flash)的更新代码拷贝回应用程序代码段,并复位更新程序标志,然后跳转到应用程序,至此程序更新完毕。
ISP与JTAG
在stm32里,所说的 ISP一般指的是通过SPI接口进行的在系统编程(ISP),此时stm32的BOOT模式设置为系统存储器启动(BOOT0 = 1,BOOT1 = 0),表示启动内部的ISP程序。
JTAG编程,也是在系统编程(ISP)的一种。JTAG则是通过JTAG接口进行的在系统编程(ISP)。JTAG除了可以烧写程序以外,还可以进行调试。
ISP是一种编程方式,JTAG、串口(SPI接口)是一种编程接口。
BOOT模式与JTAG
BOOT模式说的是系统上电启动后,程序从哪里加载,运行。在启动前设置好,启动时起作用。BOOT模式有三种,从系统存储器启动,从Flash启动,从Ram启动。
JTAG编程,JTAG口是单片机的内核,通过它可以控制CPU,来达到烧写程序,调试的功能。它是在系统启动后起作用,与BOOT模式无关。
但如果你用JTAG下载程序到Flash里,想要运行你的程序,你的BOOT模式必须设置为Flash启动。 |