STM32 IAP Ymodem

2023-10-28

STM32 IAP采用Ymodem协议升级固件

公司最近软件需要通过IAP来升级所有板卡的固件,其中板卡有2块,一块主控板卡,一块子控板卡。其中,主控板卡与子控板卡之间采用RS485通信,PC与主控板卡采用RS232通信。

具体框架:
在这里插入图片描述

一、PC端与主控板卡

首先,PC端与主控板卡之间的升级采用常规的 Ymodem 协议传输,IAP 升级。可以参考ST官方的IAP工程
另外安福莱硬汉哥进行了整理可具体可参考 STM32-V5开发板串口IAP操作说明

1.工作流程:

这里,使用的STM32的型号为STM32F407ZET6 ,其FLASH大小是512KB,0x08000000为其FLASH被映射的地址,程序被烧写到的就是这个地址。此处,我们的IAP程序烧写到这个地址,根据IAP程序的大小,我们在keil里可以设置合适的IAP结束地址。
在这里插入图片描述

2. 工程说明:

本项目用到的两个工程可按照文末的方式获取,其中IAP工程移植至ST官方例程。下面对两个工程进行简单的说明

IAP工程:
(1)需要在target选项卡里设置我们IAP程序的起始地址与大小,如:
在这里插入图片描述
这里我们的IAP程序起始地址设为0x08000000,大小设为0x4000,即IAP所能用的FLASH空间为16KB。其中IAP所能占的占空间的大小可根据IAP的实际大小进行修改。

(2)需要修改程序中我们需要跳转到的应用程序的地址(即IAP程序的结束地址):
在这里插入图片描述
APP工程:
(1)需要在target选项卡里设置我们LED程序的起始地址与大小,如:在这里插入图片描述
这里我们的APP程序起地址设为0x08004000,大小设为0x7C000,即APP所能用的FLASH空间为496KB(总容量为512K,IAP占用16K)。其中结束地址可根据APP应用程序的实际大小进行修改。

(2). 设置中断向量表的偏移(依据实际情况设置)
在这里插入图片描述
(3). bin文件生成。
在这里插入图片描述

3.IAP软件流程

在这里插入图片描述
代码:

while (1)
	{
        if(!Check_App_Flag())
        {
            SerialDownload();
        }
        else if (RTC_ReadBackupRegister(RTC_BKP_DR0) == UPDATA_APP)
        {
            updata_fpga_flag = RTC_ReadBackupRegister(RTC_BKP_DR0);
            RTC_WriteBackupRegister(RTC_BKP_DR0,0);
            SerialDownload();
        }
        else if (RTC_ReadBackupRegister(RTC_BKP_DR0) == UPDATA_FPGA)
        {
            updata_fpga_flag = RTC_ReadBackupRegister(RTC_BKP_DR0);
            RTC_WriteBackupRegister(RTC_BKP_DR0,0);
            SerialDownload();
        }
        else if (RTC_ReadBackupRegister(RTC_BKP_DR0) == UPDATA_DRIVER)
        {
            updata_fpga_flag = RTC_ReadBackupRegister(RTC_BKP_DR0);
            RTC_WriteBackupRegister(RTC_BKP_DR0,0);
            printf("\r\nUpdata Driver open USART_IT_RXNE and USART_IT_IDLE\n\r");
			
			USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);/* 使能接收完成中断 */
			USART_ITConfig(USART1,USART_IT_IDLE,ENABLE); //开启串口空闲中断
			
            while (1)
            {
				//判断数据是否进入驱动板APP
				if(g_ucDriverUpdataSuccess == 1)
				{
					printf("exit yi ci \r\n");
					break;
				}  
				LED4_Out() = 1;
				delay_ms(500);
				LED4_Out() = 0;
				delay_ms(500);
            }
			USART_ITConfig(USART1, USART_IT_RXNE, DISABLE);/* 关闭接收完成中断 */
			USART_ITConfig(USART1,USART_IT_IDLE,DISABLE); //关闭串口空闲中断
			
			USART_ITConfig(RS485_USART, USART_IT_TC, DISABLE);
			USART_ITConfig(RS485_USART, USART_IT_RXNE, DISABLE);
        }
        else
        {
            printf("\r\nLoad APP");
            Iap_Load_App(APPLICATION_ADDRESS);
        }
	}

其中判断校验位置处是否有APP应用程序,采用 flash 地址的最后4个字节作为校验位,正常烧录正确以后,在 flash 地址的最后4个字节处写入 0x5A5A。
在这里插入图片描述
然后开机的时候 首先读取该地址处的校验位是否正确,不正确,则表示上一次烧录错误,需要重新升级。正确则判断是否有升级标志。
在这里插入图片描述

