【[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个字节

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

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

相关文章

LeetCode 热题 100 | 图论(二)

目录 1 基础知识 1.1 什么是拓扑排序 1.2 如何进行拓扑排序 1.3 拓扑排序举例 2 207. 课程表 3 210. 课程表 II 菜鸟做题,语言是 C 1 基础知识 1.1 什么是拓扑排序 含义:根据节点之间的依赖关系来生成一个有序的序列。 应用&#xff1a…

12:Logstash|Web日志实时分析

Logstash|Web日志实时分析 logstashlogstash工作结构安装Logstash编写logstash配置文件步骤一:codec类插件插件帮助手册Logstash input插件步骤一:file模块插件filter grok插件Web日志实时分析部署beats与filebeat步骤一:filter grok模块插件logstash 一个数据采集、加工处…

Ubuntu22.04系统 安装cAdvisor提示找不到 CPU 的挂载点错误解决办法。

如果我们在安装cAdvisor时容器启动不起来 查看日志如下图所示 1、查看cgroup文件系统是v2 还是 v1 mount | grep cgroup 如图所示我的是v2 , cAdvisor 目前的最新版本(v0.39.0)仍然只支持 cgroup v1,不支持 cgroup v2。因此&#…

闫震海:腾讯音乐空间音频技术的发展和应用 | 演讲嘉宾公布

一、3D 音频 3D 音频分论坛将于3月27日同期举办! 3D音频技术不仅能够提供更加真实、沉浸的虚拟世界体验,跨越时空的限制,探索未知的世界。同时,提供更加丰富、立体的情感表达和交流方式,让人类能够更加深入地理解彼此&…

Python 批量提取pdf/word中的图片,并生成markdown文档

from sdk.utils.util_class import PathParser from sdk.temp.temp_supports import IsSolution, DM 这些全是自定义的工具包,自己去其他文章下找 # !/usr/bin/python3 # -*- coding:utf-8 -*- """ author: JHC000abcgmail.com file: demo.py time:…

做抖店月入百万还是会亏损?珠珠来告诉你,做抖店水到底有多深?

我是电商珠珠 抖店的热度一直只高不低,所以很多想要做的新手不知道抖店水的深浅,就一股脑的去做了。结果又是被扣保证金,又是被判定无货源违规的,最后灰头土脸的关了店。那些说做了十万十几万的,几百万的难道都是假的…

Windows主机巡检vbs脚本

’ Windows主机巡检脚本 ’ 获取主机名称 Set objNetwork CreateObject(“WScript.Network”) strComputer objNetwork.ComputerName ’ 获取磁盘信息 Set objWMIService GetObject(“winmgmts:\” & strComputer & “\root\cimv2”) Set colDisks objWMISer…

在三个el-form-item中的el-radio的值中取一个发送给后端怎么获取

问: 请问,这段代码怎么获取:无策略,策略1,策略2的值? 回答: 问: 三个里面只可以选中一个吗? 回答:

应对求职高峰:金三银四必备问答与大厂模板,成功职场攻略!

三四月是求职的黄金季节,很多设计师会选择在这个时候准备作品集。一个视觉精美、有条不紊的作品集,无疑是走向大厂的敲门砖。但是我问了一圈优秀社区的朋友,发现大家或多或少都遇到过问题。今天我整理了群里的高频问题,附上了解决…

[GXYCTF2019]BabyUpload1 -- 题目分析与详解

目录 一、题目分析 1、判断题目类型: 2、上传不同类型的文件进行测试: 二、题目详解 1、写出.htaccess文件: 2、.htaccess 文件配合 .jpg 上传: 3、利用 中国蚁剑/中国菜刀 获取flag: 一、题目分析 1、判断题目…

信奥一本通:1082:求小数的某一位

分数转换为小数就是分子除分母,但是他要求指定的n项小数,n大于1小于10000,如果是10000的话就太大了,用传统的方式无法找出指定的位数。 方式就是:例如求2分之1,我们先用除法把具体的值求出来,然…

图机器学习(1)--导论

0 CS224W概况 斯坦福大学CS224W课程:http://cs224w.stanford.edu/ 图机器学习的库: 为什么是图?图是描述和分析具有关系/交互的实体的通用语言。 1 图数据举例 复杂域具有丰富的关系结构,可以表示为关系图。 通过显式地建模关…

【论文阅读】Generative Pretraining from Pixels

Generative Pretraining From Pixels 引用: Chen M, Radford A, Child R, et al. Generative pretraining from pixels[C]//International conference on machine learning. PMLR, 2020: 1691-1703. 论文链接: http://proceedings.mlr.press/v119/chen…

LeetCode --- 三数之和

题目描述 三数之和 代码解析 暴力 在做这一道题的时候,脑海里先想出来的是暴力方法,一次排序,将这个数组变为有序的,再通过三次for循环来寻找满足条件的数字,然后将符合条件的数组与之前符合条件的数组进行一一对比…

2024.3.6补题

1.关鸡 对于这一道题,我们先按照题意进行分析:首先鸡自己的初始位置,如果着火点在鸡一开始的左右下各有一个那么就可以达到题目效果,也就是说不需要添加着火点,同时最多需要添加的着火点其实也就是它初始位置身边所有的…

Optional 详解

Optional 详解 1、Optional 介绍2、创建 Optional 对象3、Optional 常用方法1. 判断值是否存在 — isPresent()2. 非空表达式 — ifPresent()3. 设置(获取)默认值 — orElse()、orElseGet()4. 获取值 — get()5. 过滤值 — filter()6. 转换值 — map() 作为一名 Java 程序员&am…

animation给同一个元素加多个动画

需求&#xff1a; 元素从右向左渐变滑入&#xff0c;然后再上下漂浮 代码实现&#xff1a; animation动画可连写 <style lang"less" scoped>//swipe-item里面所有animate动画延迟时间swipe-animation-delay:500ms;//animate.css动画时长animate-css-duration:…

电子电器架构刷写策略 —— 队列刷写

电子电器架构刷写策略 —— 队列刷写 我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 屏蔽力是信息过载时代一个人的特殊竞争力,任何消耗你的人和事,多看一眼都是你的不对。非必要不费力证明自己…

关于rocky linux配置RHEL9在线镜像源

Rocky Linux 简介 Rocky Linux 是一个社区支持的企业级 Linux 发行版&#xff0c;旨在为 CentOS Stream 提供一个稳定、可预测的替代方案。它与 CentOS Linux 兼容&#xff0c;并承诺提供 10 年的支持。Rocky Linux 适用于需要一个稳定、可预测的企业级 Linux 发行版&#xff…

算法练习第十二天|二叉树的递归遍历和迭代遍历

二叉树的遍历方式有广度还有深度方式 深度优先遍历&#xff1a;先往深走&#xff0c;遇到叶子节点再往回走。 广度优先遍历&#xff1a;一层一层的去遍历。 本文写的是深度优先遍历&#xff0c;分为前序&#xff0c;中序&#xff0c;后序遍历。这里前中后&#xff0c;其实指的就…