基于AVR-BootLoader,通过霜蝉远程串口可实现单片机的远程升级

2020-03-30来源: eefocus关键字:AVR-BootLoader  远程串口  远程升级

最近一直利用业余时间写自己的“基于AVR-BootLoader”,启发是由于一次在ourAVR论坛看到了绍子阳的bootloader,联想到公司在用AVR MCU,但每次升级程序都要花费很大的力气车马劳顿的跑到工程现场,而且很多机器还安装在国外,为了升级一次程序发费了很多的人力物力财力,加上公司的机器目前大部分都配有远程监控系统,所以本人决定写一个具有自有产权的“AVR-BootLoader”。


      

特别说明:本“AVR-BootLoad”软件代码属上海霜蝉版权所有,在此贡献发布,仅限于个人免费使用不得用于商业用途,本人也不保证代码的严谨性,如在升级中出现任何问题与本人无关,本人已测试过Atmega64A与Atmega128。话不多说了上源代码,网友们和AVR爱好者可以拷贝到CodeWizardAVR V2.03.9编译器下编译。

需要讨论或有遇到BUG的网友们可以联系我:QQ:285247488  mail:shw@scicala.com 


上位机截图:

远程升级DTU

远程升级连接云平台虚拟串口

// 关于上海霜蝉-AVR_BootLoade_V1.00

// 1、软件版本V1.00 编译环境CodeWizardAVR V2.03.9 Standard;

// 2、支持本公司常用的三种AVR芯片;

// 3、支持标准Xmodem和扩展Xmodem_1K协议;

// 4、联机握手密码为"00",握手成功手的等待文件超时为1分钟;

// 5、默认复位等待3S退出boot到用户程序或循环运行boot;

// 6、支持1分钟以内的断网续传;

// 7、支持连续10帧以内数据错误的重传;

// 8、支持下载过程中的取消超作;

// 9、支持当收到包时,接收过程中每个字符的超时间隔为 1 秒;

// 10、支持所有的超时及错误事件至少重试 10 次;

// 11、支持数等待超时6S的请求;

// 12、Boot Loader - Size:1024words;

// 13、支持传输速度:38.400KB/S~2.400KB/S;

// 14、支持公司常用最多的三个型号ATMEGA32,64,128。

// 15、支持开门狗自定义开关,自定义时钟频率


/*****************************************************

This program was produced by the

CodeWizardAVR V2.03.9 Standard

Automatic Program Generator

?Copyright 1998-2008 Pavel Haiduc, HP InfoTech s.r.l.

http://www.hpinfotech.com

Project      : AVR_BootLoader

Version     : V1.00

Date         : 2014-7-19

Author      : Sui Hongwei

Company : SCICALA

Comments:

Chip type                   : ATmega64L

Program type             : Boot Loader - Size:1024words

AVR Core Clock frequency: 16.000000 MHz

Memory model            : Small

External RAM size       : 0

Data Stack size           : 1024

*****************************************************/

#include "AVR_boot.h"   // 头文件包含

//--------------------------------------------------//

//同步密码长度

#define CONNECTCNT         7

//同步密码

uchar KEY_Data[10] = {"SCICALA"};

// Declare your global variables here

//--------------------------------------------------//

// 全局变量定义

uchar     RX_buff[BUFSIZE];                          // 数据拉收缓存

uchar   Frame_State,SOH_Wait_cnt;            // 帧状态,帧头等待计数

uint    Time_cnt,Error_cnt;                             // 超时计数,连续帧错误计数

uint    buffptr,buffptr_old,buffptr_New;            // 数据缓存指针必须大于1024

ulong   FlashAddr;                                          // Flash地址

uchar   UpdatedSta;                                        // 升级标志

//-----------------------------------------------//

//擦除(code=0x03)和写入(code=0x05)一个Flash页

void boot_page_ew(ulong p_address,char code)

{

    #asm

     ldd  r26,y+1       ; R26 LSB

     ldd r27,y+2        ; R27 MSB

    #endasm

    SPM_REG = code;                 // 寄存器SPMCSR中为操作码

    #asm

     mov r30,r26

     mov r31,r27

    #endasm

    #ifdef  ATMEGA128

     RAMPZ=(p_address>>16);     // RAMPZ0 = 1: ELPM/SPM 可以访问程序存储器地址$8000 - $FFFF ( 高64K 字节)

    #endif

    #asm("spm");                // 对指定Flash页进行擦操作

}

//填充Flash缓冲页中的一个字

