烧录程序一般是指把代码烧录到flash中。那如何把代码烧录到flash中呢?配置flash介面寄存器。

每一块flash都有flash配置寄存器,通过操作这些flash配置寄存器就可以对flash进行解锁,擦除,编程等操作。

flash演算法或者编程演算法,就是实现定义好的函数,包括:初始化,编程,擦除等。来供程序使用

不同的FLASH的介面寄存器的操作方式不同,具体表现在:寄存器的地址不同,寄存器的关键位置的含义不同,所以实现定义好的函数也就会不一样。以上应该能给你解释为什么不同型号的单片机需要完全不同的烧录程序。

单片机的烧录原理:单片机都有外设:比如GPIO,SPI,UART。每个外设都有对应的操作外设的寄存器。姑且称之为外设寄存器。CPU也有寄存器:R1-R15等。这些叫CPU寄存器。同时单片机还有一类寄存器 叫调试寄存器。一般来说初学者只会去操作外设寄存器。

烧录的原理基本都是这样的:首先配置调试寄存器使得CPU的停止运行。然后去修改内存的值,然后去修改PC寄存器的值,然后再次修改调试寄存器的值使得CPU运行,这样单片机就会从PC寄存器的值处开始运行。这样我们修改了的内存就会被执行了。

所以重点就是修改的内存的值:应该修改成什么样?首先先把flash演算法传到内存中,然后在把待烧录的代码传到内存中(如果内存足够大的话可以一次性全传,否则可以分次传)

最后:配置调试寄存器和CPU寄存器都是通过DAP实现的,也就是JTAG或者SWD。通过控制DP和AP寄存器可以读写所有的:CPU寄存器;调试寄存器;内存;

控制DP和AP寄存器的方法:参考官方文档arm-debug-interface-V5


烧录的最终目的是把程序写入flash中,以方便mcu可以将其读出来运行。

程序编译后生成的文件,可以理解为二进位文件。

所以,

单片机为了达到将二进位文件放入flash中,可以用多种方式完成。

在单片机刚买来的时候,虽然没有用户程序,但其本身已有一个程序,这个程序可以是固定的电路,也可以是存放在某个区,可以用来执行程序下载的指令。

大部分看起来平常的东西,内部都有程序的。比如U盘,其内部对于程序的执行效率很高。

单片机会根据实际情况判断是下载程序,还是运行用户程序。

根据情况不同,下载的方式可以是SPI,UART,JTAG等。

有的晶元除了内部的FLASH外,也支持外部flash,这时程序需要分散载入。通过演算法将程序写入外部的flash中。

可以跑linux的mcu基本都挂外部,一般使用norflash和nandflash。这类晶元可能会使用sdio介面下载bootloader,有了bootloader后,可以直接使用网路,通过ftp,tftp等方式,把用户程序在外到flash中。

终上,不同下载方式、下载工具和下载演算法,只是将二进位写入flash中的不同实现途径。

以上是个人理解,如有错误,欢迎指正。


其他单片机不熟悉,聊聊cortex-m吧,如有错误,欢迎讨论和指正。

用jtag烧录时的核心在于烧写演算法的实现,实际上也就是对晶元的flash控制寄存器进行读写操作,由于不同家的flash设计不尽相同,所以导致烧写演算法各不相同(除此之外还有汇流排地址分配之类也不同),不过本质都是通过内核运行指令对flash进行操作,具体而言就是下载时烧录器会先将烧写演算法拷贝到sram中进行运行,然后烧写演算法会将从烧录器那接收到的代码通过操作flash控制寄存器放入到flash存储区块里,当然这其中肯定会有和晶元调试相关的外设参与工具,具体是怎样的我也不清楚。

至于isp,那就是一个固化在晶元内的烧写演算法代码,比如如果是串口isp的话,下载程序的时候进入到isp后就通过串口和上位机进行通信来接收校验代码数据。另外还有iap(或者说bootloader),这个和isp是类似的,不过并不是固化在晶元中的,并且iap的实现方法很多,比如串口,iic,乙太网,can等等都可以实现,而isp则多为串口。无论是isp和iap,本质也是运行代码指令进行flash操作,所以空片是无法进行下载的。

jtag烧录和isp下载的最大区别在于,jtag需要借助专门的晶元内硬体资源,相当于是晶元层级的实现,而无需代码实现,只需要在下载的时候烧录程序的时候导入一个小的下载演算法到ram中运行。而isp和iap下载则需要程序代码的支持,isp是原厂固化的代码,而iap是用户实现的代码。


一般是单片机生产商有自己的烧录工具

别的没使用过,以STC宏晶为例

用USB-TTL线烧录时,单片机断电重启,会先执行bootloader,此时就会检测串口是否存在下载数据流,如果有,则进入烧录模式,如果没有则开始执行用户程序

STC的手册附录中还有如何使用第三方软体烧录的方法,及如何实现不断电更新程序的方法(使用IAP功能,未开放bootloader)


不同的晶元主要两点差异:Flash中存储空间划分不同,烧录协议不同。其实只要你对自己常用的晶元足够了解,完全可以自己写一个统一的烧录工具。


谢邀,现在单片机烧录主要分为两种形式:JTAG和串口。

首先单片机内部支持相关的flash的写操作,其次,jtag原理是注入一段程序,然后通过jtag介面向该程序注入要写入的程序,由该程序负责flash的写操作。

串口下载则是在单片机启动时,利用串口和计算机的烧写程序通信,接收程序数据并写入flash。

因为各家的烧录规范都不同,一部分原因是单片机本身的硬体架构不同,另一部分原因是各家的单片机支持通过烧录的方式进行一些启动选项的定制,所以烧录工具也不同。


推荐阅读:
相关文章