基于Cortex-M4的STM32F4的复位序列

发布者:InspiredDreamer最新更新时间:2023-07-11 来源: elecfans关键字:Cortex-M4  STM32F4  复位序列 手机看文章 扫描二维码
随时随地手机看文章

初次接触到STM32F7,可能会有个疑惑,为什么0地址变成了ITCM RAM的起始地址。系统复位还是从地址0处开始执行吗?如果是,那这似乎看起来是冲突的。实际上,STM32F7是基于Cortex-M7内核,而Cortex-M7和Cortex-M3/M4的复位序列有些不一样。本文中,将针对这个问题做详细讲解。


STM32F4的复位序列

STM32F4基于Cortex-M4。对于基于Cortex-M3/M4的芯片,复位后总是从0x00000000地址处,取主堆栈指针(MSP)的值,从0x00000004处,取出PC的初始值(这个值是复位向量),然后从这个值对应的地址处取指。

pIYBAF_8AyqAaKHGAABiMYVAmhE037.png

这两个值,就是中断向量表里的第一个和第二个表项的值。

pIYBAF_8AzWAZWlfAAIXOu8qOiE677.png

在Cortex-M3/M4里,复位后默认中断向量表在0地址开始的位置。之后,可以通过修改VTOR寄存器的值,重定位中断向量表。在IAP的应用中,我们会遇到这种情况,如下图:

o4YBAF_8A0GALlzvAAG0K3iieqs796.png

上电复位,先执行IAP程序。此时用到的是位于0地址处的IAP程序的向量表(虽然图中说此时VTOR的值等于0x08000000,实际上,因为ST提供了存储器地址重映射的功能,通过boot引脚的配置,已经将0x08000000处的存储空间重映射到了地址0处,所以0x08000000和地址0x00000000处开始的存储空间是同一块物理空间,其内容当然也是一样的。所以不用修改VTOR的值,VTOR=0也是一样的)。言归正传,上电后,先从IAP复位中断程序开始执行IAP程序,执行完IAP程序后,需要跳转到用户程序,这时就需要将向量表重定位到用户程序的向量表位置(修改VTOR寄存器的值到用户向量表的起始地址)。

这是M3/M4的情况,STM32F7之前的所有芯片都是一样的。


STM32F7的复位序列

前面讲的那些情况,在STM32F7中就有些不一样了。在ARM Cortex-M7的Generic User Guide中,有一段如下描述:“On system reset, thevector table is at the address configured at implementation, typically0x00000000. ”从这段话,我们可以看出,在M7中,复位后向量表的位置不是固定在0地址处,而是可以由各个芯片厂商自己定义。

对于STM32F7来说,它是由BOOT_ADD0[15:0]和BOOT_ADD1[15:0]这两个optionbytes决定的。

o4YBAF_8A06AcrC5AAB7cVQRijQ739.png

Boot 脚= 0时,由BOOT_ADD0 [15:0] 的值决定,ST默认值为0x0020 0000。这是ITCM-FLASH的起始地址(通过ART加速器,访问FLASH);

Boot 脚= 1时,由BOOT_ADD1 [15:0] 的值决定,ST默认值为0x0010 0000。这是system Bootloader的起始地址。

* 如果对BOOT_ADDx写入的地址值超出了存储器映射的范围或者到了保留地址空间,系统将自动转为下面的值:

BOOT_ADD0 = 0x0020 0000;

BOOT_ADD1 = 0x0000 0000(和出厂时ST默认的值0x0010 0000不一样)

也就是说,只要你配置好了boot address, stm32F7芯片的硬件会自动修改向量表的偏移地址寄存器VTOR,使之与boot address相匹配。不需要再通过软件修改VTOR寄存器。

回到本文开始的那个问题。对于STM32F7来说,默认状态下,复位后它并不是从0地址开始执行,而是从0x0020 0000 或者0x0010 0000开始执行,所以与ITCM-RAM从0地址处开始并不冲突。如果你非要将向量表放在0地址开始的位置(修改VTOR寄存器),也不是不可以。只是这是,如果你还要在ITCM-RAM里面跑别的程序的话,就要注意向量表不要与其他程序的地址重叠了。

关键字:Cortex-M4  STM32F4  复位序列 引用地址:基于Cortex-M4的STM32F4的复位序列

上一篇:STM32破解的过程中常见的几个问题
下一篇:关于STM32F103C8T6内部Flash划分的详细说明

推荐阅读最新更新时间:2024-11-03 21:15

