文章目录

  • 前言
  • 一、YMODEM协议理解
  • 二、程序设计
    • 1.程序设计说明
    • 2.BOOT程序
    • 3.APP程序
  • 三、功能验证
  • 四、总结

前言

鉴于项目需求,学习并移植YModem在华大Hc32L系列MCU上,时间短,有欠缺的地方欢迎指正


一、YMODEM协议理解

示例:这里参照了一篇YModem协议说明,供参考,下载链接在结尾处,有需要的可自取。

Ymodem协议解释:
SENDER:发送方。(文件名:fileName.bin)
RECEIVER:接收方。
具体握手的步骤如下:
1、接收方发送一个字符’C’,也就是十六进制’43’。代表接收方已经处于接收数据的状态。
2、发送方接收到’C’之后,发送头帧数据包,内容如下:
SOH 00 FF fileName.bin NULL[116] CRC CRC
数据包内容解释:
2-1、SOH(第一字节):表示数据区大小有128字节。(STX表示本数据包数据区大小1024字节)。
2-2、00(第二字节):数据块编号。第一包为00,第二包为01,此后依次累加。FF后,继续从00循环。
2-3、FF(第三字节):数据块编号的反码。编号00-FF,01-FE,此后以此类推。
2-4、fileName.bin NULL[116]:数据区。128字节。fileName.bin是文件名,超级终端下,在文件名后面还有文件大小。数据区不足128字节的,用0x00补齐。
2-5、CRC校验(最后2个字节):16位CRC校验,高位字节在前,低位字节在后。(注意:只有数据区参与了CRC校验,不包含头,编码,编码反码)。
3、接收方收到数据包后,发送ACK正确应答,然后发送一个字符’C’。
4、发送方收到’C’后,开始发送第二帧数据。第二帧数据存放的是第一包数据。
5、接收方收好数据包后,发送ACK正确应答,然后等待下一包数据传送完毕,继续ACK应答。(循环)
6、数据传输完毕后,发送方第一次发送EOT,第一次接受方以NAK应答,进行二次确认。
7、发送方收到NAK后,第二次发送EOT。接收方第二次收到结束符,依次以ACK和C做应答。
8、发送方收到ACK和C之后,发送结束符SOH 00 FF 00 … 00[128个00]CRCH CRCL。
9、接收方收到结束符之后,以ACK做应答,然后通信正式结束。

二、程序设计

1.程序设计说明

Boot程序用UART0作数据传输,UART1作数据打印,while循环调用YModem_Receive_Proc函数处理数据。
App程序用UART1作数据打印,while循环调用systick获取当前时间量,1s打印一次数据。

2.BOOT程序

代码如下(示例):

