当前位置: 首页 > news >正文

【[STM32]标准库-自定义BootLoader】

[STM32]标准库-自定义BootLoader

  • Bootloader
    • Bootloader的实现
    • BOOTloader工程
    • APP工程

Bootloader

bootloader其实就是一段启动程序,它在芯片启动的时候最先被执行,可以用来做一些硬件的初始化或者用作固件热更新,当初始化完成之后跳转到对应的应用程序中去。

bootloader程序需要通过下载器烧写到芯片中,而APP则可以通过有线方式的UART、IIC、USB、SPI等总线来通过bootloader来更新,视所设计的bootloader程序而定。另外,对于无线方式热更新APP,一般是用WiFi、bluetooth通过UART透传的方式烧写芯片APP程序。

Bootloader的实现

本次采用STM32F429IGT6单片机,Flash共有1MB大小,SRAM共有256KB。
本次设计一个Bootloader和一个APP程序,空间分别如下:
BOOTloader程序起始地址0x0800 0000分配大小为0xA000,40KB,
注意按照扇区对齐(比如4KB一个扇区)
APP程序起始地址0x0800 A000分配的大小为0xF6000,984KB。
在这里插入图片描述STM32的中断向量表和栈顶地址
STM32Fx有一个中断向量表,这个中断向量表存放代码开始部分的后4个字节处(即0x08000004),代码开始的4个字节存放的是栈顶地址。
栈是从高到低分配,高地址到低地址
堆是从低到高分配,低地址到高地址

排列格式如下
在这里插入图片描述 我们知道一般情况下,我们下载的代码放在0x08000_000这个位置,为了实现bootloader,我们可以将下载代码的位置整体往后挪一段空间,比如我们挪到0x0800_3000,那么这之前挪动空出来的一段空间,我们就可以用来存放我们的bootloader程序。系统上电后先运行bootloader,bootloader决定是否要更新app,最后跳转到0x0800 3000这个位置执行。
在这里插入图片描述上图为SystemInit中修改用户app存放位置(0x0800 3000)的地方,SystemInit在启动文件中用到,它会在复位后,在main函数运行之前运行;
在这里插入图片描述

BOOTloader工程

bootloader和App都是完整的STM32工程,区别在于工程所实现的功能和占用Flash的大小。由于Bootloader的功能比较单一,并且为了节约Flash留给用户App,Bootloader一般不带操作系统,所占用的Flash较小。APP是完整的用户程序,按照正常的设计流程进行设计,只需要在工程配置和部分初始化代码处进行修改。

设置工程起始地址,及其大小
在这里插入图片描述中断向量表的地址偏移
调用函数NVIC_SetVectorTable()进行配置。BOOT工程一般不需要配置

执行BOOT后,跳转到APP程序中
注意点:

检查堆栈地址是否有效,单片机的RAM大小为0x30000,0x3000 0000 - 0x3000 = 0x2FFD 0000,也可以用其他方法来计算RAM是否超过单片机的范围

关闭全局中断,__set_PRIMASK(1);仅只剩下NMI 和硬 fault 可以响应,记得在APP工程设置__set_PRIMASK(0);

复位BOOT工程中用到的外设

函数指针赋值为Reset_Handler向量的地址

设置堆栈地址

跳转到APP中

typedef void (*Run_APP_t)(void);

/**

  • @brief 跳转并执行到APP程序

  • @param APPProgramAddr : APP程序的地址

  • @retval None
    /
    static void Jump_to_APP(uint32_t APPProgramAddr)
    {
    Run_APP_t run_app = (Run_APP_t)(
    (uint32_t*)(APPProgramAddr + 4));

    /* 检查堆栈地址(RAM地址)是否有效,然后跳转到用户应用程序 /
    if((
    (uint32_t*)APPProgramAddr & 0x2FFD0000) == 0x20000000)
    {
    /*
    关闭所有中断,
    在它被置 1 后,就关掉所有可屏蔽的异常,只剩下NMI 和硬 fault 可以响应。
    它的缺省值是 0,表示没有关中断。
    */
    __set_PRIMASK(1);

    /* 复位所有已经开启的外设 */
    GPIO_DeInit(GPIOH);
    GPIO_DeInit(GPIOA);
    GPIO_DeInit(GPIOC);
    EXTI_DeInit();
    CRC_ResetDR();
    USART_DeInit(USART1);/* 设置堆栈指针 */
    

