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

news2024/11/19 15:27:52

[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.coloradmin.cn/o/1491900.html

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

相关文章

C++基础2:C++基本数据类型和控制结构

此专栏为移动机器人知识体系下的编程语言中的 C {\rm C} C从入门到深入的专栏,参考书籍:《深入浅出 C {\rm C} C》(马晓锐)和《从 C {\rm C} C到 C {\rm C} C精通面向对象编程》(曾凡锋等)。 2.C基本数据类型和控制结构 2.1 C基本数据类型 程序是由算法…

这回就好好聊聊Kotlin的泛型

公众号「稀有猿诉」 原文链接 这回就好好聊聊Kotlin的泛型 泛型(Generics)是静态强类型编程语言中非常强大的特性,可以极大的加强代码的复用,并增强类型安全,减少运行时的类型转换错误。在这篇文章就来详细的学习一下Kotlin中对泛型的…

080|为什么阿里的价值观值得你关注?

在阿里巴巴20周年年会现场,万众瞩目之下,马云和张勇完成了阿里巴巴董事长职务的交接。 不过你也知道,这次接棒在一年前就已经公布了,在年会上只是一个仪式。在20周年年会过后,我找到了互联网圈的资深媒体人阳淼&#…

Mathcad tips_table相关

1. 可以插入表格,或者2. 从excel 文件导入 选择列 选择其中一行的数值

408专业课130+|我的备考经验和复盘

408的四门课任务量多到爆炸!但难度不止于此。别忘了大部分选计算机的勇士们,是要考数学的!直接起飞。 408数学无疑是王炸王炸,要想上岸就一定要把这两个大头一起拿下! 作为一个成功上岸的非计算机专业跨考生&#xf…

计算机网络实验一 网线制作

实验目的与要求: 实验目的 了解以太网网线(双绞线)和制作方法 实验内容 了解网线和水晶头 学习网线制作方法 实验环境和要求 网线 水晶头 压线钳 剥线钳 网线测试器 方法、步骤: 步骤一 准备工具和材料 步骤二 剥掉双绞线的外…

16 PyTorch 神经网络基础【李沐动手学深度学习v2】

要想直观地了解块是如何工作的,最简单的方法就是自己实现一个。 在实现我们自定义块之前,我们简要总结一下每个块必须提供的基本功能。 将输入数据作为其前向传播函数的参数。 通过前向传播函数来生成输出。请注意,输出的形状可能与输入的形…

leetcode 热题 100_找到字符串中所有字母异位词

题解一&#xff1a; 滑动窗口&#xff1a;类似于字符串匹配&#xff0c;但匹配异位词需要包含相同的字母及个数&#xff0c;可以分别用两个数组存储字符串s滑动窗口和字符串p的字母及个数&#xff0c;再用Array.equals()进行比对。对于s.length()<p.length()的情况需要特判。…

2024 全国水科技大会暨污泥处理处置与资源化利用技术论坛(九)

为大会征集“绿色低碳污水厂案例”&#xff0c;欢迎各相关单位积极报名&#xff01; 一、会议背景 为深入学习贯彻《中共中央、国务院关于全面推进美丽中国建设的意见》&#xff0c;全面贯彻实施《固体废物污染环境防治法》、《“十四五”全国城市基础设施建设规划》&#xff0…

【操作系统概念】 第2章:操作系统结构

文章目录 0. 前言2.1 操作系统的服务2.2 操作系统的用户界面2.3 系统调用&#xff08;System Call&#xff09;2.3.1 系统调用的过程 2.4 系统调用类型2.5 系统程序分类2.6 操作系统设计和实现2.7 操作系统结构2.7.1 简单结构2.7.2 分层方法2.7.3 微内核2.7.4 模块 2.8 操作系统…

IO多路复用:2024/3/5

作业1、使用poll实现tcp服务器端&#xff0c;select实现tcp客户端 服务器端&#xff1a; #include <myhead.h> #define SER_IP "192.168.199.131" //服务端IP #define SER_PORT 8888 //服务端端口号int main(int argc, const char *argv[])…

【大数据】通过 docker-compose 快速部署 MinIO 保姆级教程

文章目录 一、概述二、MinIO 与 Ceph 对比1&#xff09;架构设计对比2&#xff09;数据一致性对比3&#xff09;部署和管理对比4&#xff09;生态系统和兼容性对比 三、前期准备1&#xff09;部署 docker2&#xff09;部署 docker-compose 四、创建网络五、MinIO 编排部署1&…

第一节 JDBC是什么?

JDBC代表Java数据库连接(Java Database Connectivity)&#xff0c;它是用于Java编程语言和数据库之间的数据库无关连接的标准Java API&#xff0c;换句话说&#xff1a;JDBC是用于在Java语言编程中与数据库连接的API。 JDBC库包括通常与数据库使用相关&#xff0c;如下面提到的…

基于Vue3的在线考试系统

TDuckX 是一个功能强大的可私有化部署的在线表单考试平台&#xff0c;可以帮助您轻松创建表单和在线考试。本文档将指导您如何使用 TDuckX 创建您自己的在线考试。 步骤 1&#xff1a;登录账户 完成系统部署后&#xff0c;在浏览器中打开 TDuckX 的网站。 如果您已经拥有账户&…

docker单节点搭建在线商城

本文档使用到的软件包以上传到资源中 目录 1. 创建容器并配置基础内容 1.1 将gpmall-repo上传到容器中 1.2 添加yum源 2. 安装基础服务 2.1 安装JAVA环境 2.2 安装Redis缓存服务 2.3 安装Elasticsearch服务 2.4 安装Nginx服务 2.5 安装MariaDB数据库 2.6 安…

积分商城管理系统的设计与实现(含源文件)

项目源码&#xff1a;https://gitee.com/oklongmm/biye2 系统介绍&#xff1a; 积分商城管理系统&#xff0c;包括用户模块、商品模块、积分模块和后台管理模块。 一、用户模块&#xff1a; 用户注册与登录&#xff1a;用户可以创建账户并登录系统。 个人信息管理&#xff1…

android开发教程视频,android组件化和插件化

第一阶段&#xff1a;Android 基础知识回顾&#xff1a; 回顾Android 开发编程&#xff0c;深入理解Android系统原理和层次结构&#xff0c;深入分析Handler源码和原理&#xff1b;回顾Java&#xff0c;C/C&#xff0c;Kotlin、dart 在Android开发中必用的语言&#xff0c;熟悉…

四平方和 刷题笔记

/* 四平方和 直接暴力搜索 可能会超时 使用二分辅助搜索 先枚举出 c*cd*d并存入数组 用式子算出 a*ab*b还剩下多少查找sum数组里面是否存在符合条件的数 查找方式使用二分搜索 当逼近答案后 检查一下是否为所需的数 如果是 直接输出 */ #include <cstring> #includ…

分布式数字身份:通往Web3.0世界的个人钥匙

数字化时代&#xff0c;个人身份已不再仅仅局限于传统形式&#xff0c;分布式数字身份&#xff08;Decentralized Identity&#xff0c;简称DID&#xff09;正崭露头角&#xff0c;它允许个人通过数字签名等加密技术&#xff0c;完全掌握和控制自己的身份信息。研究报告显示&am…

展台模型设计过程中会遇到那些问题?---模大狮模型网

在展台模型设计过程中&#xff0c;可能会遇到一些常见问题&#xff0c;包括但不限于&#xff1a; 一&#xff1a;空间规划问题 设计师需要确保展台布局合理&#xff0c;能够满足参展方的需求&#xff0c;同时还要考虑观众流线和空间利用效率。解决方法包括对空间进行良好的规划…