上位机图像处理和嵌入式模块部署(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;实现了对隐患点裂缝、位移、降雨量等关键要素的实时动态…

PgSQL-添加列、字段的注释

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

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

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

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

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

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

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

任务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…

记忆化搜索——AcWing 901. 滑雪

记忆化搜索 定义 记忆化搜索是一种结合了搜索和动态规划思想的方法。它通过将已经计算过的结果存储起来&#xff0c;在后续遇到相同情况时直接返回存储的结果&#xff0c;避免重复计算。 运用情况 当问题可以用递归方式求解&#xff0c;但存在大量重复计算时。一些复杂的组…

收藏||电商数据采集流程||电商数据采集API接口

商务数据分析的流程 第一步&#xff1a;明确分析目的。首先要明确分析目的&#xff0c;并把分析目的分解成若干个不同的分析要点&#xff0c;然后梳理分析思路&#xff0c;最后搭建分析框架。 第二步&#xff1a;数据采集。主流电商API接口数据采集&#xff0c;一般可以通过数…

顶顶通呼叫中心中间件-私有化asrproxy安装指南

一、安装asrproxy 上传asrproxy安装包到服务器目录&#xff1a;/root 上传完成之后依次执行下面的命令即可依次执行以下命令 cd ~mkdir -p /ddt/asrproxyunzip asrproxy_*.zip -d /ddt/asrproxycd /ddt/asrproxychmod x installlib.sh./installlib.shchmod x asrproxychmod x…

工控巨头去年业绩飙升10%,今年250亿出售子业务给美国黑石集团,意欲何为?...

导语 大家好&#xff0c;我是社长&#xff0c;老K。专注分享智能制造和智能仓储物流等内容。 新书《智能物流系统构成与技术实践》 更多的海量【智能制造】相关资料&#xff0c;请到智能制造online知识星球自行下载。 在工业自动化领域&#xff0c;艾默生一直以其卓越的技术和强…

CubeFS - 新一代云原生存储系统

CubeFS 是一种新一代云原生存储系统,支持 S3、HDFS 和 POSIX 等访问协议,支持多副本与纠删码两种存储引擎,为用户提供多租户、 多 AZ 部署以及跨区域复制等多种特性。 官方文档 CubeFS 作为一个云原生的分布式存储平台,提供了多种访问协议,因此其应用场景也非常广泛,下面…

驱动芯片退饱和保护(DESAT)

短路测试和双脉冲测试。 功率模块的短路承受能力的评估分为短路时间评估和短路能量评估两大类。短路时间由短路检测时间与短路关断时间共同构成 短路检测需要兼顾时效性与抗扰性能&#xff0c;要求系统能够及时响应&#xff0c;避免功率模块损坏。同时能够屏蔽开关过程的干扰…

车辆轨迹预测系列 (一):轨迹预测方法综述解析

文章目录 车辆轨迹预测系列 (一)&#xff1a;轨迹预测方法综述解析1、Contextual FactorsPhysics-related factors (物理相关因素):Road-related factors (道路相关因素):Interaction-related factors (交互相关因素): 2、Output TypesUnimodal Trajectory Prediction(单一模式…