这里的升级标志采用“备份域寄存器”中读取数据。“备份域寄存器”是 可以用于存储掉电不丢失的数据(需要RTC纽扣电池支持)。当我们从APP中接收到需要升级APP的指令,这个时候,我们往“备份域寄存器”中写入 0x5050 表示需要升级APP。如果是接收到升级FPGA的指令,则写入0x7070。然后执行软件复位操作,从APP跳转IAP。IAP中判断“备份域寄存器”的值,然后执行响应的升级操作。
-------------------------------------------------------------------------------------------------------------------------------------------

二、PC端与子控制板卡

pc端升级子控板卡有2种方案:

  • Ymodem协议校验发生在PC端与子控板卡,这个时候,主控板卡指示做一个数据的转发,说白了:串口1从PC端接收到了什么数据,就通过串口2发生出去给子控制板。串口2从子控制板中接收到什么数据,就从串口1发送给PC端。
  • Ymodem协议校验发生在PC端与主控板卡。主控板卡接收到正确的一帧数据后,启动485 发送给子控板卡。子控板卡接收以后直接写入flash。

方案一:
我们先来说说第一种情况,具体框图如下:
在这里插入图片描述
这里有一个点需要注意的地方就是,主控板卡与子控板卡通信是采用485通信,因此需要严格的控制 RS485_EN 使能引脚的时序。否则会导致数据发送错误。
目前,我采用的方案是通过开启几个中断来控制 RS485_En 使能引脚的时序,
开启主控板卡串口1 的接收完成中断,和串口1的空闲中断。
在这里插入图片描述
开启子控制板卡的接收完成中断,和发送完成中断。
在这里插入图片描述
主控板卡中,串口1接收到一个字节后,进入中断,使能RS485_En引脚,控制发送,将数据转发给串口2发送出去,并且清零标志。
当检测到串口空闲中断后,485数据发送完成标志置1。
在这里插入图片描述

在子控制板卡中,发送完成中断用来将 RS485_En 使能切换为接收模式。其中,前提是需要判断接收完成标志是否置一。
子控制板的接收完成中断,是用来判断,子控制板是否烧录完成进入 APP。进入APP以后,会发送指令“$Load Driver”。
主控板接收到指令后,标志置一。跳出IAP 。进入APP。
在这里插入图片描述
经过测试,第一种方案可行。并且稳定性还可以,协议发生需要写入的控制板卡中,这样不容易出现数据丢失的问题。

方案二:
Ymodem 协议传输校验发生在PC端与控制板卡之间,校验通过后,将解析出的一帧数据包,通过启动485发生给子控制板卡,子控制板卡接收后,写入flash。

这种方案的好处是,控制板卡 与 子控制板卡之间没有校验,因此可以同时烧录多个子控制板卡。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

STM32 IAP Ymodem 的相关文章

  • C++:类和对象(下)---对类和对象深入一些的理解

    文章目录 构造函数 初始化列表 explicit关键字 匿名对象 构造函数 初始化列表 前面已然介绍过构造函数 但并未完全结束 构造函数有很多种写法 有带缺省参数的 有全缺省的 不带缺省参数的 但用前面的方法 都是对里面成员变量的一种赋值

