硬汉嵌入式论坛

 找回密码
 立即注册
查看: 1618|回复: 7
收起左侧

[有问必答] 关于stm32的引导程序和bootloader

[复制链接]

4

主题

19

回帖

31

积分

新手上路

积分
31
发表于 2024-7-24 10:48:28 | 显示全部楼层 |阅读模式
请教各位大佬,stm32的内置的引导程序,厂家烧录好的bootloader,以及我们常说的启动文件,这三个东西到底对应的文件是哪个呢?以及各自储存的位置在哪里?



我查过许多网上的说法,有以下几点:
第一,选择从系统存储器启动(0x1FFFF000 – 0x1FFF F7FF),这种模式启动的程序功能是由厂家设置的。一般来说,我们选用这种启动模式时,是为了从串口下载程序,因为在厂家提供的ISP程序中,提供了串口下载程序的固件,可以通过这个ISP程序将用户程序下载到系统的Flash中。那么这个地方储存的就是“厂家烧录好的bootloader”,也就是ISP更新用的吧?


第二:ST的论坛又说“根据BOOT引脚确定了启动方式后,处理器进行的第二大步就是开始从0x00000000地址处开始执行代码,而该处存放的代码正是bootloader。
bootloader,也可以叫启动文件,无论性能高下,结构简繁,价格贵贱,每一种微控制器(处理器)都必须有启动文件,启动文件的作用便是负责执行微控制器从“复位”到“开始执行main函数”中间这段时间(称为启动过程)所必须进行的工作”据前文所说,这个0x00000000地址是由某个启动地址映射过来的,例如从FLASH启动就是将0x08000000映射到0x00000000,那么这里储存的不是我的代码文件吗,怎么又是bootloader了呢?


第三,我们在代码里可以看到的启动文件,名字一般叫startup_stm32f103xe.s之类的,网上关于这个文件的分析很多,不过都没讲为啥这个文件储存在哪里、为什么一开始就运行它,是和代码一起储存在0x08000000开始的地址里面吗?还是说,它存放在0x08000000的起始位置,运行程序的时候自然就先运行它,它的别名又叫bootloader?

实在是迷惑不解啊
回复

使用道具 举报

10

主题

56

回帖

86

积分

初级会员

积分
86
发表于 2024-7-24 18:13:29 | 显示全部楼层
刚好在看数据手册,给你粘贴点。
应该是bootloader程序在system memory里面,然后跳到User main memory(0x08000000)那里开始用户程序。
手册说更多STM32 bootloader信息,参考AN2606 “STM32 microcontroller system memory boot mode”

STM32H750flash结构

STM32H750flash结构

fash使用

fash使用
回复

使用道具 举报

10

主题

56

回帖

86

积分

初级会员

积分
86
发表于 2024-7-24 18:14:00 | 显示全部楼层
另外怎么放图片啊?图片地址是什么?
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117512
QQ
发表于 2024-7-25 11:45:37 | 显示全部楼层
此贴可以解决你的疑惑

【不是问题的问题】为什么STM32的Flash地址要设置到0x08000000
https://forum.anfulai.cn/forum.p ... 9321&fromuid=58
(出处: 硬汉嵌入式论坛)
回复

使用道具 举报

4

主题

19

回帖

31

积分

新手上路

积分
31
 楼主| 发表于 2024-7-25 14:57:52 | 显示全部楼层
quanshimutou 发表于 2024-7-24 18:13
刚好在看数据手册,给你粘贴点。
应该是bootloader程序在system memory里面,然后跳到User main memory(0 ...

感谢回复。我觉得系统存储器这里储存的应该就是厂家烧录好的bootloader代码,如果选择从这里启动就会执行isp更新程序。但是系统上电运行程序应该是直接从flash启动,那样应该没有用到这个bootloader代码吧,而是一个“引导程序”,只是这个引导程序又是什么东西,是不是我们在程序工程能看见的启动文件呢?
回复

使用道具 举报

4

主题

19

回帖

31

积分

新手上路

积分
31
 楼主| 发表于 2024-7-25 15:02:42 | 显示全部楼层
eric2013 发表于 2024-7-25 11:45
此贴可以解决你的疑惑

【不是问题的问题】为什么STM32的Flash地址要设置到0x08000000

感谢回复。我觉得系统存储器这里储存的应该就是厂家烧录好的bootloader代码,如果选择从这里启动就会执行isp更新程序。但是系统上电运行程序应该是直接从flash启动,那样应该没有用到这个bootloader代码吧?而是一个“引导程序”,只是这个引导程序又是什么东西,是不是我们在程序工程能看见的启动文件呢?
另外,这篇帖子里复位中断程序所在的位置(0x00000101)写了一个“Boot code”,请问这是所谓的“引导程序”吗?
回复

使用道具 举报

3

主题

295

回帖

304

积分

高级会员

积分
304
发表于 2024-7-25 16:10:56 | 显示全部楼层
菜鸟9号 发表于 2024-7-25 15:02
感谢回复。我觉得系统存储器这里储存的应该就是厂家烧录好的bootloader代码,如果选择从这里启动就会执行 ...

系统存储器里的代码是出厂就固定的,一般是读不出来的,这部分的代码是根据芯片boot脚状态以及选项字确定是否进入isp模式或者其他模式,并不是你说的直接从flash启动。确定是flash启动后,从0x08000000开始读和执行程序,这部分应该是芯片完成的。st的这个startup文件里面只是确定堆栈大小,中断向量之类的,完成进入main之前的初始化工作,这个用c文件也是可以写的,你进仿真是可以在这段程序里调试的。
回复

使用道具 举报

3

主题

295

回帖

304

积分

高级会员

积分
304
发表于 2024-7-25 16:16:22 | 显示全部楼层
一般说的bootloader要么是用户编写的,要么就是芯片自带的,芯片自带的是出厂就固定的,无法修改也没法读出源程序。启动文件这个只是main程序之前一部分代码,纯c就可以实现,和bootloader关系不大。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2025-8-12 06:31 , Processed in 0.043933 second(s), 27 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表