上位机图像处理和嵌入式模块部署(mcu之iap升级)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】

        mcu种类很多,如果是开发的时候需要对固件升级,整体还是比较容易的。不管是dap,还是st-link v2、j-link,这对程序员来说都不是什么难事。毕竟,修改代码,升级固件是常有的事情。但是一旦产品销售出去,客户或者售后需要对产品进行升级的时候,这种情况下,升级还是做的简单一点比较好。所以这个时候就出现了iap升级。所谓来的iap,In Application Programming,就是等mcu启动之后再进行升级。

        今天分析的代码来自于geehy apm32f103 demo,有兴趣的同学可以去下载看看。

1、mcu启动方式

        要实现iap升级,一般会有两个固件。第一个固件是bootloader,它是专门负责下载固件、升级固件、地址跳转的;第二个固件就是用户固件,是存放业务代码的地方,也就是需要被升级的内容。系统启动后,默认一开始是启动bootloader,如果发现没有固件需要升级,会直接jump到第二个用户固件的地方,继续运行处理。

2、升级的方式

        目前升级的方式有两种,一种是ttl串口,一种是usb,前者居多。如果合适的话,其实用eth也可以的。关键是看bootloader愿意占用多大的空间。因为这部分内容是完全不能覆盖的。

3、用户固件和普通固件有什么区别

        bootloader固件是一直保存在flash上的,所以用户固件只能放到flash的另外一个位置。所以,首先用户固件需要调整一下hex文件中flash的偏移位置,

        其次,因为中断向量首地址发生了变化,所以这部分代码也要做修改。

    sys_nvic_set_vector_table(NVIC_VECT_TAB_FLASH, FLASH_APP1_ADDR);

4、bootloader有哪些需要实现

        开发流程上来说,bootloader和普通的固件没有什么区别。只不过它的功能是和上位机交互,实现下载固件、烧录固件和跳转固件的功能。所有的工作都是围绕这三个方面进行的。如果下载的固件比较大,一般还要分多次下载,毕竟mcu里面ram空间有限,不一定放得下,flash烧写也需要一定的时间。

void USART_UX_IRQHandler(void)
{  if (USART_ReadIntFlag(USART_UX, USART_INT_RXBNE) == SET) {g_rx_buffer[0] = USART_RxData(USART_UX);if (g_usart_rx_cnt < USART_REC_LEN){g_usart_rx_buf[g_usart_rx_cnt] = g_rx_buffer[0];g_usart_rx_cnt++;}USART_ClearIntFlag(USART_UX, USART_INT_RXBNE);  }
}

        由代码可以看出,所有的接收都是放在中断进行的。这部分可以通过上位机发送文件的方式来解决。注意,这里发送的文件只能是bin文件,不能是hex文件。那么什么时候确认文件发送结束呢,比较简单的办法就是查看新一次循环之后没有接收到新的数据,就可以认为数据接收结束了。当然这种方法有点粗暴,也可以提前把长度告诉bootloader,让bootloader自己来决定什么时候停止接收bin文件。

        if (g_usart_rx_cnt != 0){if (lastcount == g_usart_rx_cnt)         {applenth = g_usart_rx_cnt;lastcount = 0;g_usart_rx_cnt = 0;printf("Finished receiving!\r\n");printf("Total length:%dBytes\r\n", applenth);}else{lastcount = g_usart_rx_cnt;}}

        接收完数据之后,下面就开始片内flash的烧录流程,

                if (applenth != 0){printf("Copying APP2FLASH...\r\n");if (((*(volatile uint32_t *)(0x20001000 + 4)) & 0xFF000000) == 0x08000000){iap_write_appbin(FLASH_APP1_ADDR, g_usart_rx_buf, applenth);printf("Copy APP Successed!!\r\n");}else{printf("Illegal FLASH APP!  \r\n");}}else{printf("No APP!\r\n");}

        烧录完成,最后一步其实就比较简单了,最关键的就是设置堆栈和pc跳转,

            do{printf("flash addr :%x \r\n",(*(volatile uint32_t *)(FLASH_APP1_ADDR + 4)) & 0xFF000000);if (((*(volatile uint32_t *)(FLASH_APP1_ADDR + 4)) & 0xFF000000) == 0x08000000){delay_ms(10);iap_load_app(FLASH_APP1_ADDR);}else{printf("No APP!\r\n");}clearflag = 7;break;}while(0);

        这里实现堆栈设置和pc跳转的函数时iap_load_app,细节部分是这样的,其中jump2app是一个函数指针,iapfun是函数指针类型定义,

void iap_load_app(uint32_t appxaddr)
{if (((*(volatile uint32_t *)appxaddr) & 0x2FFE0000) == 0x20000000){jump2app = (iapfun)*(volatile uint32_t *)(appxaddr + 4);sys_msr_msp(*(volatile uint32_t *)appxaddr);jump2app();}
}

