AT32F415的OTA升级

news2024/11/24 2:46:26

AT32F415的OTA升级

  • 项目简介
    • IAP实现原理
    • AT32中的内置FLASH分配情况
    • AT32中的实现过程
      • 跳转到APP的程序代码
      • 删除APP区域的FLASH空间代码
      • 写APP的bin数据到FLASH空间代码

项目简介

在物联网应用开发过程中,不可避免的会需要用到软件升级,一般情况下,以AT32系列芯片为主控制器的设备在出厂时就已经使用J-Link仿真器将应用代码烧录了,如果在设备使用过程中需要进行应用代码的更换、升级等操作的话,则可能需要将设备返回原厂并拆解出来再使用J-Link重新烧录代码,这就增加了很多不必要的麻烦。站在公司的角度来说,就是能远程来更换设备里边的代码程序。IAP却能很好的解决掉这个难题。

IAP实现原理

一片ARM芯片的Code(代码)区内一般只有一个用户程序。而IAP方案则是将代码区划分为两部分,两部分区域各存放一个程序,一个叫bootloader(引导加载程序),另一个较user application(用户应用程序)。bootloader在出厂时就固定下来了,在需要变更user application时只需要通过触发bootloader对userapplication的擦除和重新写入即可完成用户应用的更换。如图所示
bootloader原理图
在程序执行初始进入bootloader,在bootloader里面检测条件是否被触发(串口是否接收到特定的数据),如果有则进行对user application进行擦除和重新写入操作,如果没有则直接跳转到user application执行应用;如果有则进行擦除用户代码并重新写入新的用户代码。

AT32中的内置FLASH分配情况

在这里插入图片描述
AT32程序启动顺序如下图所示
在这里插入图片描述

AT32中的实现过程

BootLoader流程图大致应该如下:

1、初始化时钟。
2、初始化中断向量表地址。
3、初始化串口。
4、检测串口是否收到0xab,是则执行步骤5,否则执行步骤9。
5、擦除用户程序(擦除0x08004000—0x0803ffff地址空间Flash)。
6、从串口读取新的用户代码数据,把代码写入用户程序空间。
7、检测串口数据接收完毕?是则执行步骤9,否则跳回步骤7。
8、用户程序更新完毕,等待重新上电或硬件复位。
9、跳转到用户程序(强制将PC指针跳转到0x08004000+4处)。

跳转到APP的程序代码

void jump_to_app(uint32_t address)
{
	uint32_t stkptr, jumpaddr;
	stkptr = *(uint32_t*)address;
	jumpaddr = *(uint32_t*)(address + sizeof(uint32_t));

	
	//中断失能,串口1为程序下载口,串口2为日志打印口
	nvic_irq_disable(USART1_IRQn);
	nvic_irq_disable(USART2_IRQn);
	__NVIC_ClearPendingIRQ(USART1_IRQn);
	__NVIC_ClearPendingIRQ(USART2_IRQn);

	//关闭串口外设时钟
	crm_periph_clock_enable(CRM_USART1_PERIPH_CLOCK, FALSE);
	crm_periph_reset(CRM_USART1_PERIPH_RESET, TRUE);
	crm_periph_reset(CRM_USART1_PERIPH_RESET, FALSE);

	crm_periph_clock_enable(CRM_USART2_PERIPH_CLOCK, FALSE);
	crm_periph_reset(CRM_USART2_PERIPH_RESET, TRUE);
	crm_periph_reset(CRM_USART2_PERIPH_RESET, FALSE);
	
	//设置跳转地址
	__set_MSP(stkptr);
	//设置APP程序地址
	pftarget = (void (*)(void))jumpaddr;
	//执行APP程序
	pftarget();
}

删除APP区域的FLASH空间代码

void DelAppCodeArea(void)
{
    int page_index;
    //flash记得解锁,我在调试的时候忘记解锁,导致失败
    flash_unlock();
    for (page_index = 0; page_index <= FLASH_APP_PAGE_COUNT; page_index++)
    {
        flash_sector_erase(FLASH_APP_ADDRESS + page_index * PAGE_SIZE);
        wdt_counter_reload();
    }
    //操作完记得加锁
    flash_lock();
}

写APP的bin数据到FLASH空间代码