// __set_PSP((uint32_t)APPProgramAddr);
// __set_CONTROL(0);
__set_MSP((uint32_t)APPProgramAddr);

    /* 跳转到APP程序中执行 */run_app();
}
else
{USART1Printf("BOOT_ERROR1!\r\n");
}

}

APP工程

Flash的起始地址,大小
在这里插入图片描述中断向量表偏移地址和开启全局中断

/* 设置中断向量表 /
NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0xA000);//中断向量表偏移
/

关闭所有中断,
在它被置 1 后,就关掉所有可屏蔽的异常,只剩下NMI 和硬 fault 可以响应。
它的缺省值是 0,表示没有关中断。
*/
__set_PRIMASK(0);

Keil5生成BIN文件
fromelf --bin -o “$L@L.bin” “#L”

在这里插入图片描述注意点:上电应检查标志位,不能初始化任何外设,根据该标志位来决定是否进入APP
通过软件复位给 APP 一个干净的系统
这里的标志位存在RTC备份寄存器0中,占用4个字节

相关文章:

【[STM32]标准库-自定义BootLoader】

[STM32]标准库-自定义BootLoader BootloaderBootloader的实现BOOTloader工程APP工程 Bootloader bootloader其实就是一段启动程序,它在芯片启动的时候最先被执行,可以用来做一些硬件的初始化或者用作固件热更新,当初始化完成之后跳转到对应的…...

Spring Boot项目中不使用@RequestMapping相关注解,如何动态发布自定义URL路径

一、前言 在Spring Boot项目开发过程中,对于接口API发布URL访问路径,一般都是在类上标识RestController或者Controller注解,然后在方法上标识RequestMapping相关注解,比如:PostMapping、GetMapping注解,通…...

Vue中有哪些优化性能的方法?

Vue是一款流行的JavaScript框架,用于构建交互性强的Web应用程序。在前端开发中,性能优化是一个至关重要的方面,尤其是当应用程序规模变大时。Vue提供了许多优化性能的方法,可以帮助开发人员提升应用程序的性能,从而提升…...

Python pandas遍历行数据的2种方法