/*** @brief Function Main*/
int main(void)
{uint32_t   len;Flash_Init(NULL,4,FALSE);       Flash_WaitCycle(FlashWaitCycle1);Tsk_SystemInit();Tsk_Uart0Init();Tsk_Uart1Init();__enable_irq();printf("This is Boot\r\n");printf("Please send the bin file to MCU\r\n");Hal_Uart0_Send_Str("This is Boot,Please send the bin file to MCU.\r\n");while(1){YModem_Receive_Proc(buff,&len);}
}
/*************************************************************Function   : YModem_Receive Description: ymodem接收Input      : buf-存放接收到的数据 length 接收数据的总长度return     : 0 -发送端传输中止-1 -固件过大-2 -flash烧写错误-3 -用户终止
*************************************************************/
int YModem_Receive_Proc(unsigned char *buf, unsigned int *length)
{unsigned int       i,size; unsigned int        errors;     unsigned int        packets_received;unsigned int       packet_length;      unsigned int        app_bin_datalen;unsigned char       *file_ptr, *buf_ptr;*length = 0;size = 0;errors = 0;packets_received = 0;       app_bin_datalen = 0;buf_ptr = buf;memset(buf_ptr,0xff,FLASH_PAGE_SIZE);while(1)   //死循环,不断接收数据{switch(YModem_RecvPacket(packet_data, &packet_length, NAK_TIMEOUT))//接收数据包{case 0:  //接收正常                  errors = 0;if(packet_length)//接收数据中{                       if((packet_data[PACKET_SEQNO_INDEX] & 0xff) != (packets_received & 0xff)) {//接收错误的数据,回复NAKYModem_SendByte(NAK);}else    {if(packets_received == 0)//接收第一帧数据{if(packet_data[PACKET_HEADER] != 0)//包含文件信息:文件名,文件长度等{for(i = 0, file_ptr = packet_data + PACKET_HEADER; (*file_ptr != 0) && (i < FILE_NAME_LENGTH); ){if(i < 16)    file_name[i++] = *file_ptr++;//保存文件名else{  file_name[i++] = '\0';     //文件名以'\0'结束 file_ptr++;    }}file_name[i++] = '\0';//文件名以'\0'结束     for(i = 0, file_ptr++; (*file_ptr != ' ') && (i < FILE_SIZE_LENGTH); ){file_size[i++] = *file_ptr++;//保存文件大小}file_size[i++] = '\0';//文件大小以'\0'结束                                                   size = w_atoi((char *)file_size);//将文件大小字符串转换成整型*length = size;if(UpdateAppCodeStart(file_name, size))    //{YModem_SendByte(CA);          YModem_SendByte(CA);//连续发送2次中止符CAreturn -1;//返回}size = 0;YModem_SendByte(ACK);    //回复ACkYModem_SendByte(CRC16);//发送'C',询问数据printf("------------->>first packet\r\n");}else//文件名数据包为空,结束传输{YModem_SendByte(ACK);//回复ACKreturn 0;}}else {file_ptr = packet_data + PACKET_HEADER;    while(packet_length){if(packet_length >= (FLASH_PAGE_SIZE - app_bin_datalen)){printf("------------->>packet_length:%d\r\n",packet_length);memcpy(buf_ptr + app_bin_datalen, file_ptr, (FLASH_PAGE_SIZE - app_bin_datalen));//拷贝数据file_ptr += (FLASH_PAGE_SIZE - app_bin_datalen);packet_length -= (FLASH_PAGE_SIZE - app_bin_datalen);//接收到1页固件资料,就更新写入if(UpdateAppCode(buf_ptr)){printf("------------->>error -2\r\n");YModem_SendByte(CA);  YModem_SendByte(CA);//flash烧写错误,连续发送2次中止符CAreturn -2;//烧写错误}size += FLASH_PAGE_SIZE;app_bin_datalen = 0;memset(buf_ptr,0xff,FLASH_PAGE_SIZE);    }else{printf("-------------<<packet_length:%d\r\n",packet_length);//由 file_ptr 所指内存区域复制 packet_length 个字节到 buf_ptr + app_bin_datalen 所指内存区域。memcpy(buf_ptr + app_bin_datalen, file_ptr, packet_length);//拷贝数据app_bin_datalen += packet_length;packet_length = 0;}}                                 YModem_SendByte(ACK);//flash烧写成功,回复ACK}packets_received++;//收到数据包的个数}                      }else{YModem_SendByte(ACK);//接收完成   UpdateAppCodeEnd(buf_ptr, app_bin_datalen);size += app_bin_datalen;   printf("------------->>size:%d\r\n",size);return size;}break;case -2:                       //用户中止printf("ack -2\r\n");YModem_SendByte(CA);YModem_SendByte(CA);    //连续发送2次中止符CAreturn -3;        //烧写中止case -3://发送端中止传输printf("ack -3\r\n");YModem_SendByte(ACK);//回复ACKreturn 0;case -1:if(packets_received > 0)   //传输过程中发生错误{errors++;if(errors > MAX_ERRORS) //错误超过上限{printf("errors %d\r\n",errors);YModem_SendByte(CA);YModem_SendByte(CA);//连续发送2次中止符CAreturn 0; //传输过程发生过多错误}                       }if(eot_flag){YModem_SendByte(CRC16); //发送'C',继续接收if(ca_index++ > 0){eot_flag = 0;printf("------------->>JumpToApp\r\n");Hal_Uart0_Send_Str("------>>Ok\r\n");iap_load_app(APP_FW_START_ADDR);}}else{YModem_SendByte(CRC16); //发送'C',继续接收}break;} }
}

3.APP程序

/*** @brief Function Main*/
int main(void)
{uint32_t   timedelay;SCB->VTOR = 0x4000;Flash_Init(NULL,4,FALSE);      Flash_WaitCycle(FlashWaitCycle1);Tsk_SystemInit();Tsk_Uart0Init();Tsk_Uart1Init();__enable_irq();timedelay = uTick;printf("-------------->>This is App\r\n");while(1){if((uTick - timedelay) > 1000){timedelay = uTick; printf("-------------->>App run %d\r\n",i++);}}
}

三、功能验证


四、总结

1.Boot程序注意数据收完跳转APP程序的方式;
2.App程序注意设置偏移地址

源文件下载地址:https://download.csdn.net/download/qq_34413603/34864984?spm=1001.2014.3001.5501