void writeToFlash(uint8_t *pdata, uint32_t len)
{
    flash_unlock();
    uint32_t remainLen, i;
    wdt_counter_reload();
    remainLen = PAGE_SIZE - codeCacheIndex; //  codeCache剩余空间

    // codeCache还剩空间
    if (remainLen > len)
    {
        memcpy(codeCache + codeCacheIndex, pdata, len);
        codeCacheIndex += len;
    }
    else
    {
        memcpy(codeCache + codeCacheIndex, pdata, remainLen); // codeCache已经满了,写入flash

        if (programPageSeq <= FLASH_APP_PAGE_COUNT)
        {
            flash_sector_erase(FLASH_APP_ADDRESS + programPageSeq * PAGE_SIZE);

            for (i = 0; i < PAGE_SIZE; i += 2)
            {
                flash_halfword_program(FLASH_APP_ADDRESS + programPageSeq * PAGE_SIZE + i, *(uint16_t *)(codeCache + i));
                wdt_counter_reload();
            }
            programPageSeq++;
        }
        codeCacheIndex = len - remainLen; // 剩余的data放入codeCache
        memset(codeCache, 0xff, PAGE_SIZE);
        if (codeCacheIndex)
            memcpy(codeCache, pdata + remainLen, codeCacheIndex);
    }
    flash_lock();
}

详细工程可以直接联系我获取。

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

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

相关文章

C# Hash算法之MD5、SHA

MD5我们用的还是比较多的&#xff0c;一般用来加密存储密码。但是现在很多人觉MD5可能不太安全了&#xff0c;所以都用上了SHA256等来做加密&#xff08;虽然我觉得都差不多,MD5还是能玩&#xff09;。 还是跟上一篇说的一样&#xff0c;当一个算法的复杂度提高的同时肯定会带…

linux dlopen手册翻译

名称 dlclose, dlopen, dlmopen 打开和关闭一个共享对象 简介 #include <dlfcn.h> void *dlopen(const char*filename, int flags); int dlclose(void *handle);#define _GNU_SOURCE #include <dlfcn.h> void *dlmoopen(Lmid_t lmid, const char *filename, int…

【C++ Primer Plus习题】12.4

大家好,这里是国中之林! ❥前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站。有兴趣的可以点点进去看看← 问题: 解答: main.cpp #include <iostream> #include "Stack.h"…

磁电偶极子天线学习1 一种60GHz 宽带圆极化口径耦合磁电偶极子天线阵列

摘要&#xff1a; 一种新型的圆极化口径耦合天线被提出。这种圆极化磁电偶极子天线由刻蚀在短路基片集成波导的一部分的宽臂上&#xff0c;并且很容易被集成基片。在工作频段内实现了宽于28.8%的阻抗带宽和宽带3-dB的25.9%的轴比和的增益。此外&#xff0c;因为圆极化辐射由两个…

稀有卡牌手游【植物大战僵尸】源码

稀有卡牌手游【植物大战僵尸】完整代码&#xff0c;画面精美&#xff0c;非常好玩。代码下载

机器学习1——手把手教你用Python跑一个线性回归模型

目录 一、前期准备 1.Scikit-learn 2.matplotlib 二、机器学习过程 三、代码框架 四、完整代码 1.导入所需库 2.准备训练数据 3.喂入训练数据 4.结果预测 5.输出模型中的w与b值 6.可视化 7.传入不规则数据 一、前期准备 在机器学习中我们使用Python居多&…

基于OMS构建OceanBase容灾双活架构的实践

在实际生产环境中&#xff0c;对于关键业务&#xff0c;往往会有容灾双活的需求。除了OceanBase提供的主备库能力&#xff0c;通过官方工具OMS也可以实现容灾双活架构。目前&#xff0c;通过OMS实现的双活架构仅支持OceanBase数据库之间的数据同步。 要通过OMS实现双活架构&am…

使用Node-API进行线程安全开发

一、Node-API线程安全机制概述 Node-API线程安全开发主要用于异步多线程之间共享和调用场景中使用&#xff0c;以避免出现竞争条件或死锁。 1、适用场景 异步计算&#xff1a;如果需要进行耗时的计算或IO操作&#xff0c;可以创建一个线程安全函数&#xff0c;将计算或IO操作放…

C#程序 Debugger,Release都没问题,但是,打包安装后:System.FormatException: 输入字符串的格式不正确

前言&#xff1a; 这是个问题解决&#xff0c;我们先谈问题&#xff1a; 这个问题不会再本地的调试机器上出现&#xff0c;但是&#xff0c;出现在你部署&#xff0c;或者说安装到其他的机器&#xff08;通过VS构建安装项目来做&#xff09; C#程序 Debugger&#xff0c;Relea…