背景 pandas在数据处理过程中,除了对整列字段进行处理之外,有时还需求对每一行进行遍历,来处理每行的数据。本篇文章介绍 2 种方法,来遍历pandas 的行数据 小编环境 import sysprint(python 版本:,sys.version.spli…...

Spring之@Transactional源码解析

前言 我们在日常开发的时候经常会用到组合注解,比如:EnableTransactionManagement Transactional、EnableAsync Async、EnableAspectJAutoProxy Aspect。今天我们就来抽丝剥茧,揭开Transactional注解的神秘面纱 EnableTransactionManagement注解的作用 当我们看到类似Ena…...

第三届国际亲子游泳学术峰会,麒小佑为亲游行业提供健康解决方案

第三届国际亲子游泳学术峰会大合影 2024年2月26—28日,第三届国际亲子游泳学术峰会在中国青岛成功召开。 第三届国际亲子游泳学术峰会是中国婴幼游泳行业最高标准的学术性会议,由亲游圈主办,旨在为本行业搭建一个高端圈层,帮助机…...

Python光速入门 - Flask轻量级框架

FlASK是一个轻量级的WSGI Web应用程序框架,Flask的核心包括Werkzeug工具箱和Jinja2模板引擎,它没有默认使用的数据库或窗体验证工具,这意味着用户可以根据自己的需求选择不同的数据库和验证工具。Flask的设计理念是保持核心简单&#xff0c…...

C/C++ 说说引用这玩仍是干啥的

引用的本质就是给某个实例对象起个外号。生活中李逵&#xff0c;也叫黑旋风。诸葛亮&#xff0c;又叫孔明。 引用的方式&#xff1a; 类型& 引用名对象名 举个例子 int i0; int& ki;//这种方式就是引用----->i有了自己的小名&#xff0c;从次叫k了 std::cout<…...

swoole

php是单线程。php是靠多进程来处理任务&#xff0c;任何后端语言都可以采用多进程处理方式。如我们常用的php-fpm进程管理器。线程与协程,大小的关系是进程>线程>协程,而我们所说的swoole让php实现了多线程,其实在这里来说,就是好比让php创建了多个进程,每个进程执行一条…...

kubectl基础命令详解

管理名称空间资源 查看名称空间 [rootceshi-130 conf]# kubectl get ns [rootceshi-130 conf]# kubectl get namespace NAME STATUS AGE default Active 7d17h kube-node-lease Active 7d17h kube-public Active 7d17h kube-system …...

collection的遍历方式

增强for遍历 增强for的底层就是迭代器&#xff0c;为了简化迭代器的代码书写的。 他是jdk5之后出现的&#xff0c;其内部原理就是一个Iterator迭代器。 所有的单列集合和数组才能用增强for进行遍历。 package myCollection;import java.util.ArrayList; import java.util.C…...

SpringBoot中@Async使用注意事项

前言 Async这个注解想必大家都用过&#xff0c;是用来实现异步调用的。一个方法加上这个注解以后&#xff0c;当被调用时会使用新的线程来调用。但其实这里面也有一个坑。 问题 这个注解使用时存在如下问题&#xff1a;在没有自定义线程池的场景下&#xff0c;默认会采用Sim…...

IEEE 802.11 RTS/CTS/BA/Management

RTS/CTS IEEE 802.11 RTS/CTS即RTS/CTS协议(Request To Send/Clear To Send)即请求发送/清除发送协议是被802.11无线网络协议采用的一种用来减少由隐藏节点问题所造成的冲突的机制。 相当于一种握手协议,主要用来解决"隐藏终端"问题。"隐藏终端"(Hid…...

【风格迁移】对比度保持连贯性损失 CCPL:解决图像局部失真、视频帧间的连贯性和闪烁

对比度保持连贯性损失 CCPL&#xff1a;解决图像局部失真、视频帧间的连贯性和闪烁 提出背景解法&#xff1a;对比度保持连贯性损失&#xff08;CCPL&#xff09; 局部一致性假设 对比学习机制 邻域调节策略 互信息最大化对比学习&#xff1a;在无需标签的情况下有效学习区分…...

【C++】贪心算法

贪心算法&#xff08;Greedy Algorithm&#xff09;是一种基于贪心策略的算法&#xff0c;它在每一步选择中都采取当前状态下最优的选择&#xff0c;以希望最终得到全局最优解。贪心算法通常适用于满足最优子结构性质的问题&#xff0c;即问题的最优解可以通过其子问题的最优解…...

记一次dockerfile无法构建问题追溯

我有一个dockerfile如下&#xff1a; ENTRYPOINT ["/sbin/tini"&#xff0c;"-g", "--"] CMD /home/scrapy/start.sh 我原本的用意是先启动tini&#xff0c;再执行下面的cmd命令启动start.sh。 为啥要用tini&#xff1f; 因为我的这个docker…...

React使用 useImperativeHandle 自定义暴露给父组件的实例方法(包括依赖)

关键词 React useImperativeHandle 摘要 useImperativeHandle 是 React 提供的一个自定义 Hook&#xff0c;用于在函数组件中显式地暴露给父组件特定实例的方法。本文将介绍 useImperativeHandle 的基本用法、常见应用场景&#xff0c;以及如何处理其依赖项&#xff0c;以帮…...

yolov5v7v8目标检测增加计数功能--免费源码

在yolo系列中&#xff0c;很多网友都反馈过想要在目标检测的图片上&#xff0c;显示计数功能。其实官方已经实现了这个功能&#xff0c;只不过没有把相关的参数写到图片上。所以微智启软件工作室出一篇教程&#xff0c;教大家如何把计数的参数打印到图片上。 一、yolov5目标检测…...

JPA常见异常 JPA可能抛出的异常

1、EntityNotFoundException&#xff08;实体不存在异常&#xff09;: 通过 JPA 查找一个不存在的实体。 2、NonUniqueResultException&#xff08;非唯一结果异常&#xff09;&#xff1a; 查询返回了多个结果&#xff0c;但期望只有一个结果。 3、TransactionRequiredExcep…...

Dockerfile的艺术:构建高效容器镜像的指令详解与实战指南

在容器化技术风靡全球的今天&#xff0c;Dockerfile作为构建 Docker 镜像的蓝图&#xff0c;其编写技巧与理解深度直接影响着应用部署的效率与稳定性。本文将深入剖析Dockerfile中的核心指令&#xff0c;以实战角度为您呈现一份详尽的解读与操作指南&#xff0c;并在文末抛出一…...

【技术解读】xNIDS:如何为深度学习入侵检测系统“翻译”可执行的主动防御规则?

1. 深度学习入侵检测的"黑盒困境"&#xff1a;为什么需要翻译器&#xff1f; 第一次接触深度学习入侵检测系统&#xff08;DL-NIDS&#xff09;时&#xff0c;我被它的检测准确率惊艳到了——某些场景下能达到99%以上的识别率。但当我试图把它部署到实际生产环境时&a…...

AntiDupl.NET终极指南:免费开源图片去重工具快速清理硬盘重复图片

AntiDupl.NET终极指南&#xff1a;免费开源图片去重工具快速清理硬盘重复图片 【免费下载链接】AntiDupl A program to search similar and defect pictures on the disk 项目地址: https://gitcode.com/gh_mirrors/an/AntiDupl 你是否曾为电脑中堆积如山的重复图片而烦…...

2026年人工智能(AI)产业深度分析报告(附下载)

人工智能正从“技术验证”迈向“产业化规模落地”的关键转折期。Gartner指出&#xff0c;AI在整个2026年将处于泡沫破灭低谷期&#xff0c;企业在多数情况下会选择通过现有软件供应商获取AI能力&#xff0c;只有当投资回报率的可预测性得到提升后&#xff0c;企业才能真正实现A…...

Python初学者项目练习28--移除列表中的多个元素

一、练习题目 定义一个函数&#xff0c;该函数用于从第一个列表list1中移除所有存在于第二个列表list2中的元素 二、代码 1.初始版本 代码如下&#xff1a; def remove_number(list1, list2):for i in range(list1):for j in range(list2):if i j:list1.remove(j)return list1…...

告别C盘焦虑!保姆级教程:在D盘为VS2013安个家(附阿里云/百度网盘下载)

告别C盘焦虑&#xff01;VS2013高效安装与磁盘管理全指南 对于刚接触编程的新手来说&#xff0c;Visual Studio 2013&#xff08;简称VS2013&#xff09;是一个功能强大且友好的开发环境。然而&#xff0c;许多用户在安装过程中常常忽略了一个关键问题——安装路径的选择。本文…...

告别开机黑屏:搞懂UEFI、CSM和Secure Boot的‘三角关系’,装机不求人

现代计算机启动架构解密&#xff1a;UEFI、CSM与Secure Boot的协同与冲突 开机黑屏是许多DIY装机用户和技术爱好者常遇到的棘手问题。当新硬件遇上旧设备&#xff0c;或是现代系统需要兼容传统软件时&#xff0c;计算机的启动过程往往成为第一道技术壁垒。要真正理解这些兼容性…...

从“收音机”到“手机芯片”:聊聊CMOS单级放大器在真实产品里的那些事儿

从“收音机”到“手机芯片”&#xff1a;CMOS单级放大器的工业进化史 上世纪60年代&#xff0c;当第一台全晶体管收音机问世时&#xff0c;工程师们或许不会想到&#xff0c;那些分立元件组成的放大器电路&#xff0c;有朝一日会以纳米级尺寸被集成在指甲盖大小的芯片里。CMOS单…...

基于ARM9工业平板与Linux的水质在线监测系统开发实践

1. 项目概述&#xff1a;当工业平板电脑遇上水质监测在环保、水产养殖、市政水务这些领域里&#xff0c;数据就是眼睛。过去&#xff0c;我们看水质&#xff0c;得靠人拿着采样瓶&#xff0c;一趟趟跑现场&#xff0c;再送回实验室&#xff0c;等上半天甚至几天才能拿到一份报告…...

别再只会用torchvision.models了!手把手教你从零理解ResNet18的PyTorch实现(附完整代码)

从零构建ResNet18&#xff1a;深入理解PyTorch实现与模型定制技巧 在深度学习领域&#xff0c;ResNet已经成为计算机视觉任务中不可或缺的基础架构。许多开发者习惯于直接调用torchvision.models.resnet18()这一行魔法代码&#xff0c;却对背后的实现细节知之甚少。本文将带你从…...

在Blender中创建逼真流体模拟:FLIP Fluids插件完全指南

在Blender中创建逼真流体模拟&#xff1a;FLIP Fluids插件完全指南 【免费下载链接】Blender-FLIP-Fluids The FLIP Fluids addon is a tool that helps you set up, run, and render high quality liquid fluid effects all within Blender, the free and open source 3D crea…...