STM32 bootloader简单实现的验证

news2024/11/19 15:38:45

目录

背景知识

STM32的启动模式

Flash memory的大小

实验验证

分区分配

 bootloader代码

systeminit


背景知识

STM32的启动模式

STM32有三种启动模式, 这里验证的bootloader是通过Flash memory启动方式, 使用STM32内置的Flash,其首地址是0x08000000,一般我们使用JTAG或者SWD模式下载程序时,就是下载到这个里面,重启后也直接从这启动程序. 在验证的时候也能看到我们都是在这个地址范围内进行操作的. 更加详细的介绍可阅读以下博文:

STM32三种BOOT启动模式详解(全网最全)

Flash memory的大小

本文验证使用的是STM32F103ZET6, 根据芯片手册可以看到其地址分配:

表中的主存储块就是flash memory的地址, 在HAL库的如下文件定义:

Drivers\CMSIS\Device\ST\STM32F1xx\Include\stm32f103xe.h

 

实验验证

下面这篇博文实现了一个简单的bootloader, 将bootloader和application刷写在不同的flash memory地址,bootloader中实现跳转到application地址. 这篇博文中描述的知识也是非常清晰, 如何操作以及原理都有描述,是学习的好材料.

基于STM32的简易Bootloader实现 - JiuLiBlog - 博客园

分区分配

根据上文的设计, flash memory的分配如下图所示:

 注意事项: 我随便找了正点原子的跑马灯工程,可以直接通过LED的闪烁情况观察实验的成功与否, 在使用前需要确认编译出来的bin文件是多大的,确保在刷写的时候bootloader和application的地址不会重叠导致单片机无法正常运行.

可以在keill如下设置项中在编译后可生成bin文件的指令: fromelf.exe --bin -o "$L@L.bin" "#L"

 bootloader代码

代码修改了一下博文中的代码,在调用跳转之前关闭中断, 直接在main函数里面调用就好了:

#define APP_ADDR 0x08002000 //应用程序首地址定义 typedef void (*APP_FUNC)(); //函数指针类型定义/**
  * @brief
  * @param
  * @retval
  */
__asm void MSR_MSP(uint32_t addr)
{
    MSR MSP, r0
    BX r14;
}


/**
  * @brief
  * @param
  * @retval
  */
void run_app(uint32_t app_addr)
{
    uint32_t reset_addr = 0;
    APP_FUNC jump2app;
    
    /* 跳转之前关闭相应的中断 */
    __disable_irq(); 
    
    /* 栈顶地址是否合法(这里sram大小为8k) */
    if(((*(uint32_t *)app_addr)&0x2FFE0000) == 0x20000000)
    {
        /* 设置栈指针 */
//        MSR_MSP(app_addr);
        /* 获取复位地址 */
        reset_addr = *(uint32_t *)(app_addr+4);
        jump2app = ( APP_FUNC )reset_addr;
			__enable_irq();  //打开中断,必须加	
        jump2app();
    }
    else
    {
        printf("APP Not Found!\n");
    }	
}

这里我尝试了一下不调用MSR_MSP加载栈地址好像也没问题.

systeminit

文中提到的systeminit函数在如下文件中:

Drivers\CMSIS\Device\ST\STM32F1xx\Source\Templates\system_stm32f1xx.c

函数声明如下:

 需要将如下的宏定义打开:

 还有更加便捷的方法就是在application中直接调用如下语句:

__disable_irq();
SCB->VTOR = 0x08008000;
__enable_irq();

总结

完成所有的设置后,可以实现刷写bootloader和application到不同flash memory中,并且bootloader可以跳转到application中.

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

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

相关文章

[论文阅读] 颜色迁移-梯度保护颜色迁移

[论文阅读] 颜色迁移-梯度保护颜色迁移 文章: [Gradient-Preserving Color Transfer], [代码未公开] 本文目的: 如题所示为梯度保护的颜色迁移方法. 1-算法原理 人类的视觉系统对局部强度差异比强度本身更敏感, 因而, 保持颜色梯度是场景保真度的必要条件, 因而作者认为: 一…

python+django留守儿童爱心捐赠网站

开发语言:Python 框架:django Python版本:python3.7.7 数据库:mysql 数据库工具:Navicat11 开发软件:PyCharm 目录 1 绪论 1 1.1课题背景 1 1.2课题研究现状 1 1.3初步设计方法与实施方案 2 1.4本文研究…

城市应急处置系统实施目标

针对需求分析中的业务目标,本系统在实施中,通过 “两个工作台七个子系统”的目标来支撑业务目标,满足系统延续需求、功能需求、制度建设需求、平台拓展需求和技术性能需求。 具体分为事前6个子系统、事中2个工作台和事后1个子系统这三方面目标…

002:UIView

