bootloader跳转app卡死(IAP卡死)

1、 关闭所有中断再跳转APP

        一般bootloader跳转到APP时要关闭app中用到的中断(防止中断打断程序的运行,导致程序跑飞),那么查看系统中用到的中断:串口中断、滴答定时器中断,所以,跳转之前要关闭这两个中断:_disable_irq()和systick。

void jumpToApp(void)
{if ( ( ( * ( __IO uint32_t * ) APPLICATIONADDRESS ) & 0x2FFE0000 ) == 0x20000000 ) //检查栈顶地址是否有数据,FLASH写入成功{LCD_ShowString(10,270,210,24,16,"Jumping to run program");//关闭必要中断SysTick->CTRL = 0X00;//禁止SysTickSysTick->LOAD = 0;SysTick->VAL = 0;__disable_irq();JumpAddress = *(__IO uint32_t*) (APPLICATIONADDRESS + 4);//用户代码区第二个字为程序开始地址(复位地址)Jump_To_Application = (pFunction) JumpAddress;//初始化APP堆栈指针(用户代码区的第一个字用于存放栈顶地址)MSR_MSP(*(vu32*)APPLICATIONADDRESS);					//初始化APP堆栈指针(用户代码区的第一个字用于存放栈顶地址)RCC_AHB2PeriphClockCmd( RCC_AHB2Periph_OTG_FS , DISABLE);  //必须失能USB,不然后续代码会因为USB卡死Jump_To_Application();}
}

更新的程序主函数中需要再次使能中断

	SCB->VTOR = 0x08000000|0x60000;__enable_irq();  	 /* 使能总中断 */

2、时钟不匹配问题

我遇到的情况是由于bootload和APP两个代码的时钟源不匹配导致app不运行。bootload用了内部时钟,APP用了外部8M时钟。导致跳转到APP代码时运行到时钟配置就卡死,而时钟没配置成功就无法初始化IO口,也没法发出信号做出提示,看着像app区的代码不运行,但其实还是运行了的。时钟初始化不成功卡死,设置了看门狗,这个时候就会复位。

处理方式:将bootload和APP的时钟源配置成相同的。

3、初始化外设卡死

       解决办法:将外设注销,恢复初始化之前的状态,但也有很大的可能性在APP卡死。

4、IAP跳转最佳思路

在IAP中,判断是否需要跳转APP,需要跳转就在Flash中一个固定地址写入一个标志,我这里就假设写入地址为0x080F FF00,写入标志位0x5555,两个字节的标志位数据。然后执行以下函数,这里就是最经典的一步,复位操作,复位可以让运行环境变得很干净,也不用管哪些外设需要关掉。

void SoftReset(void)
{__set_FAULTMASK(1); // 关闭全部中断NVIC_SystemReset(); // 复位
}int main()
{/* Reset of all peripherals, Initializes the Flash interface and the Systick. */HAL_Init();/* USER CODE BEGIN Init */if (STMFLASH_Read_One_DWord(JUMP_FLG_ADDR) == 1){iap_jump_app();}//1、读JUMP_FLG_ADDR标志 = 0,不需要跳转,则运行升级程序//2、升级程序,写入到FLASH中,写JUMP_FLG_ADDR标志 = 1//3、SoftReset();//4、读JUMP_FLG_ADDR标志 =1,跳转app程序,但此时的环境是:没有初始化任何外设,没有初始化任何时钟,所以不会出现一些莫名奇妙的卡死问题
}

        通过这种方法跳转到APP,是不会出现时钟配置卡死,和外设初始化卡死的现象,特别注意的是,在进入APP之后一定要第一时间将IAP跳转标志清除,否则下一次升级时无法正常运行IAP。

  /* USER CODE BEGIN 1 */SCB->VTOR = 0x8010000;/* USER CODE END 1 *//* Reset of all peripherals, Initializes the Flash interface and the Systick. */HAL_Init();/* USER CODE BEGIN Init */iap_clear_flag(JUMP_FLG_ADDR);

5、MCU的内部FLASH擦写寿命