5、iap功能移植

        之前使用了几个国产mcu芯片,发现它们基本都带有了iap功能。这里面有极海geehy mcu、兆易创新gd32 mcu、以及沁恒ch32 mcu。不过这部分功能是mcu常用的一个功能,如果有可能的话,建议还是把iap修改成和底层mcu解耦的通用功能,这样将来会容易很多。

6、iap的另外一层考虑

        如果不使用iap升级固件,那么就需要swd接口放开。而swd放开的话,有可能mcu固件有被人读取、逆向的风险。而有了bootloader之后,我们就可以添加很多的保密措施,并且不提供swd接口。有的同学可能会问,没有swd,怎么烧录mcu,其实真的遇到这种情况的话,用专门的mcu烧录器就可以解决这个问题。而我们自己开发的mcu固件一旦被人破解了,后果其实是相当严重,不仅浪费了研发成本,还有可能带来产品销售的直接损失。

7、iap和用户固件部署

        iap一般是预先烧录在mcu里面的,等到mcu焊接到开发板上之后,再用上位机对mcu进行二次烧录。当然,烧录之后也会做一些测试。甚至为了产线测试,会专门有一些测试的用户固件,这都是有可能的。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/31407.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Modbus协议转Profibus协议网关接温控表与PLC通讯

一、前言 在智能化飞速发展的时代&#xff0c;各个行业都在使用自动化系统。在智能楼宇系统中&#xff0c;温控表和PLC&#xff08;可编程逻辑控制器&#xff09;通讯是至关重要的&#xff0c;在智能楼宇系统中&#xff0c;温控表起着监测和控制室内温度的重要作用。而PLC作为…

Elasticsearch中的Term_Filter过滤器技术

文章目录 一、引言二、Term Filter的工作原理与内部机制三、Term Filter的多样化使用场景3.1 精确匹配3.2 过滤分类与标签3.3 数据范围筛选3.4 复杂查询的构建 四、Term Filter的最佳实践与应用建议4.1 避免使用分析器4.2 优化索引映射4.3 充分利用缓存4.4 持续监控性能 五、结…

【地质灾害监测实现有效预警,44人提前安全转移】

6月13日14时&#xff0c;国信华源地质灾害监测预警系统提前精准预警&#xff0c;安全转移10户44人。 该滑坡隐患点通过科学部署国信华源裂缝计、倾角加速度计、雨量计、预警广播等自动化、智能化监测预警设备&#xff0c;实现了对隐患点裂缝、位移、降雨量等关键要素的实时动态…

CyclicBarrier(应对并发问题的工具类)

CyclicBarrier 5.3.1 概述以及基本使用 CyclicBarrier的字面意思是可循环使用&#xff08;Cyclic&#xff09;的屏障&#xff08;Barrier&#xff09;。它要做的事情是&#xff0c;让一组线程到达一个屏障&#xff08;也可以叫同步点&#xff09;时被阻塞&#xff0c;直到最后…

JNPF低代码开发平台:推进供应链数字化进程

随着全球贸易的日益频繁和市场竞争的加剧&#xff0c;供应链的数字化已经成为企业提高竞争力、降低成本、提高效率的关键因素。在这个过程中&#xff0c;低代码开发平台以其高效、灵活的特点&#xff0c;成为了推动供应链数字化进程的重要工具。本文将以JNPF低代码开发平台为例…

PgSQL-添加列、字段的注释

mysql是&#xff1a; 添加列&#xff1a;--alter table 表名 add column 列名 varchar(30);ALTER TABLE p_show ADD COLUMN points VARCHAR(100) COMMENT 所需积分;---------------------------------------------------------------------------------------------添加、修改…

与神对话-2

目录 三卷书&#xff0c;它们是&#xff1a; 第一卷将主要涉及个人问题&#xff0c;聚焦在个人生活中的各种挑战和机遇。第二卷将涉及更带全球性的问题&#xff0c;这个星球上的地域政治和超自然的生活。以及这个世界正在面临的挑战。第三卷将涉及最高秩序的宇宙真理&#xf…

Jmeter性能 之 “查看结果树” 界面功能介绍

前言 查看结果树 显示所有请求响应的树&#xff0c;通过它可以查看任何请求的响应。除了显示响应之外&#xff0c;还可以查看获取响应所花费的时间以及一些响应代码。需要通过"查看结果树"来查看服务器处理请求之后的返回结果&#xff0c;分析是否存在问题 注意&am…

Typora v1.8.6解锁版安装教程 (轻便简洁的Markdown编辑器)