javascript的模块化

1. 无模块化 script标签引入js文件&#xff0c;相互罗列&#xff0c;但是被依赖的放在前面&#xff0c;否则使用就会报错。如下&#xff1a; <script src"jquery.js"></script><script src"jquery_scroller.js"></script><scr…

Linux block_device gendisk和hd_struct到底是个啥关系

本文的源码版本是Linux 5.15版本&#xff0c;有图有真相&#xff1a; 1.先从块设备驱动说起 安卓平台有一个非常典型和重要的块设备驱动&#xff1a;zram&#xff0c;我们来看一下zram这个块设备驱动加载初始化和swapon的逻辑&#xff0c;完整梳理完这个逻辑将对Linux块设备驱…

.NET 一款用于解密web.config配置的工具

01阅读须知 此文所提供的信息只为网络安全人员对自己所负责的网站、服务器等&#xff08;包括但不限于&#xff09;进行检测或维护参考&#xff0c;未经授权请勿利用文章中的技术资料对任何计算机系统进行入侵操作。利用此文所提供的信息而造成的直接或间接后果和损失&#xf…

位运算:带带孩子吧,孩子很强的!

快速进制 在聊到位运算之前&#xff0c;不妨先简单过一遍二进制的东西。熟悉二进制和十进制的快速转换确实是掌握位运算的基础&#xff0c;因为位运算直接在二进制位上进行操作。如果不熟悉二进制表示&#xff0c;很难直观理解位运算的效果。 这里主要涉及二进制和十进制之间…

蓝桥杯嵌入式国三备赛经验分享

1 学习STM32入门视频 向大家推荐一套宝藏级别的视频&#xff1a;【STM32入门教程-2023版 细致讲解 中文字幕】 如果已经比过蓝桥杯单片机或学习过单片机相关课程的同学&#xff0c;你们可以尝试不需要STM32套件进行学习。如果没有学过单片机相关课程的同学&#xff0c;可以买…

直击智博会,supOS加快发展新质生产力,赋能全球工厂数字化转型

9月6日&#xff0c;第十四届智慧城市与智能经济博览会&#xff08;以下简称智博会&#xff09;开幕主题活动在宁波举办。本届智博会着重围绕“数字赋能新型工业化”主题&#xff0c;设置开幕活动、展览展示和前瞻研讨、产数合作、赛事赋能、开放活动等4大板块活动&#xff0c;旨…

全球AI产品Top100排行榜

Web Top50的榜单里&#xff0c;AIGC类型的应用占比52%&#xff0c;遥遥领先。AIGC类型包括图像、视频、音乐、语音等的内容生成和编辑。音乐生成应用Suno在过去六个月中的排名跃升最为显著&#xff0c;从第36位上升至第5位。排名第二大类是通用对话/AI聊天/角色扮演类型的应用&…

银河麒麟系统开机自动进入指定账户(如:root)桌面

目录 1. 需求的提出 2. 机器环境说明 3. 解决方法 4. 附加说明 1. 需求的提出 编写好的软件在客户的装有银河麒麟操作系统的机器上运行&#xff0c;但有些操作必须用root权限才能操作&#xff0c;如&#xff1a;打开串口。Linux下的普通账户打开串口时提示权限不足。在普通…

【HarmonyOS NEXT】实现截图功能

【HarmonyOS NEXT】实现截图功能 【需求】 实现&#xff1a;实现点击截图按钮&#xff0c;实现对页面/组件的截图 【步骤】 编写页面UI Entry Component struct Screenshot {BuildergetSnapContent() {Column() {Image().width(100%).objectFit(ImageFit.Auto).borderRadi…

C++入门(06)安装QT并快速测试体验一个简单的C++GUI项目

文章目录 1. 清华镜像源下载2. 安装3. 开始菜单上的 QT 工具4. 打开 Qt Creator5. 简单的 GUI C 项目5.1 打开 Qt Creator 并创建新项目5.2 设计界面5.3 添加按钮的点击事件5.4 编译并运行项目 6. 信号和槽&#xff08;Signals and Slots&#xff09; 这里用到了C类与对象的很多…

网络协议详解

目录 1.认识网络协议 2网络协议的设计 2.1网络通信的问题 2.2网络协议的分层设计 软件分层与网络分层 3.OSI七层网络模型 各层次的介绍如下 4.TCP/IP 五层协议 各层次说明 各层次所解决的问题 5.网络和操作系统之间的关系 单主机下 多主机下 6.重新理解网络协议 …