单片机程序远程升级的bob综合体育官方入口设计
  • 时间:2022-05-13
  • 点击率:

介绍

单片机应用广泛。在某些情况下,升级单片机内部程序是不可避免的,但往往需要收回单片机的产品,这给一些远程设备的程序升级带来了很大的不便。但有些远程设备有自己的远程通信方式:比如有些远程数据传输模块为了上报数据,总是有通信接口,比如422、485甚至GPRS或LAN接口;或者一些车载定位设备,为了和监控中心通信,会有GSM,CDMA或者GPRS的通信方式。在这种情况下,可以利用现有的通讯方式升级其内部单片机程序,而无需收回产品。

本文的主要内容是研究单片机程序的远程升级方法。

近年来,凌阳科技的单片机,尤其是16位单片机越来越普及,应用领域越来越广泛。本文以凌阳科技常见的16位单片机SPCE061A为例,介绍单片机程序远程升级的方法。

SPCE061A内嵌有一个32K字的flash,可以作为程序在空之间存储数据,并且具有自行读写任意FLASH地址的能力。利用这一功能,提出了一种通过在单片机中驻留BootLoader程序来实现单片机程序远程升级的方法。

远程升级的实现需要单片机自身的响应和远程服务器提供升级所需的代码。下面将分别介绍这两个方面。

2.单片机程序

2.1工作原理

为了使单片机能够响应远程升级,这里采用了在单片机中预置Bootloader程序的方法。

Boot是一个引导程序,驻留在单片机中。单片机上电/复位时,在用户程序之前运行。它运行后,首先确定当前是否需要进入升级状态。如果不需要升级,直接在Flash中运行原程序即可;如果需要升级,先擦除旧程序,然后从串口接收用户程序,写入Flash。

在单片机正常运行过程中,当接收到预设的升级指令时,当前任务结束,修改升级标志位,然后BootLoader程序自动复位;当BootLoader程序检查升级标志时,它可以被升级。单片机正常启动复位时,不会因为标志位的作用而受到影响。

loader程序可以从多种途径获取数据,包括485、422、GPRS、CDMA、网口、串口等。虽然各种采集方式不同,但BootLoader的设计大致相同,GPRS、GSM、CMDA等通信方式都使用串口;45和422等通信方式类似于串口。为了节省篇幅,本文以串口为例进行介绍。

在BootLoader的设计过程中,需要注意以下几个问题:第一,简化的问题。为了让用户程序获得最大的程序空,BootLoader程序需要尽可能的短;另一个问题是中断:BootLoader尽量不要使用中断,避免对用户程序造成影响;还有标志位的问题,它应该不会受到复位的影响。在本设计中,选择单芯片FLASH中的一个字节。

2.2设计理念

单片机系统上有一个半串口,通过232芯片与PC机的串口相连。当微控制器上电或复位时,BootLoader开始运行,通过访问升级标志位来确定当前是否需要进入升级状态。如果没有升级标志,直接在Flash中运行原程序;另一方面,它转到升级子程序,将从串口收到的程序代码写入Flash。图1显示了BootLoader主程序的流程。

在升级子程序中,为了保证接收到的数据正确,避免将错误的程序写入芯片,本文提出的方法采用固定的数据格式,采用重复确认的方法。图2显示了升级子例程的流程。在指令格式的选择上,本文采用了Motor S37格式,并在其基础上增加了一个确认机制。具体格式将在PC程序部分详细介绍。

2.3闪存擦除方法

SPCE061A是一款MTP(多程序设计)芯片,采用闪存代替掩模ROM。它具有32K字(32K * 16位)的闪存容量。用户可以使用闪存存储用户程序。为了安全起见,整个擦除功能不对用户开放。

此外,为了确保程序的正确编写,用户必须在编程前擦除页面内容。页面大小为0x100。第一页的地址范围是0x8000~0x80FF,最后一页的地址范围是0xFF00~0xFFFF。0xFC00~0xFFFF范围内的地址是系统保留的,用户最好不要使用该范围内的地址。32K字嵌入式闪存分为128页(每页存储容量为256字),在CPU正常运行状态下均可由程序擦除或写入。

闪存芯片的编程操作是自动字节编程,可以按顺序写入,也可以在指定地址写入。编程时注意芯片的编程时间参数。Flash程序空是0x8000—0xFFFF,Flash命令用户界面的地址是0x7555。第一页范围是[0x8000—0x80FF],最后一页是[0xFF00— 0xFFFF]。1.擦除一个页面的过程如下:首先发送0xAAAA到命令用户接口地址0x7555,然后发送0x5511到命令用户接口地址0x7555,再发送任意数到要擦除的页面的地址。擦除操作可以在20ms左右完成,然后可以进行其他操作。例如,擦除第6页[0x8500—0x85FF]的过程如下:

(1)0x 7550 xaaaaa(2)0x 75550 x511(3)0x 85 xx xxxx(其中x为任意值)2。写一个字的过程是:先发送0xaaaa到命令用户接口地址0x7555,然后发送0x5533到命令用户接口地址0x7555,再发送数据到要写的地址,大约40us。例如,将0xffff写入0x8000单元的过程如下:(1)0x 75550 x AAAA(2)0x 7550 x533(3)0x 80000 x fffff 3。写多个单词的过程是:

首先发送0xAAAA到命令用户接口地址0x7555,然后发送0x5544到命令用户接口地址0x7555,然后发送数据到要写入的前缀地址。完成一个单词的书写操作大约需要40us。然后发送0x5544到命令用户接口地址0x7555,发送数据到要写入的字的地址,等待40us,循环操作完成多字写入。

3.PC程序

为了正确下载单片机程序,需要配合PC程序提供升级程序的代码。PC机主要负责解释和发送电机S37格式的程序代码,并与单片机完成代码传输的反复确认,保证程序的正确下载。

3.1电机S37格式

凌阳单片机的程序代码可以编译成电机S37格式和TSK格式。本文选用的代码格式是电机S37格式。为了解释电机S37的代码格式,我们应该先看看它的格式,如表1所示。

领域

内容详细介绍

留档活字

表示文档记录的开始,记录类型有以下规定:

ASCII码S3-数据记录;ASCII S7-记录终止符。

记录长度

记录长度包括地址、数据、检查和字段。8位记录长度值被转换成两个ASCII字符代码,最高位在前。

装载地址

这是由二进制地址码转换而来的8个ASCII字符码,文件记录就是在这个地址加载的。顺序是:

高位字的高字节中的高位,高位字的高字节中的低位,

高位字的低字节中的高位,高位字的低字节中的低位,

低位字的高字节中的高位,低位字的高字节中的低位,

低位字的低位字节中的高位,低位字的低位字节中的低位,

该字段给出记录末尾的记录起始地址,或8个连续零的ASCII字符代码。

数据

文件中的实际数据也转换成每两个ASCII字符代码字节,最高位优先。当记录终止符出现时,意味着数据字节记录的结束。

和检查

它是关于记录长度、加载地址和数据字段的总和;它是由一个8位二进制数以1的补码形式转换而来的两个ASCII字符码,最高位也在首位。

表1 motors 37格式的代码文件格式

下面用一个电机S37格式的实际代码来详细解释一下电机S37格式。

s 31500010022237041941193227009 b 34000455 E1 BD 798

S30B0001FFFA3B803B800980FB

S307000100000000F7

S70500000000FA

这段代码是实际程序代码的一部分。前几行以S3开头,表示数据记录;最后一行以S7开头,表示结束。或者S3 S7的后两位是数据长度,都用十六进制表示,15表示十进制20,它的长度表示这一行8位数据的个数。最后8个ASCII码是装载地址。这里需要注意的是,凌阳SPCE061A是16位单片机,而S37文件中的地址是按8位计算的,所以地址要除以2才能算出实际地址。如第一行的00010022,它在单片机中的实际地址是0x8011。地址后面是数据,其数据表示也是用8位表示的,需要在单片机中转换成16位。以第一行为例。写入0x00010022的原始0x23和写入0x00010023的0x37应改为写入0x8011的0x3723。

3.2确认机制

为了进一步保证程序升级的可靠性,本文在Motor S37的基础上增加了一个确认机制。即MCU接收到数据后,将数据发回一次,然后等待PC确认;当PC机确认数据正确后,发送ACSII码S1作为ACK信号;否则,S2将作为DCK信号发送。确认机制牺牲了系统的效率,但提高了可靠性。本文建议在一些不良链路条件下增加确认机制。

3.3程序的偏移

这里需要注意的是,由于BootLoader代码占用了一定的程序空,真正的用户代码应该存储在启动代码之后,所以需要在编译程序的时候设置偏移量,让用户代码存储在BootLoader代码之后。在凌阳IDE184中,偏移量可以在Project->:Setting->;部分(如图3所示)。该图显示设置了256个字的偏移,即0x100。因为SPCE061A的program 空是从0x8000开始的,所以下图中代码段的起始地址是0x8100。

图3偏移设置

按照本文的实现方法,偏移地址设置为0x8500,也就是说BootLoader运行后会自动从0x8500开始代码。

4结束语

本文介绍的设计已经实现,测试结果良好。当选择一些不稳定的链路作为数据采集方式或者复位可能影响链路时,比如GPRS链路,为了进一步提高程序升级的可靠性,系统还可以扩展ram,在系统复位前将所有升级程序代码下载到RAM中,然后复位启动直接重写程序空。

本文的创新之处在于远程升级单片机系统内部程序的方法,可靠性高,易于实现。虽然以SPCE061A为例,但它可以广泛应用于各种带自擦除程序的单片机空。虽然本文以串口数据采集为例介绍了单片机程序远程升级的思路和实现方法,但是485、422等通信方式与串口类似,GPRS、GSM、CMDA等通信方式归根结底都是使用串口。因此,按照本文的设计理念,数据采集方式可以用GPRS或485甚至网卡等更复杂的传输手段代替。具有上述接口的MCU产品无需召回产品即可远程升级。具有一定的实用价值。

参考资料:

[1]罗亦菲。凌阳16位单片机应用基础[M].北京北京航空航天大学出版社2003 31-32。

[2]朱海军,景岚,陆军。基于MSC1210单片机的串行通信设计。微机计算信息。2004年第4期第48页


客服QQ: 点击这里
地址:台州市寨金路899号电子时代广场5116室 客服QQ:329435596
Copyright © 2022 bob综合体育官方入口 版权所有

08980-89895656

服务时间:7X10小时