void boot_page_fill(uint A_address,uint data)

{

      #asm

        LDD R30,Y+2     ; R30 LSB

        LDD R31,Y+3     ; R31 MSB

        LD  R26,Y

        LDD R27,Y+1

        MOV R0,R26

        MOV R1,R27

        MOV R26,R30

        MOV R27,R31

      #endasm

        SPM_REG =0x01;           //寄存器SPMCSR中为操作码

      #asm

        mov r30,r26

        mov r31,r27

      #endasm

        #asm("spm");            //对指定Flash页进行擦操作

}

//等待一个Flash页的写完成

void wait_page_rw_ok(void)

{

      while(SPM_REG & 0x40)

     {

         while(SPM_REG & 0x01);

         SPM_REG = 0x11;

         #asm("spm");

         while(SPM_REG & 0x01);

     }

}

//-----------------------------------------------//

//更新一个Flash页的完整处理

void write_one_page(uchar data[])

{

    uint i;

    boot_page_ew(FlashAddr,0x03);         //擦除一个Flash页

    wait_page_rw_ok();                    //等待擦除完成

    for(i=0;i

    {

        boot_page_fill(i,(uint)data[i]+(data[i+1]<<8));

        wait_page_rw_ok();

    }

    boot_page_ew(FlashAddr,0x05);         //将缓冲页数据写入一个Flash页

    wait_page_rw_ok();                    //等待写入完成

}

//--------------------------------------------------//

//等待串口数据1S超时自动转为应答

unsigned char Wait1S_UART()

{

uchar i=0;

  do

  {

    #if WDGEn

    Watchdog_Reset();                       // 喂狗

    #endif

    if(TIFR&0x10)                           // OCF1A: T/C1 输出比较 A 匹配标志位

    {

        TIFR|=0x10;                         // 清除Time1定时器比较匹配标志

        i++;

        if(i>=4)                            // 等待1S 250ms*4=1S

        {   Frame_State=0x06; break;    }   // 帧数据超时转为应答请求重发数据帧

    }

    if(UCSRAREG(COMPORTNo) & 0x80)

    {

        UCSRAREG(COMPORTNo)|=0x80;          // 清除接收完成状态

        #if Run_LEDEn

        Run_LED;                            // 运行LED闪烁

        #endif

        i=100;

        return UDRREG(COMPORTNo);           // 读取UDR0

    }

  }

  while(100!=i);                            // 等待数据||超时退出

}

//***************************************************//

//===================================================//

void main(void)

{

uchar   packNO,packNO_old;  // 包号、包号留存

uint    crc16;              // 接收CRC缓存

uint    li;                 // 帧计数

uchar   ch, cl;             // 包号

    PORT_Init();            // 端口初始化

    UART_Init();            // 串口初始化

    Time1_Init();           // 定时器初始化 250ms

    #if WDGEn

    WatchDog_Enable();      // 打开看门狗(2S)

    #else

    WatchDog_Disenable();   // 禁止看门狗

    #endif

    #if Wait_BootTime

Time_cnt=EEPROM_Read(EE_TimeAddr); // 读取b

[1] [2] [3] [4] [5] [6]
关键字:AVR-BootLoader  远程串口  远程升级 编辑:什么鱼 引用地址:http://news.eeworld.com.cn/mcu/ic492885.html 本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。

上一篇:使用串口通信实现AVR的ISP下载
下一篇:超实用的两种调试AVR单片机的方法

关注eeworld公众号 快捷获取更多信息
关注eeworld公众号
快捷获取更多信息
关注eeworld服务号 享受更多官方福利
关注eeworld服务号
享受更多官方福利

推荐阅读

基于AVR-BootLoader,通过霜蝉远程串口可实现单片机的远程升级
最近一直利用业余时间写自己的“基于AVR-BootLoader”,启发是由于一次在ourAVR论坛看到了绍子阳的bootloader,联想到公司在用AVR MCU,但每次升级程序都要花费很大的力气车马劳顿的跑到工程现场,而且很多机器还安装在国外,为了升级一次程序发费了很多的人力物力财力,加上公司的机器目前大部分都配有远程监控系统,所以本人决定写一个具有自有产权的“AVR-BootLoader”。    特别说明:本“AVR-BootLoad”软件代码属上海霜蝉版权所有,在此贡献发布,仅限于个人免费使用不得用于商业用途,本人也不保证代码的严谨性,如在升级中出现任何问题与本人无关,本人已测试
发表于 2020-04-28
基于AVR-BootLoader,通过霜蝉远程串口可实现单片机的远程升级
一种利用串口51单片机远程升级 OTA
回馈网友的心态,发一篇关于OTA的贴,不喜勿喷,随着现在科技的发展,市面上出现很多带wifi,蓝牙等智能产品,为满足人们对产品可以不断完善,诞生了这种远程升级的技术。      在此之前呢,做过一个stm32远程升级的项目,这种片子的代码地址偏移性很好,load程序和应用程序划分好就可以,后来就想51这种便宜的mcu,能不能也实现这个功能呢,这就有了这次的实验。废话不多说,先说说原理,OTA主要就三部分,一个是load程序,一个是应用程序,还有带升级的程序,三个分别存储在不同地址,我以flash 32K为例。如下图 为什么要这样划分地址呢。主要是因为51单片机的中断地址不能发生偏移
发表于 2020-02-22
一种利用串口51单片机远程升级 OTA
STM32F103代码远程升级(二)基于串口IAP的简单实现
一、确定需要解决的问题这里我就记录一下我的学习过程。首先确定几个问题:实现IAP编程需要着手编写两个程序,一个是Bootloader程序,一个是APP应用程序。需要对STM32的Flash进行擦除和写入操作。需要根据APP应用程序开始地址设置中断向量表的偏移需要改变代码存放的地址空间(因为BootLoader要存放在0x08000000处,用户程序要存放在0x08005000处,而默认的代码存放的地址空间为0x08000000)。在下载完更新文件之后需要进行PC指针的强制跳转,跳转时需要做什么串口接收的用户代码数据是什么样的代码数据,是一种什么样的文件,该如何得到该格式文件然后我开始一个一个解决问题。二、解决问题1、准备好
发表于 2019-07-09
STM32F103代码远程升级(二)基于串口IAP的简单实现
基于多串口通信的柴油发电机组远程监控平台
实际的需求,得到了广泛应用。                          1 系统结构                            柴油发电机组远程监控平台的系统结构如图1所示。   柴油发电机组经MODEM与电话线路相连,在电话线路的另一端再经MODEM与监控主机的RS-232串口相连。                            很多县级局和下级机站之间都有SDH信道相通,如果有附加的RS-232串口,也可以通过SDH信道传输数据,从而省掉电话线路两边的MODEM,等同于RS-232串口电缆直接相连。                            如果一个下级机站内有多台柴油发电机组需要监控
发表于 2014-03-04
基于串口通信的远程自动抄表系统实现
在人们的日常生活中,水、电、气是不可缺少的必备生活保障,然而对于水、电、气供应公司来说,每个月上门抄取各个用户的三表读数却是非常繁重的工作,需要投入大量的人力和物力。现在许多公司在研究自动抄表系统,但是他们通常采用电话线或者是专线完成与上位机的通讯,成本比较高。详见参考资料[3][6][7]。针对这种情况,作者设计了一种远程无线自动抄表系统。自动抄表系统,简称ARMS(Automatic Reading Meter System),是供应水、电、气的部门将安装在用户处的水、电、气表所记录的用量等数据通过遥测、传输和计算机系统汇总到营业部门,代替人工抄表及一连串后续工作的系统。该系统的无线通信是采用GSM短消息业务,它的实现是迈向
发表于 2013-05-15
伊顿升级远程诊断技术IntelliConnect 可提高车队效率/降低保有成本
据外媒报道,当地时间2月25日,电力管理公司伊顿(Eaton)表示,其IntelliConnect™远程诊断技术新增了几个重要功能,可以提升车队的利用率。IntelliConnect™远程诊断技术是一套网联解决方案,旨在增加车队的正常运营时间、提高车队效率、并降低总保有成本。(图片来源:伊顿)IntelliConnect可近乎实时地监控车辆的故障代码,对关键事件进行优先级排序,并提供由伊顿技术专家制定的准确而全面的行动计划。此类功能可以通过减少意外停机时间、更快提供维修诊断来帮助增加车队的运营时间。IntelliConnect对于每日需要处理大量数据的车队管理人员而言,是一个很重要的工具。IntelliConnect会对数据进行
发表于 2020-02-28
伊顿升级远程诊断技术IntelliConnect 可提高车队效率/降低保有成本
小广播
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号 电信业务审批[2006]字第258号函 京公海网安备110108001534 Copyright © 2005-2020 EEWORLD.com.cn, Inc. All rights reserved