UIView简介: UIView作为最基础的视图类,起着管理屏幕上一定区域内容展示的作用。作为各种视图的父类,提供相应的基础能力。 外观、渲染和动画。相应区域内的事件。布局和管理子视图。 布局: 设置自身大小(size&…

[附源码]Python计算机毕业设计SSM基于农产品交易系统(程序+LW)

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

动态代理:JDK动态代理源码学习

文章目录前言概述什么是代理静态代理动态代理正文入口方法1:newProxyInstance方法2:getProxyClass0方法3:get 获取代理方法4:apply 创建代理方法5:generateProxyClass方法6:generateClassFile代理类总结前言…

LeetCode_动态规划_困难_1691.堆叠长方体的最大高度

目录1.题目2.思路3.代码实现(Java)1.题目 给你 n 个长方体 cuboids ,其中第 i 个长方体的长宽高表示为 cuboids[i] [widthi, lengthi, heighti](下标从 0 开始)。请你从 cuboids 选出一个子集 ,并将它们堆…

ubuntu14.04搭建openGrok 1.7.40 + Java17+tomcat10.0.27阅读android系统代码

为了快速阅读android系统代码,首选openGrok,其它SI或understand估计不适合了。 话不多说,工欲善其事必先利其器,先下载源码和工具. 以下命令默认使用root,防止权限问题 一、下载android 代码 还是清华的镜像比较牛…

农村金融专题-保险支出、收入、补贴各省份涉农贷款数据集

一、31省市农业保险赔付支出 1、数据来源:wind数据库 2、时间跨度:2005-2019年 3、区域范围:全国 4、指标说明: 部分数据如下: 二、各省农业保险保费收入 1、数据来源: 中国保险数据 2、时间跨度&…

「杂谈·II」cmp() 的参数类型应该是啥?

0. 引言 上了一节 DS 课,但是回到了初学 C 的内容…… 众所周知,最小生成树的 Kruskal 要用边表排序,通常是 sort() 配 cmp()。 而 cmp() 的两个参数的类型最好是什么呢? 让我们回到初学 C 的时候,温习一下知识…… 1…

MySQL数据库学习(3)

MySQL中select语句语法简单介绍&#xff1a; 基本语法规则&#xff1a; SELECT {* | <字段列名>} [FROM <表 1>, <表 2>… [WHERE <表达式> [GROUP BY <group by definition> [HAVING <expression> [{<operator> <expression>…

FineReport商业智能数据分析-下拉框控件

1. 概述 1.2 应用场景 「下拉框控件」可应用于填报、参数等场景&#xff0c;本文将介绍「下拉框控件」的属性及应用。 1.2.1 填报控件 填报报表中&#xff0c;可以用来在多个预备选项中选择一个值填入。如下图所示&#xff1a; 1.2.2 参数控件 参数面板处可以通过该控件过…

微服务框架 SpringCloud微服务架构 微服务保护 31 限流规则 31.4 流控效果【warm up】

微服务框架 【SpringCloudRabbitMQDockerRedis搜索分布式&#xff0c;系统详解springcloud微服务技术栈课程|黑马程序员Java微服务】 微服务保护 文章目录微服务框架微服务保护31 限流规则31.4 流控效果【warm up】31.4.1 流控效果31.4.2 流控效果 - warm up31.4.3 案例31 限…

[论文阅读] 颜色迁移-Illuminant Aware Gamut-Based

[论文阅读] 颜色迁移-Illuminant Aware Gamut-Based 文章: [Illuminant Aware Gamut-Based Color Transfer], [python代码] 本文目的是提出一种新的颜色迁移算法, 可以感知光源变化的全色域颜色迁移方法. 1-算法原理 图像是由摄像机对光谱场景内容和场景照度的敏感性所产生…

springboot validated注解数据校验 异常处理

springboot validated 数据校验validated 数据校验简单的写一下这个用法啊&#xff0c;清晰的本篇文章就记录这个注解的一个用法。validated 数据校验 我们一般的数据校验是怎么用的&#xff1f;在常规模式下我们可能就是在前端去通过js去判断&#xff1f;还是在后端重新查找数…

【C语言字符串相关函数大全】

【C语言字符串相关函数大全】【1】atof【2】atoi【3】atol【4】isalnum【5】isdigit【6】islower【7】isupper【8】isprint【9】memchr【10】memcmp【11】memcpy【12】memset【13】strcat【14】strchr【15】strcmp【16】strpbrk【17】strstr【18】strtok【19】源码【20】源码执…

Mipmap的作用以及其优势和缺点

Mipmap的作用以及其优势和缺点 定义 Mipmap,又叫做多级渐进贴图纹理映射,作用在游戏的纹理贴图,根据渲染物体距离相机的远近,选用不同大小的纹理贴图; 作用 可以使得远处的像素不发生闪烁;减小带宽;减小带宽的原理 说到MipMap可能很多人都会觉得,只是开启后会增加内…

Vue3 学习笔记 —— 函数式编程、createVNode、render、h 函数

目录 2. createVNode()、render() 2.1 初步使用 createVNode()、render() 2.2 h 函数源码分析 3. 使用 h 函数的几种方法 3.1 h 函数 接收的参数 3.2 h 函数 使用方法 4. 通过 h 函数实现 button 组件 4.1 使用 props 接收传入组件的参数 4.2 使用 emit 向组件外发送事…

自动化运维工具—Ansible概述及命令行模块

一.自动化运维工具—Ansible概述及命令行模块 1.1 Ansible是什么 Ansible是一个基于Python开发的配置管理和应用部署工具&#xff0c;现在也在自动化管理领域大放异彩。它融合了众多老牌运维工具的优点&#xff0c;Pubbet和Saltstack能实现的功能&#xff0c;Ansible基本上都可…

机器人手臂四旋翼的笛卡尔阻抗控制(Matlab代码实现)

目录 &#x1f4a5;1 概述 &#x1f4da;2 运行结果 &#x1f389;3 参考文献 &#x1f468;‍&#x1f4bb;4 Matlab代码 &#x1f4a5;1 概述 当机器人手指与障碍物接触时,呈现出2阶机械阻抗特性。在阻抗控制算法中,不需直接计算加速度,从而避免了因大加速度误差给控制带…