测试的flash型号是sst39vf160,由于测试时间的问题,只测试了一个扇区4个字节,用了整整一个星期才完成所有测试,测试结果总结如下:
    1、flash有寿命限制,sst39vf160手册上说是10万次,实验片的实测却超过80万次。
    2、每一个位的寿命是独立的,也就是说,一个字节的bit0失效了,bit1仍然可以正常操作。
    3、flash的寿命指的是被改写的次数,如果一次擦除或写操作不改变某一个位的内容,该位就不会被磨损。比如一个字节被反复执行“擦除-写入0xfe”操作,把bit0损坏后,该字节高7位的寿命丝毫不受影响。
    4、flash磨损后,总是表现为擦除不干净,多擦除几次又能够擦干净,随着磨损程度的加剧,越来越难以擦除干净,但只要擦干净了,写入一定是正确的。但写入的数据是否牢固就没有办法测了。
    5、只要原来内容是1的位,总是可以被写入,但只要原来内容是0的位,就只有擦除才能改为1.

    实测数据,对一个字节反复写0和擦除,寿命指的是写0的次数。
    第一次擦除不干净的寿命:876842次
    第一次出现连续两次擦除仍然不干净的寿命:1169465次
    第一次出现连续4次擦除仍然不干净的寿命:1769609次
    第一次出现连续8次擦除仍然不干净的寿命:1886879次

6、EEPROM擦写寿命

EEPROM的写入寿命通常在百万次范围内(如EVASH的EV24C256A支持400万次写入)。但在高频次写入的应用中,写入次数限制可能导致芯片过早失效

根据标准,EEPROM在寿命测试中是允许一定的失效概率的,按照IEEE-STD-1005-1998和JEDEC的标准要求,失效概率允许1%。例如某EEPROM芯片的标称寿命为100万次,那拿100片做寿命试验,在100万次时失效的数量小于等于1.(这1片可能在10万次失效,100万次失效前都计算在内)。

7、架构(bootloader+app)

在一定的时间内如果没有程序需要更新则自动跳转到app地址执行用户程序

内部flash 512K

bootloader 跑裸机 48k 主要实现USB升级和eeprom标志位升级

app 跑freeRtos  464K 程序的基本功能,升级时软件复位开始执行bootloader升级

app2 外部flash(W25Q128)  主要用于将USB读取BIN文件先存放到外部FLASH中,在从外部FLASH写入内部FLASH,可以防止芯片变砖。

1、架构(bootloader+app)

在一定的时间内如果没有程序需要更新则自动跳转到app地址执行用户程序

内部flash 512K

bootloader 跑裸机 48k 主要实现USB升级和eeprom标志位升级

app 跑freeRtos  464K 程序的基本功能,升级时软件复位开始执行bootloader升级

app2 外部flash(W25Q128)  主要用于将USB读取BIN文件先存放到外部FLASH中,在从外部FLASH写入内部FLASH,可以防止芯片变砖。

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

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

相关文章

Vlan和Trunk

VLAN的定义 虚拟局域网,用来在二层网络中隔离广播域不同VLAN的设备在二层网络中无法互相通讯(二层隔离技术) VLAN的转发过程举例 源MAC字段后加上VLAN TAG字段,其中VLAN ID用来标识VLAN。 PC发送数据帧进入交换机,会…

使用SearXNG-搭建个人搜索引擎(附国内可用Docker镜像源)

介绍 SearXNG是聚合了七十多种搜索服务的开源搜索工具。我们可以匿名浏览页面,不会被记录和追踪。作为开发者,SearXNG也提供了清晰的API接口以及完整的开发文档。 部署 我们可以很方便地使用Docker和Docker compose部署SearXNG。下面给出Docker部署Se…

vscode插件live server无法在手机预览调试H5网页

环境 Window10、vscode:1.94.2、Live Server:v5.7.9、Live Server (Five Server):v0.3.1 问题 PC端预览没有问题,但是在手机点击链接显示访问失败 排查 1. 是否同一局域网 意思就是电脑、手机是不是访问同一个网络。电脑插得…

微信互助学习平台(lw+演示+源码+运行)

摘要 随着信息技术在管理上越来越深入而广泛的应用,管理信息系统的实施在技术上已逐步成熟。本文介绍了微信互助学习平台的开发全过程。通过分析微信互助学习平台管理的不足,创建了一个计算机管理微信互助学习平台的方案。文章介绍了微信互助学习平台的…

论文精读:TiC-CLIP: Continual Training of CLIP Models(一)

论文精读:TiC-CLIP: Continual Training of CLIP Models(一) 论文介绍 在多模态学习领域,CLIP(Contrastive Language-Image Pre-training)模型因其在图像和文本联合嵌入方面的卓越性能而受到广泛关注。然而&#xff0…

【C++】vector(1)

