[IT技术] 单片机为什么能直接烧录程序?

[复制链接]
大落 发表于 2023-10-27 05:16:03|来自:北京朝阳 | 显示全部楼层 |阅读模式
通过 STC-ISP 什么的。。
烧录不是通过串口吗,那么一开始单片机内部是空的,没有编写接收的指令,没有设置通讯协议,那么应该永远都通讯不了吧?
全部回复5 显示全部楼层
junmeng 发表于 2023-10-27 05:16:38|来自:北京朝阳 | 显示全部楼层
曾经在芯片原厂干过一段时间,正好是给IC做bootloader,我刚接触MCU的时候也有过类似的问题。到后面真正涉及到这一部分的时候,才发现原理是如此简单。
在设计芯片的时候,关于烧录的环节是一个不得不考虑的问题。
我们首先排除掉,由外部直接硬件操控FLASH的方案,这个方案有很多缺点。
1、每个IC使用的FLASH型号是各不相同的,每种型号的FLASH的烧录命令和流程都有差别,这会导致烧录器需要把所有的FLASH控制方式都内置,但是万一下次换了一个最新型号的FLASH呢?因此这种方式通用性非常低。
2、有些IC未必使用FLASH,有可能会采用OTP(一次性编程),OTP一般是由芯片自己的内部寄存器来控制,直接写FLASH的烧录器在这根本就没办法用了
那现在换一个思路,让芯片自己控制自己的内部存储器,我用通信的方式把固件发给芯片,由它自己来完成这个过程呢?
很好,现在我们面临的问题变成了如何将这段烧录程序导入到芯片中运行这个问题了。
假如,芯片设计的时候就是一个空片。那如何将程序下载进芯片中运行呢?
别怕,你用过JTAG吗?JTAG在调试的时候,是不是可以随便修改RAM,随便设置PC指针?
而且几乎所有的芯片硬件都是支持JTAG功能的吧?那这个问题就有解了。
我可以用JTAG将一段程序写入到RAM中,设置PC指针到程序的起始地址。这个程序是专门用来烧录FLASH和OTP的程序,我可以这样做:
1、将这个程序导入到RAM中
2、将固件的一部分内容导入到RAM的某个固定地址
3、设置PC到这个程序的起始地址,同时在程序结束的位置设置一个断点。
4、启动这个烧录程序,等待断点触发,往复2、3、4即可。
这个就是Keil中的烧录算法的实现原理。而算法文件就是这个IC对应的烧录程序。
那现在,完全搞定烧录的问题吗? 不、还只完成了一半。这种方式还有好几个缺点:
1、烧录器硬件成本比较高
2、JTAG烧录器的控制复杂度和开发难度很高
3、对于安全程度非常高的芯片,JTAG很不安全
因此,我们能不能默认就将这段程序在芯片出厂的时候烧录或者固化到芯片上呢?同时采用成本更低和通用性更高的串口通信。
所以,这段程序怎么放,有很多方案:
1、直接芯片投片的时候,由数字设计人员将固件硬编码到晶圆上,芯片生产出来的时候,都会携带这个程序。这个的缺点就是,这段固件不可更改,固化前会经过大量的测试。
2、对于有OTP的芯片的话,会在芯片出厂测试时将这个程序烧录到OTP中,烧录方式用的就是JTAG
芯片的烧录方案,基本上就是这些了,对于那些你接触到的各种千奇百怪的烧录工具,其实也就是厂商自己定的通信协议的不同导致的。
dzbear 发表于 2023-10-27 05:16:49|来自:北京朝阳 | 显示全部楼层
分几种情况吧,有些可以通过isp协议之类操作flash读写寄存器来实现烧写,有些通过内部固化的一小段程序来和上位机通讯,或者两者都有。
如果是支持ram执行的单片机,比如stm32,则两种方式都可以,但是前者的方式显然慢得多。所以jlink,stlink之类都是先写一小段程序到ram,再执行这段程序和上位机通讯,这样就快多了。此外stm32还有厂家固化的串口bootloader,详见应用笔记an2606。
再就是自己写一个bootloader,用着就舒服多了。安利一下我的:
https://github.com/tomzbj/zboot
54sh54sh 发表于 2023-10-27 05:16:59|来自:北京朝阳 | 显示全部楼层
这是一个特棒的问题,如果题主还在学生阶段,且有心研究下去,那将进入到一个全新的世界。
先回答问题,其实你困惑的根源来自于:
所有单片机行为都是被程序控制的,即好像总得有东西在“跑着”,然后才能可观可控。但实际上,不是这样的。
单片机、微处理器、CPU都属于数字电路,“能够执行程序(代码)并完成指定功能”只是processor这部分数字电路的基本功能。烧写程序,则是另一部分数字电路完成的功能。如果你非要有“鸡与蛋”的因果关系,那么“跑程序”是建立在数字电路基础上的高级功能。
=====
我建议哦,从“单片机是怎么启动的”这个问题开始去搜索答案,不必直接去读计算机结构这类书籍。从一个问题,发散到多个问题,保持好奇心,你会逐渐认识这个全新领域的。加油。

