STM32 Bootloader与启动分析

2018-07-10 21:27:52编辑:什么鱼 关键字:STM32  Bootloader  启动分析

一、STM32 程序下载与Bootloader

三种启动模式如下表:


(截图与stm32中文参考资料)

1、从主闪存存储器启动,即从STM32内置的Flash启动,BOOT0=0,BOOT1=X, 一般我们使用JTAG或者SWD模式下载程序时,就是下载到这个里面,复位(软件复位、手动复位、硬件自动复位)后也直接从这启动程序。不需要使用到系统存储区的Bootloader程序。

2、从系统存储器启动,即STM32的ISP了。B00T0=1,B00T1=0,由于串口不能直接把程序下载到内置的flash里面,所以需要使用到ST公司内嵌于系统存储区(flash的某一部分的地址被编为0x1FFF_F000-0x1FFF_F7FF,这就是所谓的系统存储器\区)的Bootloader来引导把程序下载到flash里面。程序下载完成后还需要配置BOOT[1:0]引脚为BOOT0=0,BOOT1=X(即从主闪存存储器启动),复位后启动程序(手动复位或者使用硬件自动复位电路)。下图是关于STM32F10xxx的Bootloader的一些信息


截图来自文档AN26062


截图来自文档AN26062


截图来自正点原子开发板

3、从内置SRAM启动。内置SRAM,既然是SRAM,自然也就没有程序存储的能力了,这个模式一般用于程序调试。假如我只修改了代码中一个小小的地方,然后就需要重新擦除整个Flash,比较的费时,可以考虑从这个模式启动代码(也就是STM32的内存中),用于快速的程序调试,等程序调试完成后,在将程序下载到SRAM中。

二、STM32启动分析

预备知识:

DCD指令:用于分配一片连续的字存储单元(32bit),并将表达式的值初始化给该字存储单元,类似于C中定义数组并初始化。比如: DCD 0 的意思是:分配一个字存储单元,并将该单元初始化为0。

分析:

在STM32的启动文件中可以看到有如下代码:

    EXPORT __Vectors

__Vectors

    DCD __initial_sp ; Top of Stack

    DCD Reset_Handler

    DCD NMIException

    DCD HardFaultException

    DCD MemManageException

    DCD BusFaultException

    DCD UsageFaultException

    DCD 0 ; Reserved

    DCD 0 ; Reserved

    DCD 0 ; Reserved

    DCD 0 ; Reserved

    DCD SVCHandler

    DCD DebugMonitor

    DCD 0 ; Reserved

    DCD OSPendSV

……

这一段是分配STM32的中断向量表。从DCD后面表达式的名称可以看出第一个字存储单元分配给了栈顶,其值为__initial_sp。第二个字分配给了复位地址,其值为Reset_Handler,后面接着分配给其他异常或中断。

这里的Reset_Handler,NMIException等,其实是一个地址值,也就是中断处理函数的入口地址。在函数实现时,由编译器分配一个地址值。

那么这里就有两个问题。

第一个是为什么是这样的分配顺序?

第二个是DCD后面表达式的值,即各个中断函数的地址值如Reset_Handler,NMIException是如何分配的?

第一个问题的答案好找,我们参考《STM32参考手册》:

可以看到,启动文件中的向量表的分配的顺序是按照固定的规则来的。

第二个问题。随意打开一份编译过的工程,工程配置如下:

我们可以看到.map文件有这样一段:

同时使用J-Link打开.hex文件可以看到

 

从hex档,我们可以看到Flash的起始区域0x8000000的内容为

0x20000660

0x0800027D

0x08000281

0x08000283

……

刚好可以和map文件对应,也刚好可以和启动文件的向量表对应。

按照Cortex-M3权威指南,在复位后,有如下动作:


我这里是选择从flash启动,根据寄存器映射,Address从0x00000000映射到0x08000000。所以hex档的内容刚好满足复位序列的设定。

由此从启动文件到.map文件再到.hex文档,再到CM3复位启动的脉络就理清了。


关键字:STM32  Bootloader  启动分析

来源: eefocus 引用地址:http://www.eeworld.com.cn/mcu/2018/ic-news071040211.html
本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。

上一篇:stm32增加bootloader后进不了中断
下一篇:STM32F4+UCOSII 程序运行一段时间操作系统死掉中断正常响应

关注eeworld公众号 快捷获取更多信息
关注eeworld公众号
快捷获取更多信息
关注eeworld服务号 享受更多官方福利
关注eeworld服务号
享受更多官方福利

推荐阅读

