普通单片机如何实现远程程序升级功能?

cathy的头像

以前的芯片编程,通常是将芯片放在专用编程工具上进行,由于大部分都是插件封装,也还是比较方便的,但随着芯片集成度越来越高,芯片的体积也越来越小,贴片的小封装就不方便放在编程工具上,所以芯片直接焊在电路板上编程,在线编程功能随即流行起来。在线编程目前有ICP、ISP、IAP方式,各方式都是实现在线编程,但在本质上有区别,很多人对这几种方式也难以区分。

ICP : In Circuit Programing,在电路编程,专用编程器操作,外围电路不能上电,因为需要控制上电电压及顺序节奏来进入编程模式,编程对整个ROM区操作,这是常用的在线编程功能,逻辑过程为:PC接口》编程器》芯片存储器用户区。

“ICP方式"
ICP方式

ISP : In System Programing,在系统编程,单片机相当于固化Boot Loader,可以不使用专用编程器,编程也是针对整个ROM区操作,逻辑过程为:PC接口》芯片存储器用户区。

“ISP方式"
ISP方式

IAP : In applicating Programing,在应用编程,将单片机的存储区域分块,需要软件触发或硬件触发程序最终在哪一块运行,逻辑过程为:PC接口》芯片Boot Loader区》芯片存储器用户区

“
IAP方式

应用介绍

目前单片机基本上都支持ICP烧录,一般通过JTAG、I2C、单总线等接口方式在线刷新内部flash。比如:

1、中颖SinoWealth单片机,就是利用四线JTAG或单线SWE进行编程操作,编程时应用端不能上电,是典型的离线更新程序,并且是对芯片内部整片flash区编程操作。

“中颖单片机ICP烧录"
中颖单片机ICP烧录

2、晶宏STC单片机ISP功能,芯片内部集成了烧录功能,利用UART串口将数据下载给用户flash区,这种方式同样也是对芯片内部整片flash区编程操作。

“
STC单片机ISP烧录

3、SST89X52系列单片机,就是典型的IAP类型,内部flash分成几块,比如Block 0作为启动区,Block1作为用户区,单片机上电首先进入启动区,并判断进入Block 0运行还是跳入Block 1运行,这就需要一个软件或硬件触发,我们可以事先将Block 0编写一个烧录程序,进入Block 0运行时就可以对用户区进行程序更新,这就叫自编程,即区块0的程序改写区块1的程序。由于内部2个区块的flash相互独立,此时区块0对接电脑,就可以实现在线更新用户程序,若是在区块0写入无线对接程序,那么就能无线升级程序了。

“SST单片机IAP程序分块"
SST单片机IAP程序分块

综上几种在线烧录的方式,可以看到IAP的功能是最强大的,而且应用的灵活性很强,现在工程师写的软件或多或少都存在着BUG,产品售卖到用户手上不能升级程序,那是比较麻烦。智能化产品目前也都在这个方向上发展,一定要能实现无线在线更新程序,但是这一套系统成本较高,并且复杂,就像家庭里的普通家用电器,里面也就一个简单的单片机,成本控制得很低,难以实现这套功能。

比如烹饪器具,企业研究了一个新的菜谱,只要更改内部程序即可实现,若用户想使用就必须新换一台家电,给用户带来成本的压力,若是家电上带有无线升级程序的功能,就可以实时推送相关技术给用户,让用户享受到最新的科技,促进人类社会的进步。

普通单片机模拟IAP功能

难道普通的单片机就无法实现这个功能吗?经过我的分析并结合单片机目前的状况,普通单片机实现起来并不难。目前流行的单片机一般都是flash型,并带有自编程功能,即开放了指令,程序可以对内部扇区编程,这样做的目的是可以省去外部EEPROM,将需要掉电保存的数据存入内部flash,替代外部存储器。

“现代ABOV
现代ABOV MC96F6432单片机存储器

上图为现代MC96F6432单片机的flash存储器结构,内部32K划分为512个扇区,每个扇区64个字节,即总空间ROM=512*64Byte=32KByte,因为flash型存储器都是按扇区操作的,内部扇区的编程是可以用开放的指令进行改写,所以我们可以利用这个特性,自行将存储器进行划分,比如前16个扇区(0~0x03ff)作为Boot Loader,剩下的扇区作为用户程序区。Boot Loader用于扇区编程,进行改写用户程序区,同时通过UART接口与电脑对接,这样程序就变成了两块,Boot Loader区程序设计时在Keil开发环境里设置如下:

“Keil设置Boot区"
Keil设置Boot区

设置起始ROM存放为0x0100,因为C51系列单片机0~0xff是中断矢量入口区,不要去占用它,经过这样设置后,Keil编译器就会将C语言代码存放在0x100~0x3ff范围里,就可以放心地写Boot Loader代码了。其实这里面最关键的是中断入口区的编写,若是用汇编的话就会简单很多,而用C编写就比较麻烦一点。

完成Boot区的程序后,用户程序区还需要设置一下,前面已经将前16扇区占用了,用户程序区还得告诉Keil编译器跳过此程序段,用户程序的环境设置如下:

“Keil设置用户区"
Keil设置用户区

此设置的意思就是告诉编译器程序放在0x400~0x7fff区域,经过这样设置后编译出来的程序,就可以通过Boot Loader代码接收PC电脑端的数据,然后用扇区自编程写入到0x400~0x7fff区域。这里还有一个关键的问题,那就是芯片本身的flash是一整体,划分后中断区是共用的,这还得处理,其实也很简单,我们只需要将0~0xff区域的内容映射到用户扇区即可,此部分内容在PC端的上位机处理就行了。

总结

经过以上设计,Boot Loader就能改写用户flash区,最简单的应用就是不借助编程器就可实现程序烧录,电脑通过串口将数据直接发给Boot区,Boot区再利用自编程刷新flash,现在PC已经很少有串口,一般需要一片USB转串口的芯片即可。当然,只要在Boot区写入无线模块的通信程序,那么也就实现无线在线更新用户程序了。是不是很简单?只要是开放flash操作指令的单片机,用此原理都可以实现在线更新程序。

“自编程设计架构"
自编程设计架构

版权声明:本文为CSDN博主「zxc5672123」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/zxc5672123/article/details/105863636