前言 Typora是一款轻便简洁的Markdown编辑器&#xff0c;支持即时渲染技术&#xff0c;这也是与其他Markdown编辑器最显著的区别。即时渲染使得你写Markdown就想是写Word文档一样流畅自如&#xff0c;不像其他编辑器的有编辑栏和显示栏。 一、下载地址 下载链接&#xff1a;…

传染病报卡内容——丙型

--丙型 select a.morbiditdate 发病日期, diagnosedate 诊断日期, a.deathdate 死亡日期, a.casetypequality 病例分类,a.hcvrna "HCR_RNA定量" from zl_sdmb.t_报卡记录 t, c1_infectiousv1_6 a where t.id a.fileid and t.卡片种类 传…

架构设计 - 本地热点缓存

摘要&#xff1a; 缓存体系架构&#xff1a; 一级缓存&#xff1a;JVM本地缓存 二级缓存&#xff1a;Redis集中缓存 三级缓存&#xff1a;Nginx缓存&#xff08;Proxy Cache缓存&#xff1b;Lua缓存&#xff09; Java&#xff08;或任何编程语言&#xff09;中的本地热点缓…

游戏测试工程师面试,常问的问题有哪些?

一般会在面试中了解以下方面&#xff1a; 1.游戏热情&#xff0c;理解程度 玩过哪些游戏&#xff0c;这些游戏玩过多长时间&#xff0c;玩到什么样的水平&#xff0c;在游戏里花过多少钱 你觉得游戏里&#xff0c;xxx的设计如何&#xff0c;评价一下 2.编程、测试相关 学过哪…

使用注解配置定义和管理 Spring Bean

Spring 框架提供了多种方式来定义和管理 Bean&#xff0c;其中使用注解配置是现代 Spring 应用程序中最常用和推荐的方式。注解配置简化了 Bean 的定义和依赖注入过程&#xff0c;使代码更简洁、更易读。本文将详细介绍如何使用注解配置来定义和管理 Spring Bean。 一、Spring…

任务3.8.3 利用RDD统计每日新增用户

任务目标 统计给定用户访问历史数据中&#xff0c;每日的新增用户数量。 数据准备 原始数据格式&#xff1a;每行包含两个字段&#xff0c;日期和用户名&#xff0c;以逗号分隔。示例数据&#xff1a;2024-05-01,mike 2024-05-01,alice 2024-05-01,brown ...解决方案 使用倒…

【2024.6.21】今日科技时事:科技前沿大事件

人不走空 &#x1f308;个人主页&#xff1a;人不走空 &#x1f496;系列专栏&#xff1a;算法专题 ⏰诗词歌赋&#xff1a;斯是陋室&#xff0c;惟吾德馨 目录 &#x1f308;个人主页&#xff1a;人不走空 &#x1f496;系列专栏&#xff1a;算法专题 ⏰诗词歌…

Notepad++插件 Hex-Edit

Nptepad有个Hex文件查看器&#xff0c;苦于每次打开文件需要手动开插件显示Hex&#xff0c;配置一下插件便可实现打开即调用 关联多个二进制文件&#xff0c;一打开就使用插件的方法&#xff0c;原来是使用空格分割&#xff01;&#xff01;&#xff01;

Java图形用户界面设计AWT事件处理

AWT事件处理 前言一、GUI事件处理机制定义使用步骤Swing事件处理机制与AWT的区别 二、GUI中常见事件和事件监听器事件低级事件高级事件 事件监听器AWT事件类的继承关系 三、事件适配器三、示例代码示例示例一示例二 示例三 前言 推荐一个网站给想要了解或者学习人工智能知识的…

Hi3861 OpenHarmony嵌入式应用入门--LiteOS Thread

目录 Thread API 主要接口说明 测试代码编写 代码分析 hi3861使用的实时系统主要是基于Huawei LiteOS-M&#xff0c;这是华为针对物联网领域推出的轻量级物联网操作系统内核。LiteOS-M是Huawei LiteOS的一个分支&#xff0c;专为IoT领域构建&#xff0c;主要面向没有MMU&am…

sqlmap使用以及GUI安装

下载 GUI版地址: GitHub - honmashironeko/sqlmap-gui: 基于官版本 SQLMAP 进行人工汉化&#xff0c;并提供GUI界面及多个自动化脚本 GUI使用 可以点击.bat启动 如果点击.bat启动不了就在这里打开cmd,输入对应的.bat来启动 linux安装 地址:sqlmap: automatic SQL injection…

c++中串口的安全封装使用

固定缓冲区大小&#xff1a;在这种情况下&#xff0c;你将缓冲区大小固定为4096字节。如果你的数据量可能超过这个限制&#xff0c;可能需要反复调用读取操作以确保读取完整的数据。 局部变量初始化&#xff1a;在C中&#xff0c;局部变量如果不是内置类型&#xff08;如int、…