C51、STM32和S3C2440中断体系的比较

/* 名称:C51、STM32和S3C2440中断体系的比较 说明:对于这三个芯片的中断体系来说,就我目前了解的, 我说:差不多。这里说的差不多,是中断的本质上差不多,都是首先中断源提出申请(比如触发了外部中断,定时器中断等),然后经过中断源屏蔽寄存器,再然后中断优先级的比较,最后CPU相应中断。(我去,这好像又回到了计算机组成原理啊)。不同的是细节,C51作为低级一点的芯片,其中断少,中断能达到的功能也少,相对来说较为简单些(无论是设计还是具体使用)。而STM32和S3C2440来说,其提供的功能较多,设计起来和使用起来要复杂的多(使用的时候得配置好多好多寄存器)。目前总结的,差不多就是这些吧。*/
发表于 2018-07-21 14:40:54

STM32_GPIO之按键输入

/* 名称:STM32_GPIO之按键输入 说明:这个实验是GPIO的输入功能。基本的思路和51单片机差不多。也是 操作相应的IO口,不过不同的是对于独立按键输入实验来说,51单片机是 需要一开始把待检测的IO口设置成高电平,然后检测其何时被拉低。而对 于STM32来说,其GPIO端口就可以设置成上拉输入,即不需要再人为的把对 应的对应的IO口设置成高电平,硬件电路会自动把对应端口引脚拉成高电 平。还有一点关于条件编译要说的:这个ifndef… #endif 一般用在头文件中。书上说为了防止重复编译。就我目前了解的来看,在实际应用中,如果在两个.c源文件中都
发表于 2018-07-21 14:37:58

STM32之利用I2C协议读写EEPROM

/* 名称:STM32之利用I2C协议读写EEPROM 说明: 1.利用STM32来读写EEPROM和C51最大的不同就是,前者是直接使用I2C控制器(硬件方式)来产生所需要的I2C时序,而后者是通过软件方式来产生I2C时序。相对来说,前者使用硬件电路简化了编程的复杂性,用户只要将数据发送到相应的数据寄存器,然后I2C控制器自动按照I2C协议把数据通过SCL和SDA总线发送出去。而后者,你必须按照I2C协议手动产生SCL和SDA的高低电平。当然对于EEPROM来说,它是感受不到发送来的数据是通过硬件电路还是软件方式产生的。2.还有,STM32内部集成的I2C控制器不仅可以产生时序,还包括了一些
发表于 2018-07-21 14:36:16

STM32有关GPIO引脚的一些问题

/* 名称:STM32有关GPIO引脚的一些问题 说明:今天在编写一个键盘扫描程序的时候,出现了一些问题。 有的引脚能读出电平状态、有点引脚确一直读不出状态。改了一下午,查了好久,终于有点眉目了。现简述如下: 我在用引脚的时候,使用的是PB0、PB1、PB2、PB3、PB4…,将其引脚配置的方式是上拉输入。PB2、PB3、PB4一直有问题。PB0、PB1是可以读出状态的(但是只能单独使用)。对于PB2来说,其不仅是PB2,它也是BOOT1引脚。当系统复位之后,开始的几个系统时钟使用的是BOOT1,用来判断系统从何处读取置零。之后,PB2就可以作为普通的IO引脚使用了。由于开发板设置
发表于 2018-07-21 12:22:43

STM32定时器之控制LED灯循环显示

/* 名称:STM32定时器之控制LED灯循环显示 说明:对于STM32来说,其定时器要比C51的定时器要多,功能也更复杂。就数目来说来说,STM32的定时器可以分为基本定时器,通用定时器和高级定时器(还包括Systick、看门口定时器和窗口定时器)。就STM32F103,一般来说,它有2个高级定时器TIM1和TIM8、4个通用定时器TIM2/3/4/5、2个基本定时器TIM6和TIM7。而C51一般只有几个定时器。就功能来说, STM32中: 对于基本定时器,其功能就是和C51差不多,只有定时功能。 对于通用定时器,它的功能有定时、输出比较、输入捕获。虽然目前,我也不知道后面两个
发表于 2018-07-21 11:56:24

STM32之LED按键中断

***************************************************************************************************************************************开发板   :奋斗STM32CPU        :STM32F103开发环境:keil uVsion4
发表于 2018-07-21 11:48:43

小广播

热门活动
换一批
更多

何立民专栏

单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号 电信业务审批[2006]字第258号函 京公海网安备110108001534 Copyright © 2005-2018 EEWORLD.com.cn, Inc. All rights reserved