基于HC32L13X系列的YModem升级方案相关推荐

  1. 基于LT8668系列芯片的拼接方案

    LT8668系列芯片是一颗高性能的LCD Controller显示控制器芯片,它可配置输入DP1.4/HDMI2.1   , Type-C/DP1.4/HDMI2.1,audio in,配置输出LVD ...

  2. 基于数字孪生的数字化车间升级方案

    本文根据数字化车间升级的理论与实践,具体阐述基于数字孪生运行模式的数字化车间 的升级方案与具体实现. 1    技术理论成果概述 1.1    数字孪生车间运行模式 世界各个制造大国提出的制造业国家战 ...

  3. 我的docker随笔28:基于容器的升级方案实验

    本文涉及: 在容器化场合中,如何更快升级.涉及2方面: docker镜像的设计. 升级方案. docker镜像设计 充分利用docker镜像分层机制,减小升级的体积,减少流量消耗. 基础镜像设计 基础 ...

  4. 基于XCP(On CAN)协议的Bootloader升级方案

    基于XCP(On CAN)协议的Bootloader升级方案 文章目录 前言 一.ECU端设计 1.Flash分配 2.软件架构层次图 3.流程图 4.源码 二.PC端设计 三.测试验证 四.总结 前 ...

  5. 动态口令设计系列一:基于共享密钥的动态口令方案

    2019独角兽企业重金招聘Python工程师标准>>> 由于传统的静态口令存在容易泄露(输入型泄密.传输型泄密.共享型泄密.记录型泄密.时间越长泄密危险性越高)且一旦泄露全线崩溃.不 ...

  6. 基于STM32系列芯片的 IAP实现的探索

    基于STM32系列芯片的 IAP实现的探索 什么是IAP? 如何实现IAP? 第一步:学习官方源代码 第二步:了解STM32芯片基本硬件参数 第三步.搞清除STM32内置Flash 第四步. STM3 ...

  7. oracle数据库的医院信息系统数据库升级方案,医院信息系统数据库从Oracle8i到10gR2升级的实现...

    医院信息系统数据库从Oracle8i到10gR2升级的实现 时间:2009年03月02日16:05 来源:当代医学 作者:李泰环 [摘要]  目的  解决资源紧张,系统运行较慢等问题.方法 升级数据库 ...

  8. 旧电脑装html5,8年前老电脑如何升级?实战近十年的老电脑升级方案

    回想八年前,那时苹果第一代智能手机iPhone 3G/3GS刚发布,当时诺基亚当占有很大的市场.八年前还没有平板,笔记本电脑的火热期.时间过的真快,8年过去,iPhone8即将上市.曾经的巨头诺基亚已 ...

  9. 传统数据中心升级方案

    一.引言 云计算是近年来发展最快的互联网技术,被称为第四次IT革命.IT应用服务将建立在云计算架构之上.作为云计算核心的基础设施,数据中心在网络中所扮演的角色将更加重要.云计算数据中心正在逐渐取代传统 ...

  10. 基于AgileEAS.NET企业应用平台实现基于SOA架构的应用整合方案-开篇

    为什么80%的码农都做不了架构师?>>>    开篇 系统架构的文章,准备在这段时间好好的梳理和整理一下,然后发布基于AgileEAS.NET平台之上的企业级应用架构实践,结合具体的 ...

最新文章

  1. ndk 不用java_使用NDK创建及配置C++程序(原生纯C++项目,不包含JAVA代码)
  2. 学习换脸:Switching Eds: Face swapping with Python, dlib, and OpenCV
  3. 送餐机器人市场达11.6亿 美团将成“搅局者”?
  4. 剑指offer--面试题12
  5. 外贸单证之信用证审核的18个要点
  6. 【数据结构】—顺序表的插入、删除、查找操作
  7. spring 属性占位符_Spring属性占位符配置器–一些不太明显的选项
  8. Leetcode刷题(3)整数反转
  9. IBM将剥离传统IT基础设施部门;迅雷前CEO陈磊涉嫌职务侵占罪被调查 ;Python 3.9发布|极客头条
  10. WinForm 实例教程 通讯录 视频教程 入门教程
  11. 我 yii2 (一)
  12. Atitit mybatis缓存遇到的问题与解决 1.1. 只有getobj 没有执行putobject 1 1.2. 默认所有的select要读取缓存怎么办。。执行过滤 可以自己定义个白名单。
  13. Mac实践--MAC搭建FTP服务器
  14. JAVA中的I/O流
  15. 一文告诉你市面上最火的游戏都是用什么引擎做的!!!
  16. 三对角矩阵(特殊矩阵)
  17. Flutter灰色页面/灰色图片(滤镜)
  18. Android天天飞车游戏辅助系统
  19. Bumped!【迪杰斯特拉消边、堆优化】
  20. 安装Windows服务报错:未能加载文件或程序集

热门文章

  1. 树莓派笔记17: 语音机器人
  2. Linux系列: 777 755区别
  3. 写好英语科技论文的诀窍: 主动迎合读者期望,预先回答专家可能质疑
  4. 国外变电站3d可视化技术发展_从裸眼3D技术看LED显示的发展趋势
  5. 软文写作技巧与营销的相互作用
  6. 关于手机app合并m3u8文件失效,pc端合成方法
  7. 挨踢项目求生法则(2)——战略篇
  8. 多商户商城系统功能拆解14讲-平台端会员等级
  9. 绩效考核过程中会遇到的问题
  10. ppt矩形里面的图片怎么放大缩小_PPT中图片点击放大效果的实现