STM32F4学习笔记12——RNG随机数发生器
RNG主要特性 RNG 处理器是一个以连续模拟噪声为基础的随机数发生器,在主机读数时提供一个 32 位的 随机数。 RNG的主要特性 ● 提供由模拟量发生器产生的 32 位随机数 ● 两个连续随机数的间隔为 40 个 PLL48CLK 时钟信号周期 ● 通过监视 RNG 熵来标识异常行为(产生稳定值,或产生稳定的值序列) ● 可被禁止以降低功耗 RNG功能描述 随机数发生器采用模拟电路实现。此电路产生馈入线性反馈移位寄存器 (RNG_LFSR) 的种子, 用于生成 32 位随机数。 该模拟电路由几个环形振荡器组成,振荡器的输出进行异或运算以产生种子。RNG_LFSR 由 专用时钟 (PLL48CLK) 按恒定频率提
[单片机]
基于stm32f4的三维旋转显示平台
现实的世界是一个拥有宽度、高度和深度的三维立体世界。在平面二维显示技术已经成熟的今天,三维立体显示技术首当其冲的成为了当今显示技术领域的研究热点。 本作品搭建了基于stm32f4的三维旋转显示平台,它的显示原理属于三维显示中的体三维显示一类。它是通过适当方式来激励位于透明显示体内的物质,利用可见辐射光的产生三维体像素。当体积内许多方位的物质都被激励后,便能形成由许多分散的体像素在三维空间内构成三维图像。 体三维显示又称为真三维显示,因为他所呈现的图像在真实的三维空间中,展示一个最接近真实物体的立体画面,可同时允许多人,多角度裸眼观看场景,无序任何辅助眼镜。 本作品的特点在于,利用stm32f4的浮点运算能力,实现了低成本的体三维
[单片机]
基于<font color='red'>stm32f4</font>的三维旋转显示平台
关于在ARM MDK 中使用STM32F4xx 硬件浮点单元
一. 前言 有工程师反应说Keil 下无法使用STM32F4xx 硬件浮点单元, 导致当运算浮点时运算时间过长,还有一些人反应不知如何使用芯片芯片内部的复杂数学运算,比如三角函数运算。针对这个部分本文将详细介绍如何使用硬件浮点单元以及相关数学运算。 二.问题产生原因 1. ------对于Keil MDK Version 5 版本, 编译器已经完全支持STM32F4xx 的FPU(浮点运算单元),可以直接 使用芯片内部的浮点运算单元。 2. ------对于Keil MDK Version 4 版本, 高版本v4,比如当前keil 官网可下载的v4.74.0.0 版本也已经支持 FPU,可以直接使用芯片内部浮点运算。但如果使用低
[单片机]
关于在ARM MDK 中使用<font color='red'>STM32F4</font>xx 硬件浮点单元
STM32f4按键输入实验代码(01)
我们首先打开 key.c文件,关键代码如下: #include key.h #include delay.h //按键初始化函数 void KEY_Init(void) { GPIO_InitTypeDef GPIO_InitStructure; RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA|RCC_AHB1Periph_GPIOE, ENABLE);//使能 GPIOA,GPIOE 时钟 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4; //KEY0 KEY1 KEY2对应引脚 GPIO
[单片机]
STM32F4学习笔记2——自建库函数整合FFT计算遇到的问题及方法
最近采用FFT计算信号频谱,需要先减去信号均值,参考网上看到的范例,实现了功能,代码为: arm_mean_f32(DataBuffer, SIG_N, &MeanData); for (int16_t k = 0 ; k = SIG_N - 1 ; k++) { DeMeanDataBuffer = DataBuffer - MeanData; } arm_mean_f32(DeMeanDataBuffer, SIG_N, &MeanData2); arm_status status; arm_cfft_radix2_instance_f32 S; status = ARM_MATH_SUCCESS; statu
[单片机]
STM32F4串口DMA配置
在使用串口时,一般采用查询发送,中断接收。但当要接收一串很长的数据时,每收到一个字节进入一次串口中断,有可能会导致中断占用时间过长。如果有一种方式,能够让串口收完一串数据,才进一次中断,那将是对写底层驱动的人来说,是极其好的一件事。经过查资料看手册,发现可以采用串口空闲中断和DMA接收来实现这个功能。具体更详细的说明后续补充,现只贴出代码,以供参考。 调试的过程中发现几个问题: 1、要串口初始化放在DMA初始化之前,否则会出现DMA发送和接收使用不了的问题; 2、DMA接收配置中DMA模式要配置为循环模式,如果配置成为正常模式会导致只能接收到一次数据,问题未知; 如果有某位大神知道这两个问题的原因,望不吝赐教。 画布多
[单片机]
stm32F4+lcd1602实现采集两路adc并显示
以STM32F403为控制核心,设计一种基于STM32的智能照明控制系统,使用光敏电阻作为光照信息来源,使用GP2D12作为人物信息来源,当光照强度改变时,光敏电阻的阻值改变,从而改变STM32的采样电压。当人物移动时,红外传感器的电压改变从而改变采样电压。当光照强度小于一定值,且感应到有人时,LED亮。 通过光敏电阻和GP2D12传感器获取光照和红外信息,作为模拟量,传入STM32F4的采集端口。STM32F4进行模数转换后,在LCD1602上进行显示。 采用了HAL库进行配置STM32F4,一直有个问题就是proteus仿真DS18B20和DHT11这种带有时序要求的传感器,同STM32通信时出现时序错误,有经验的师兄
[单片机]
<font color='red'>stm32F4</font>+lcd1602实现采集两路adc并显示
STM32F407定时器编码器模式
void encoder_left_Init(void) { GPIO_InitTypeDef GPIO_InitStructure; TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; TIM_ICInitTypeDef TIM_ICInitStructure; RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4,ENABLE);//开启TIM3时钟 RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD,ENABLE);//开启GPIOB时钟 GPIO_PinAFConf
[单片机]
<font color='red'>STM32F4</font>07定时器编码器模式
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

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

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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