生的安格斯牛排:IC快问快答#1 - 如何硬件实现 y=ax+b
拒绝泳游的魚 发表于 2023-10-27 05:17:24|来自:北京朝阳 | 显示全部楼层
我刚开始学习单片机的时候也有和题主类似的困惑。当时是在大二,刚申请了个淘宝账号不久,刚看了下我的淘宝已购物品,第五件东西买的就是51单片机开发板,前几件是充话费,当时卖开发板的店铺也已经不在了。
当时寒假带着开发板经历22个小时的硬座,回到家点完LED灯后,先是嘴角微微一笑,然后各种困惑接踵而来,题主的问题就是其中之一。
单片机是怎么烧录程序的?单片机都没有启动,怎么就能和下载器通信了?
要回答这个问题先看一个数字电路,D触发器,如下图:



D触发器,图片来自于参考 [1]

D触发器功能就是只在Clk信号的上升沿这个时间点把数据Data传递到Q,在其它任何时刻保持Q不变。这不就是一个很简易的,只有一位的存储器吗。从上图中D触发器的电路原理图里可以看到,D触发器就是由一堆与、非门组成的电路,控制存储器并不需要单片机CPU的参与,只需要一个Clk就可以了。
上图中的D触发器毕竟太简单,而且数据掉电就会丢失,难免有一些忽悠人的感觉,那我们再看下复杂一点的flash存储器是如何被读写的,这也是单片机里面常用的存储介质。



flash存储单元,图片来自参考文献 [2]

如上图是flash里面的一个存储单元,乍一看好像是MOS管,但仔细一看却是多了一个Float Gate。这个float gate其实是用氧化硅隔离了的。大概的工作方式是通过float gate里面的电荷影响开启电压,当float gate里面有电子时,开启电压会变高,可以理解是因为gate上的电场线在float gate上的电子上终结了,这时候MOS管是不导通的,被认为存储的是1。反之,当float gate上没有电子时,MOS管的开启电压就比较低,被认为存储的是0。所以控制存储器里存储的内容其实是一个物理问题,即如何控制float gate冲放电。感兴趣的可以参考我给的参考链接[2]继续深究,我在这就不深究了,再深究就要露馅了,哈哈。
上面说的是一个flash单元,也就是只能存储1bit,那512Kbit的flash,要怎么读写。下图是一个512kbit  flash芯片的结构图,可以简单的不假思索的认为这块芯片是由一堆上面的单元再加上一些数字电路,比如串口控制器所构成的,对这个flash的读写同样也不需要单片机CPU的参与,只需要遵循serial interface的时序就可以了。所以在烧写单片机的flash的时候是不需要CPU的参与的,只需要遵循flash的接口时序就可以了。



来自SST25VF512A的Datasheet

有疑惑的留言再讨论吧。
参考:
[1]https://www.electronics-tutorials.ws/sequential/seq_4.html
[2]https://en.wikipedia.org/wiki/Flash_memory
baicai 发表于 2023-10-27 05:18:08|来自:北京朝阳 | 显示全部楼层
最近在做ota ,也就是over the air的简称(空中升级),现在满脑子都是固件升级这些。。单片机需要bootloader用来更新固件,这个bootloader是独立于固件的代码段,要不然就是自己改变了自己,这是一个矛盾的哲学概念。只有非A才能改变A!

所以一般的单片机bootloader都是厂家固定在芯片里的,也不允许用户去改变,stm32与jlink通讯这一段就很难改变,51也是,用户很难去编写bootloader。

但是有高级的单片机可以,他把程序段放到了flash里面,在bootloader里面可以初始化外部flash设备,读取外部flash数据,写入自己的片上flash。程序正常运行起来后,可以通过无线方式更新flash数据到外部flash中。也就是外部flash做了链接主程序和bootloader中介作用!
很有意思哦

快速回帖

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则