随机推荐

  • Jitter Removal in Image and Sequence

    去除重影 消抖 在 jitter removal images and video sequences Using robust decision Based Adaptive spatio temporal median Algorith
  • jupyter notebook环境配置(重写config文件、配置默认工作文件路径、如何解决需要token登陆的问题/解决无法跳转浏览器问题等)

    一 重写config文件 1 输入cmd命令 jupyter notebook generate config 2 根据文件生成路径找到generate config文件 3 双击或者记事本打开jupyter notebook congig
  • Qt入门 工具栏QToolBar和菜单栏QMenuBar(六)

    只有在继承了QMainWindow的窗体 才会有this gt menuBar gt addMenu 以及this gt addToolBar 函数 Qmune QMune与QMenuBar之间的关系见下面的代码 方法1 QMenu men
  • 计算机系统结构选择题

    1 1 多处理机上两个程序段之间同时有先读后写和先写后读两种数据相关 则 C A 交换串行 B 不能并行执行 C 必须并行执行 D 顺序串行 2 输入输出系统硬件的功能对下面哪一类人员是透明的 A A 应用程序员 B 操作系统程序员 C 机
  • matlab 残差 dw,Eviews中的自相关检验与修正操作(一):残差图与DW检验

    自相关是指在时间序列资料中按时间顺序排列的观测值之间存在相关性或在横截面资料中按空间顺序排列的观测值之间存在相关性 它是不满足经典OLS回归的假定之一 自相关问题往往出现在时间序列数据中 所以也经常称为 序列自相关 自相关问题往往采用残差图
  • 2023全国大学生信息安全竞赛(ciscn)初赛题解

    战队信息 安全知识 甚至不用看视频 百度就有答案 除了那个最新的美国时政 其它的ChatGPT就能回答 Misc 签到卡 关注公众号 根据提示 直接print open flag read 国粹 脑洞题 给的题目原图有两排一模一样的麻将 思
  • Postman配置多环境请求地址

    作用 平时用postman测试接口时 同一个接口免不了要在多个环境测试 但是每次都要手动的修改请求的IP地址是在麻烦 可以用此方法提高效率 省事不少 1 创建 点击页面右上角齿轮 2 点击弹出页面右下角的Add按钮 3 填写请求地址 例如
  • 微分算子法个人整理

    陈文灯老师创立的微分算子法 在求解特定的微分方程能够省去大部分的计算时间 很久不写了 这篇为了回顾方便 一同有四种总结 感谢B站BV1D5411776Q的总结 考研加油 稳定发挥
  • [网络安全自学篇] 二十六.Shodan搜索引擎详解及Python命令行调用

    这是作者的系列网络安全自学教程 主要是关于网安工具和实践操作的在线笔记 特分享出来与博友共勉 希望您们喜欢 一起进步 前文分享了Web安全学习路线 并实现了最简单的木马和病毒代码 这篇文章将详细讲述Shodan搜索引擎的基本用法及Pytho
  • Jenkins+Python自动化测试之持续集成详细教程

    前言 今天呢笔者想和大家来聊聊Jenkins Python自动化测试持续集成 废话呢就不多说了哟咱们直接进入主题哟 一 Jenkins安装 Jenkins是一个开源的软件项目 是基于java开发的一种持续集成工具 用于监控持续重复的工作 旨
  • Oracle中如何导出存储过程、函数、包和触发器的定义语句?如何导出表的结构?如何导出索引的创建语句?...

    2019独角兽企业重金招聘Python工程师标准 gt gt gt Oracle中如何导出存储过程 函数 包和触发器的定义语句 如何导出表的结构 如何导出索引的创建语句 QQ群里有人问 如何导出一个用户下的存储过程 麦苗答 方法有多种 可以
  • springboot整合eurake

    Spring Boot整合Eureka是一个比较常见的场景 Eureka是一个服务注册与发现中心 可以方便地管理服务的注册与发现 在整合过程中 需要在pom xml文件中添加对Eureka Server的依赖 并在Spring Boot应用
  • Vue.js 下的瀑布流组件 vue-waterfall

    vue waterfall 详细介绍 Vue js 下的瀑布流组件 ES5 ES6 UMD 兼容 享受数据驱动带来的便利 让事情变得简单
  • 判断t1树中是否有与t2树完全相同的子树

    描述 给定彼此独立的两棵二叉树 树上的节点值两两不同 判断 t1 树是否有与 t2 树完全相同的子树 示例1 输入 1 2 3 4 5 6 7 8 9 2 4 5 8 9 返回值 true 备注 1 n 500000 方法一 递归 要判断t
  • 使用echarts实现简单的关系图谱

    使用echarts实现简单的关系图谱 如图 代码
  • pytorch载入数据与对应的标签,使用torch.utils.data详解,DataLoader的使用

    在进行深度学习处理的时候 我们需要将数据输入到神经网络中进行训练 训练网络的学习能力 其实是根据一定的规则更新网络节点中的参数 而这个规则的来源就是依赖于数据与标签 我们需要将数据与标签相匹配 才能让网络进行训练 比如说网络学习到了一定的特
  • stem教育资源

    人生不同阶段都有不同的使命 在学生阶段 学习掌握知识为以后的人生获得成就的能力 就是这个阶段使命 为了这个使命 他们必须要学习忍耐 学会放弃 学会付出 这不仅仅是学习的需要 也是人生的一种修炼 纵观我们身边的人 但凡取得一定成就的都是要经过
  • 用 LangChain 构建基于资料库的问答机器人(三):ReAct

    大家好 我是 Jambo 我们已经学习了如何使用 LangChain 的一些基本功能 解下我们就应该要结合这些功能来做一些复杂的东西了 但在这之前 为了让同学们更好的理解 LangChain 在这其中做了什么 我想先介绍一下关于 GPT 使
  • 修改索引值python_pandas DataFrame的修改方法(值、列、索引)

    对于DataFrame的修改操作其实有很多 不单单是某个部分的值的修改 还有一些索引的修改 列名的修改 类型修改等等 我们仅选取部分进行介绍 一 值的修改 DataFrame的修改方法 其实前面介绍loc方法的时候介绍了一些 1 loc方法
  • STM32 IAP Ymodem

    STM32 IAP采用Ymodem协议升级固件 公司最近软件需要通过IAP来升级所有板卡的固件 其中板卡有2块 一块主控板卡 一块子控板卡 其中 主控板卡与子控板卡之间采用RS485通信 PC与主控板卡采用RS232通信 具体框架 一 PC