😈个人主页: 起名字真南 😈个人专栏:【数据结构初阶】 【C语言】 【C】 目录 引言1 vector 的基本知识1.1 vector 的特点 2 vector 的主要功能和操作2.1 vector 的构造2.2 vector 的增删改查2.3 vector 的容量 引言 在C的标准模板库(STL&…

MySQL——数据库

什么是数据库 数据库(DB , DataBase)概念:数据仓库,软件,安装在操作系统(window,linux,max,...)之上学习数据库最重要的就是学习SQL语句存储500万以下的数据…

鸿蒙HarmonyOS————ArkTs介绍(1)

最近除了人工智能,还有一个很火的HarmonyOS,HarmonyOS是华为公司开发的一款面向全场景的分布式操作系统,旨在为消费者提供跨设备无缝协同体验。它支持多种智能终端设备,包括但不限于智能手机、平板电脑、智能穿戴设备、智能家居设…

<Project-11 Calculator> 计算器 0.3 年龄计算器 age Calculator HTML JS

灵感 给工人发工资是按小时计算的,每次都要上网,我比较喜欢用 Hours Calculator ,也喜欢它的其它的功能, 做个类似的。 我以为是 Python,结果在学 javascript 看 HTML,页面的基础还停留在 Frontpage 2000…

【学术论文投稿】自动化运维:解锁高效运维的密钥

【连续三届IEEE出版|EI检索】第三届图像处理、计算机视觉与机器学习国际学术会议(ICICML 2024)_艾思科蓝_学术一站式服务平台 更多学术会议请看:https://ais.cn/u/nuyAF3 目录 引言 一、自动化运维概述 1. 自动化运维的定义 2. 自动化运…

Qt中使用线程之QRunnable

1、自定义1个子类继承自QRunnable 2、重写run方法,编写子线程的业务逻辑 3、使用QThreadPool的全局方法来开启这个线程 4、线程的回收不需要关注,由QThreadPool处理 5、缺点:无法使用信号槽机制 6、适合一些不需要和主线程通信的耗时的任…

SpringBoot中大量数据导出方案:使用EasyExcel并行导出多个excel文件并压缩zip后下载

文章目录 前言一、控制器层代码二、服务层代码三、代码亮点分析 前言 SpringBoot的同步excel导出方式中,服务会阻塞直到Excel文件生成完毕,如果导出数据很多时,效率低体验差。有效的方案是将导出数据拆分后利用CompletableFuture,…

【图论】(四)最小生成树与拓扑排序

最小生成树与拓扑排序 最小生成树之prim(P算法)相关概念结题思路拓展 最小生成树之kruska(K算法)过程模拟程序实现拓展 拓扑排序背景与思路模拟过程程序实现 最小生成树之prim(P算法) 相关概念 P算法是用…

『完整代码』坐骑召唤

创建一个按钮 作为召唤/消失坐骑的开关 将预制体放入指定文件夹 命名为Mount01 创建脚本并编写:CallMount.cs using UnityEngine; using UnityEngine.UI; public class CallMount : MonoBehaviour{public Button callBtn;GameObject mountPrefab;GameObject mountIn…

CentOS7 上安装GitLab的经历

一、安装必要的基础环境 1.安装依赖包 [rootgitlab-server ~]#yum install curl policycoreutils openssh-server openssh-clients postfix wget git patch -y [rootgitlab-server ~]# systemctl start postfix 2.配置yum源(由于网络问题,国内用户请使用清华大学…

导数的概念及在模型算法中的应用

一. 导数概念与计算 1. 导数的物理意义: 瞬时速率。一般的,函数yf(x)在x处的瞬时变化率是 2. 导数的几何意义: 曲线的切线,当点趋近于P时,直线 PT 与曲线相切。容易知道,割线的斜率是当点趋近于 P 时&…

数字孪生:引领智慧农业的未来

在现代农业中,数字化与智能化的浪潮正在改变传统的种植方式。数字孪生技术作为一种创新的数字化解决方案,正在深刻改变智慧农业的面貌,尤其是在大棚智能控制、数据全面可视、加工过程监控和物流运输溯源等方面展现出巨大的潜力。 frontop数字…

【动手学深度学习】8.1. 序列模型(个人向笔记)

想象一下有人正在看网飞(Netflix,一个国外的视频网站)上的电影。 一名忠实的用户会对每一部电影都给出评价, 毕竟一部好电影需要更多的支持和认可。 然而事实证明,事情并不那么简单。 随着时间的推移,人们对…

《Python基础教程》笔记(ch0-1)

前言 在Python生态系统中,各种包轮番登场,各种编码实践大行其道后又日渐式微。 引言 Python是什么?为何要使用它?官方宣传说:Python是一种面向对象的解释性高级编程语言,具有动态语义。 这句话的要点在…

监控易DEMO功能深度解析:运维行业的智能化转型新助力

在数字化转型的浪潮中,运维行业正面临着前所未有的变革与挑战。为了应对日益复杂的IT架构和不断提升的运维需求,监控易的集中式跨平台一体化监控软件不断升级优化,以适应新的运维环境。本文将对监控易DEMO的功能进行深度解析,探讨…