单片机通过网口升级程序_网口转串口 单片机程序 - CSDN
  • 单片机程序远程升级的设计 2012-01-19 11:13:06 作者:周东辉 孙晓苗 李立 来源:微计算机信息 关键字:16位单片机;SPCE061A;BootLoader;远程升级;S37格式 1.引言 单片机的应用非常广泛,在某些情况下,...

    单片机程序远程升级的设计

    2012-01-19 11:13:06   作者:周东辉 孙晓苗 李立    来源:微计算机信息   

    关键字:16位单片机;SPCE061A;BootLoader;远程升级;S37格式

    1.引言

    单片机的应用非常广泛,在某些情况下,单片机内部程序的升级在所难免,但是往往需要对单片机产品进行收回才能实现,这样在一些远程设备的程序升级问题上就显得非常不方便。但是有些远程设备本身留有远程通讯的方式:例如某些远程数据传输模块,为了把数据上报总会留有通讯的接口,比如422、485甚至 GPRS或者局域网接口;又或者某些车载定位设备,为了和监控中心通讯会留有GSM、CDMA或者GPRS等通讯方式。在这种情况下就可以利用其现有的通讯方式对其内部单片机程序进行升级而不需要收回产品。

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

    由于近年来凌阳科技的单片机,尤其是16位单片机,得到了越来越多的推广,其应用领域越来越广泛。本文选取一种常见的凌阳科技的16位单片机SPCE061A为例,来介绍单片机程序远程升级的方法。

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

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

    2.单片机程序

    2.1 工作原理

    为了使单片机可以响应远程升级,这里采用了在单片机里预设Bootloader程序的方法。

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

    在单片机正常运行过程中,当收到预先设置的升级指令时,即结束当前任务,修改升级标志位,然后自动复位转入BootLoader程序;当BootLoader程序检验到升级标志位时即可进行升级。在单片机正常启动、复位时,由于有标志位的作用,不会受到影响。

    BootLoader程序可以从多种方式获取数据,包括485、422、GPRS、CDMA、网口、串口等等;虽然各种获取方式不同,但是在 BootLoader的设计上都大致相同,而且GPRS、GSM和CMDA等通讯方式都是使用串口;485、422等通讯方式与串口类似。为了节省篇幅,本文就以串口为例进行介绍。

    在BootLoader设计过程中,需要注意下面方面问题:一是精简问题,为了使得用户程序可以获得最大的程序空间,就需要BootLoader程序尽可能的简短;再一个是中断问题:BootLoader应尽量不使用中断,以避免对用户程序的影响;还有就是标志位的问题,标志位的应该不受复位的影响,在本设计中,选取了单片机FLASH中的一个字节。

    2.2设计思路

    单片机系统上留有一个半串口通过232芯片与PC机的串口相连接。当单片机上电或者复位后BootLoader开始运行,并通过访问升级标志位来确定定当前是否需要进入升级状态。如果没有升级标志,就直接运行Flash中原有的程序;反之,则转入升级子程序,把从串口接收到的程序代码写入Flash 中。图1表示了BootLoader主程序的流程。

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

    2.3 FLASH的擦写方法

    SPCE061A是一个用闪存替代掩膜ROM的MTP(多次编程)芯片,具有32K字(32K*16bit)闪存容量。用户可用闪存来存储用户程序。为了安全起见,不对用户开放整体擦除功能。

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

    闪速存储器芯片的编程操作是自动字节编程,既可以顺序写入,也可指定地址写入。编程操作时注意芯片的编程时间参数。Flash程序空间为 0x8000—0xFFFF,Flash命令用户接口地址为0x7555。第一页范围是[0x8000—0x80FF],最后一页[0xFF00— 0xFFFF]。1. 擦除一页流程是:先给命令用户接口地址0x7555里送0xAAAA,然后再给命令用户接口地址0x7555里送0x5511,再后给要擦除页地址送任意数,约20ms即可完成擦除操作,然后可以执行其它操作。例如擦除第6页[0x8500—0x85FF]流程如下:

    (1)0x7555 ß0xAAAA(2) 0x7555ß0x5511(3) 0x85XXß0xXXXX (其中X为任意值) 2. 写入一个字流程是:先给命令用户接口地址0x7555里送0xAAAA,然后再给命令用户接口地址0x7555里送0x5533,再后给要写入字地址送数据,约40us即可完成写入操作,然后可以执行其它操作。例如向0x8000单元写入0xffff流程如下:(1)0x7555ß0xAAAA (2) 0x7555ß0x5533 (3) 0x8000ß0xffff 3. 写多个字流程是:

    先给命令用户接口地址0x7555里送0xAAAA,然后再给命令用户接口地址0x7555里送0x5544,然后给要写入字首地址送数据,约40us即可完成1个字写入操作。再给命令用户接口地址0x7555里送0x5544,给要写入字地址送数据,等待40us即可,循环操作,即可完成多字的写入。

    3. PC机程序

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

    3.1 Motor S37 格式

    凌阳单片机的程序代码可以是被编译成Motor S37格式和TSK两种格式。本文中所选取的代码格式是Motor S37格式。为了解释Motor S37格式的代码,就要先来看看它的格式,见表1。

    字段

    内容详细介绍

    记录类型

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

    ASCII码 S3-数据记录;ASCII码 S7-记录结束符。

    记录长度

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

    装入地址

    这是由二进制地址码转换成的8个ASCII字符码,在此地址开始装入文件记录。其顺序依次为:

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

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

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

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

    本字段在记录结束时给出记录的起始地址,或者连续的8个0的ASCII字符码。

    数据

    文件中实际的数据也被转换为每每两个ASCII字符码字节,高位在前。在出现记录结束符时意味着数据字节记录结束。

    检验和

    它是关于记录长度、装入地址及数据字段的总和;是以1的补码形式由一个8位二进制数转换成的两个ASCII字符码,也是高位在前。

    表1  Motor S37 格式的代码文件格式

    下面我们以一段实际的Motor S37 格式的代码来具体说明Motor S37 格式。

    S31500010022237041941193227009B34000455E1BD798

    S30B0001FFFA3B803B800980FB

    S307000100000000F7

    S70500000000FA

    这段代码是从实际的程序代码中截取出来的几句。前面几行是以S3开头,表示数据记录;最后一行以S7开头,表示结尾。S3或者S7后面跟着的两位是数据长度,都是以16进制表示,15即表示十进制的20,其长度表示的是此行里8位数据的个数。后面的8个ASCII码是装入地址,这里要注意的是凌阳 SPCE061A是16位单片机,而S37文件中的地址是以8位来计算的,所以地址都要除2来计算实际地址。如第一行中的00010022,其在单片机中的实际地址是0x8011。地址的后面是数据,其数据表示也是按照8位来表示的,需要转换到单片机中的16位。拿第一行来举例,原来应写在 0x00010022上的0x23和写在0x00010023上0x37,就应改为写到0x8011上的0x3723。

    3.2 确认机制

    为了进一步的保证程序升级的可靠性,本文在Motor S37的基础上又加上了确认机制。即在单片机收到数据后,回传一遍数据,然后等待PC机确认;当PC机确认数据正确后,发送ACSII码S1作为ACK信号;否则发送S2作为DCK信号。确认机制牺牲了系统的效率,但是提高的可靠性,本文建议在一些链路状况较差的环境加上确认机制。

    3.3 程序的偏移量

    此处要说明的是,由于BootLoader代码占用了一定的程序空间,真正的用户代码的存放要从启动代码后开始,这就需要在编译程序的时候设置好偏移量,使得用户代码存储在BootLoader代码之后。在凌阳IDE184中,偏移量可以在 Project->Setting->Section(如图3)中设置。图中所示是设置了256字的偏移量,即0x100。因为 SPCE061A的程序空间是从0x8000开始,所以下图中代码段的起始地址为0x8100。

    图3 偏移量的设置

    针对本文的实现方法,把偏移地址设置在了0x8500,也就是说BootLoader运行后会自动启动0x8500处的代码。

    4 结束语

           本文所介绍的设计已经进行了实现,试验效果良好。在选取某些不稳定链路作为数据获取方式时或者是复位可能对链路造成影响的情况下,例如GPRS链路,为了进一步提高程序升级的可靠性,系统还可以外扩RAM,在系统复位之前下载全部的升级程序代码到RAM中,然后再复位启动直接改写程序空间。

    本文创新之处在于提出了远程升级单片机系统内部程序的方法,方案可靠性高,容易实现,虽是以SPCE061A为例,但可普遍应用于各类可自我擦写程序空间的单片机;本文虽是以从串口获取数据为例介绍了单片机程序远程升级的思路和实现方法,但485、422等通讯方式与串口类似,而且GPRS、GSM 和CMDA等通讯方式归根到底都是使用串口,所以根据本文的设计理念可将获取数据的方式替换为GPRS或者485甚至网卡等等更加复杂传输手段。使得有以上各种接口的单片机产品都可以进行程序的远程升级,而不必对产品进行召回。有一定的实用价值。

    参考文献:

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

    [2] 朱海君,敬岚,陆军。基于MSC1210单片机的串口通讯设计。《微机算计信息》。2004 No.4 P.48

    展开全文
  • 单片机程序升级其实本质就是对单片机的片上Flash进行擦写,将新的程序写入到运行的Flash位置。做了2G模块的IAP程序升级和基于串口上位机的IAP程序升级。写下一点自己的浅见。 概况: 软件上: 具备远程升级的...

    单片机的程序升级其实本质就是对单片机的片上Flash进行擦写,将新的程序写入到运行的Flash位置。做了2G模块的IAP程序升级和基于串口上位机的IAP程序升级。写下一点自己的浅见。

    概况:

    1. 软件上:
      具备远程升级的单片机的程序整体具体包含两个部分,一部分是(APP)应用程序,另一部分是(BOOT)引导程序
      APP程序 就是我们需要进行更新的程序,程序包括的内容:应用相关的程序(业务相关),接受并解析升级数据包的程序,存储数据包的程序。
      BOOT程序 
      就是负责对已经存储好的升级数据包文件写入APP程序所在的Flash;并跳转到APP程序
      这两部分的程序是相互独立的运行的,拥有相互跳转的能力,相互升级对方的能力。上电一般先运行BOOT程序,然后跳转到APP程序执行。BOOT程序一般很小,APP程序比较大。

    2. 硬件上:
      单Flash块的单片机:Flash存储位置上BOOT程序从默认启动Flash地址 0x0000000 开始开始存储 ,APP程序从BOOT 程序后的指定Flash页的基地址开始(Flash擦除写入以页(page)为单位)。
      多个Flash块的单片机:单片机有相应的Flash区分(例如LDROM,APROM等),一般将两个程序存储与不同的区块,查看手册配置好,启动flash即可。
      如下图所示:

    1. BOOT程序结构:

    •   单块Flash的BOOT程序结构简单(单片机为新唐的M4系列,使用复位跳转方式。也可以使用非重启方式跳转:重映射向量表之后,栈指针也要修改到APP_ADDR,(APP_ADDR + 4) 复位中断处理函数为程序入口),如下:
    //只是示意步骤,并非真正程序,隐去细节
    int32_t main(void)
    {
        SYS_Init(); //系统以及外设初始化
    
        SYS_UnlockReg(); //解锁系统寄存器的写保护
    
        FMC_Open();    //开启Flash擦写
    
        set_IAP_boot_mode(); //进入IAP模式
    
        if(CheckUpdateFlag()) //检查是否需要升级APP程序
        {
            if(DataCheck()) //检验待写入的APP数据的完整性
            {
                FMC_ENABLE_AP_UPDATE(); //开启程序区的Falsh写入
    
                load_image_to_flash(); //写入新的APP程序
    
                WriteUpdateFlag(Update_Success); //更新升级标志位至升级完成
                
                FMC_DISABLE_AP_UPDATE(); //关闭程序区的Falsh写入
            }
            else
            {
                WriteUpdateFlag(Update_Failed); //更新升级标志位至升级完成
            }    
        } 
    
        NVIC->ICER[0] = 0xFFFFFFFF; //关闭所有中断
    
        FMC_SetVectorPageAddr(APP_ADDR); //重定向APP程序执行向量,页对齐
    
        NVIC_SystemReset();	//重启跳转至APP程序,或者使用程序跳转
    
    }
    • 多块Flash的情况:只是将跳转的方式的操作有所区别,基本一致。

    2. APP程序结构:

    APP程序的程序升级流程就把从数据源获取的数据(不管是网络传输过来的数据,还是通过串口传输的数据),按照约定的格式解析出APP的二进制数据包和程序的校验值存储起来,在接收完毕数据之后把升级的标志位置为需要升级,然后执行跳转到BOOT程序,进行升级。新的APP程序,检查升级是否完成的,上报或者回复相应信息。

    至此升级流程就全部完成。这里只讲流程,由于传输的方式和传输协议等的差异,具体的实现方式很多。

    3. Flash写入相关:

    一般升级文件为单片机工程编译生成的BIN文件,传输量最小。Hex文件大小至少是BIN文件的2倍。

    例如如上图所示,数据存储于片上Flash的另一区域,那么一般这块数据的第一页都是用来存放数据包的信息,校验值,升级标志位等升级相关的数据。升级文件的Flash写入就是将BIN文件原封不动的从Flash指定地址(例如APP_ADDR)开始写入,不足一页的用0xFF填充剩下的字节写入。

     

    题外话:现在单片机的功能越来越强大,主频也越来越高,像Coretex-M7的已经达到了500MHz。相应的应用也是越来越丰富,互联网思维(敏捷开发)的全行业推进,做一款产品先做一个demo先上线,然后根据实际情况慢慢的完善。这时候程序的升级就变得非常的重要了,你要是联网的的设备远程升级那就更加的方便了。IAP升级也适用于功能出了问题进行紧急维护。

    展开全文
  • 单片机下载就三种,一种为离线下载,一种为在系统下载,一种为升级下载。 离线下载为把单片机取下,放在编程器上下载,这种方式通常使用并行的方式写入程序。 在系统下载就是你说的ISP,单片机在线路板上不用取下...
    单片机下载就三种,一种为离线下载,一种为在系统下载,一种为升级下载。
    
    离线下载为把单片机取下,放在编程器上下载,这种方式通常使用并行的方式写入程序。
    
    在系统下载就是你说的ISP,单片机在线路板上不用取下。USB下载只是其中之一,像STC单片机可以通过串口下载,ATMEL单片机通过SPI下载,还有的像ARM单片机通过JTAG下载等等。
    
    升级下载和ISP下载差不多,之不过通过已经写入到单片机的程序来改写自身的FLASH。多用于远程方式烧写,这种方式常用在手机或示波器等仪器的升级,或通过以太网这种远程的方式改变程序。
    
    研发的时候一般用ISP方式下载,这样不用来回焊下芯片,特别是贴片的,焊几次就可能会坏。
    
    量产的时候一般用离线方式,烧好的芯片拿到车间焊接。很多公司下载是专人负责,保密性强,我们接项目时也是这种方式给客户,烧一个芯片说明你生产了一台,用这种方式提成。
    
    卖到客户手中后就用升级下载,这种时候你的设备可以在全国乃至全球各地,不可能跑过去一个客户一个客户的改烧写。那么就用这种方式。
    
    展开全文
  • 关于STC单片机的远程升级 尽量写的通俗一点,有错误之处请不吝赐教。 我对单片机的理解:单片机是运算器+ram(失电后数据丢失)+rom(失电后数据依然保存)+外部设备(各种IO),它是以时序而工作的,并具有逻辑功能。...

    关于STC单片机的远程升级

    尽量写的通俗一点,有错误之处请不吝赐教。
    我对单片机的理解:单片机是运算器+ram(失电后数据丢失)+rom(失电后数据依然保存)+外部设备(各种IO),它是以时序而工作的,并具有逻辑功能。可以用它(以底成本)实现复杂的任务。
    学习单片机可以这样学习:
    1.了解时序
    2.了解RAM(单片机的寄存器),并关联相应IO(分类、分块)。
    3.了解编程语句c或汇编。
    4.综合逻辑功能(程式)及rom。
    我们可以用以上知识,设计一个逻辑功能(应用在某种生产、服务或生活场景),当我们对逻辑功能进行维护时,要对rom进行重写,最简的方法是可以远程升级(也是比较复杂的方法,写成后可一劳永逸)。
    从msc51到AT89C系列,最后选择了STC系列,原因有3,速度快,稳定,工作温度带宽大。
    带入正题,STC单片机的远程升级,主要是利用了STC的ISP功能(每种系列带有ISP功能都可远程升级)。
    STC的ISP功能使用串口1(rxd,txd,一般为P3^0,P3^1)作下载端口,也就是按STC的ISP协议写入主工作芯片的串口1,实现框图如下:
    

    在这里插入图片描述
    注意事项:
    1.ISP串口通讯是偶校验。
    写法发送一个字节
    void sendchr2(uchar s)
    {
    ACC=s; //(ACC累加器,会影响P位)
    S2CON &=0xfd;
    if§
    {
    S2CON=S2CON | 0x08;
    }
    else
    {
    S2CON =S2CON & 0xf7;
    }
    TB8 = P;
    S2BUF=ACC;
    while(!(S2CON & 0x02));
    }
    2.串口通讯用固定波特率最简,比如4800。
    3.从单片机串口最好用中断方式**
    附:ISP协议格式
    包头 + 标识 + 数据包长度 + 命令 + 数据 + 校验和 + 包尾
    起始帧:0x7F(只一个字节)
    包头:0x46,0xB9,两字节
    标识:PC机发送给MCU的为0x6A,MCU回应给PC的是0x68,标识后面还有一个字节固定为0x00,两字节
    包长:为除包头外的数据包总长,一字节。
    命令:一个字节。
    数据:可以有也可以无,最多时有128个字节。
    校验和:为两字节,除去包头其他数据校验和(字节相加的值)。
    包尾:固定为0x16

    展开全文
  • 在STM32ZET6平台开发,网络芯片为W5500,可实现利用HTTP协议上传程序,并写入单片机FLASH.
  • 阮工的单片机编程经验集V2.0:如何做稳定单片机程序 ,阮丁远于20191208 : ================================================================================================ 20191207 : 5V等电源输入时...
  • 单片机片内存储器烧写(ROM编程)(纯粹个人理解,收集资料总结,如有不妥还请指出)单片机应用系统由硬件和软件组成,软件的载体是硬件的程序存储器,程序存储器采用只读存储器,这种存储器在电源关闭后,仍能保存...
  • 最近一周一直在基于STM32F429项目的IAP工程,耗时4天才完成,得空记录下来。文章主要涵盖了以下几点: 1. IAP是什么? 2. bin文件和hex文件的差别 3. ymodem协议介绍及其缺陷 4. RS485通讯 5. IAP的main()函数代码...
  • 单片机ISP、IAP和baiICP几种烧录方式的区别 ...ISP是指可以在板级上进行编程,也就是不用拆芯片下来,写的是整个程序,一般是通过ISP接口线来写。 IAP虽然同样也是在板级上进行编程,但是是自已对自已
  • 在项目的开发与应用中,尤其是一个设计好的硬件都具备了在线升级功能。 此文通俗易懂的用一张图讲解了虚拟串口iap原理
  • 参考博文:STM32 IAP 在线升级详解 操作前我们先来说一下内存映射: 下图在stm32f100芯片手册的29页,我们只截取关键部分 注意: 根据启动方式不同,地址空间中从0x0000 0000到0x07FF FFFF这段空间,可以是flash...
  • 解决stm32 IAP程序跳转后串口不能发送的问题问题描述解决办法 问题描述 在stm32上实现了IAP功能,当IAP程序与APP程序都使用Keil编译工具进行编译链接时,APP程序能够正常工作。但是IAP程序使用Keil编译,APP程序使用...
  • 关注了这个概念有些日子了,这段时间总算有机会实战==网络升级应用固件,这里记录下遇到的问题,及解决方案。 原理与网上流传的串口作为传输手段 一致;不同之处,无非我这里使用了网络设备传输。==(lwip)TFTP...
  • 实验平台:windows7 + STM32F103ZET6 实验目的:你不需要任何烧录工具,就可以对你的产品进行远程升级代码! ...1. Xmodem协议简介 ...3. Boot与App程序设计 4. 实验步骤 5. 远程升级应用 1. Xmodem
  • LPC1768 IAP升级

    2016-06-14 21:15:07
    1、IAP介绍 IAP即“in applicatin programming”在应用编程的缩写,指MCU可以在系统中获取新代码并对自己重新编程,即改变应用程序。...而我们这里所说的IAP通过下载一段引导程序Bootloader程序,如果我们想
  • 在真正的工作中产品发布后,可以很方便的使用预留的通信接口(串口、USB、网口、蓝牙等)来完成程序升级,从而避免了把机器拆开使用下载器烧写程序。要实现IAP功能一般要设计两部分代码,一是BootLoader程序,这...
  • 这篇文档主要讲解Cortex-M3内核的芯片怎样实现带有BOOT和APP分区程序功能,通过BOOT来给APP固件升级。 先列出主要步骤: 在BOOT中: 重定位中断向量表到BOOT区首地址(必须) 在跳转之前重置所有内部外设时钟...
  • 最近要学习ARM开发板,想按着单片机的套路,首先开发裸机程序。百度了下,大部分的裸机程序都是用RVDS或者ADS开发,用JLink 或者JTag烧写到Sdram中去执行。由于在ubuntu下使用习惯了,想脱离集成开发环境,所以在...
  • IAP远程在线升级

    2019-06-28 01:52:20
     在上一篇中实现了LWIP网口通讯,那么肯定要加个在线升级功能,这个功能所占用的资源很少,但在物联网中很重要也很实用。在线升级就是像手机一样,先下载好系统,然后点击升级~然后就没然后了。  网上有很多IAP的...
  • ---------------------------------------------------... 17/07毕业,通过完成试用期的几个小项目,感觉自己能独立的完成部分项目,便接手了配合硬件工程师,将公司模块升级的任务(M3-->M4) 目标: 1.boot...
1 2 3 4 5 ... 9
收藏数 168
精华内容 67
关键字:

单片机通过网口升级程序