STM32的启动堆栈初始化

发布者:雅逸之风最新更新时间:2020-01-09 来源: eefocus关键字:STM32  启动  堆栈初始化 手机看文章 扫描二维码
随时随地手机看文章

有几个问题,众多博文中抄来抄去,内容一样,却没有解释清楚


上电初始化堆栈,在进入_main后又说初始化堆栈,有什么不同

堆栈的地址是怎么得出来的

关于这两个问题,先借用一下要标准的启动流程

一般而言,系统上电后第一个执行的是由汇编所编写的启动文件,其主要工作为一下五部分:


  (1)、初始化堆栈指针SP=_initial_sp


  (2)、初始化PC指针,令其=Reset_Handler


  (3)、初始化中断向量表


  (4)、配置系统时钟

  

  (5)、调用C库函数_main初始化用户堆栈,从而最终调用main函数进入C的世界


STM32的中断向量表规定每一行必须是SP地址,第二行是复位中断入口地址,上电后,CPU首先就会读这两个值,分别存为SP和PC寄存器。上述流程第一行_initial_sp就是SP地址。

那么_initial_sp的值是怎么得到的呢?这是根据STM32的SRAM分配规则计算的,SRAM从规定的地址开始分别存付已初始全局和静态变量、未初化全局和静态变量、堆、栈,其中变量的长度是你写程序后就固定了,堆和栈的长度则是在启动代码中定义的,那么把它们加起来就会得于_initial_sp的值,编译后,_initial_sp就被替代为上述计算好的地址。


第二个问题,上电已经初始了SP,为什么后边又初始化堆栈?因为上电只是将_initial_sp值存入了SP寄存器,这只是一个栈顶指针,但堆的大小和栈的大小并没有初始化,所以在_main中要把在启动文件中定义好的值传给C库进行堆栈大小的初始化。无论是带系统的,还是裸机程序,都要管理堆栈的大小,这就是会产生堆栈溢出的原因。


另外,对于有MMU的系统,在进入保护模式后,地址切换到虚拟地址,还要对SP重新赋值,因为上电时的地址是实模式下真实的物理地址,而MMU是虚拟线性地址

关键字:STM32  启动  堆栈初始化 引用地址:STM32的启动堆栈初始化

上一篇:STM32系统芯片,加快LoRa IoT智能设备开发
下一篇:STM32堆栈整理

推荐阅读最新更新时间:2024-11-08 22:43

STM32小知识】DMA入门
DMA 全称 Direct Memory Access(直接存储器访问), 是STM32的一个外设,它的特点在于: 在不占用CPU的情况下将数据从存储器直接搬运到外设,或者从外设直接搬运到存储器,当然也可以从存储器直接搬运到存储器。 比如在需要串口发送大量数据的时候,CPU只需要发起DMA传输请求,然后就可以去做别的事情了,DMA会将数据传输到串口发送,DMA传输完之后会触发中断,CPU如果有需要,可以对该中断进行处理,这样一来CPU的效率是不是大大提高了? 在STM32L431RCT6中有 2 个 DMA 外设:DMA1 和 DMA2,每个DMA外设有 7 个通道,每个通道都是独立的,配置DMA的时候有几个关键点:
[单片机]
STM32无法连接JLink(Flash读写保护)解决方法
CPU:STM32F429IGT6 对于其他的stm32芯片或者其他ARM芯片,其实解决方法都相通,主要就是先修改启动方式,再去更改flash或者ram中的程序。 1.问题出现原因 最近在调试一个程序时,始终调试不通,没办法了,就想着参考网上的例程来看看,结果下载的stm32工程可能和板子的硬件不太一样导致stm32 flash读写保护,此后使用JLink再也无法连接上stm32了,Keil中也没办法识别出设备: Snipaste_2020-12-10_10-37-11 2.解决方法 首先,修改stm32的启动方式,我的板子默认设置的是从内部flash启动,这里要解决stm32的读写保护就不能选择从内部flash启动了。修
[单片机]
<font color='red'>STM32</font>无法连接JLink(Flash读写保护)解决方法
如何互换STM32中UART的Rx和Tx引脚及电平的反转
今天给大家分享关于STM32关于UART的一些新特性,主要针对较新系列STM32(如:STM32H7、G0、G4等)的UART,可通过软件改变Rx和Tx引脚、电平反转、高低反序、介绍超时等。 支持RXD和TXD管脚互换 有些时候,我们在外接RS232芯片时,可能会将RXD和TXD两根线接反。这类低级错误,一般是老司机才会犯。 如果大家知道USART的TXD和RXD管脚可以互换,那么在连接外设RS232芯片时,如果发生错误,就不必再修改硬件,只需直接在软件中将RXD和TXD的管脚反转过来即可修正错误。 参考上图,设置SWAP位,即可将RXD和TXD管脚互换。 支持接收和发送的电平极性反转 第二个新特性:Tx和Rx电平极
[单片机]
如何互换<font color='red'>STM32</font>中UART的Rx和Tx引脚及电平的反转
三网融合第二批试点城市遴选启动
昨天,记者从接近国务院三网融合工作小组的人士处获悉,我国三网融合试点工作第二批试点城市的遴选工作已经启动,未能进入第一批试点范围的省会城市将成为遴选的主要对象。 据了解,天津、重庆、广州、成都等城市在没能进入三网融合第一批试点城市名单后,一直在积极争取成为下一批的试点城市,天津、重庆等地甚至已开始了相关业务的试点和推进。据知情人士介绍,几乎国内所有的省会级城市都提交了加入试点城市的申请,因此第二批试点城市的遴选将以这些城市为主,而规模也将较第一批的12个城市有所扩大,一些非省会但经济发达的城市也将有望跻身其中。而第二批试点城市的名单,最快可能在今年年底前对外公布。 事实上,对于是否需要在第二批城市中启动试点工作,从
[网络通信]
33. 外部SRAM实验
STM32F103ZET6 自带了 64K 字节的 SRAM,对一般应用来说,已经足够了,不过在一些对内存要求高的场合,STM32 自带的这些内存就不够用了。比如跑算法或者跑 GUI 等,就可能不太够用,所以战舰 STM32 开发板板载了一颗 1M 字节容量的 SRAM 芯片: IS62WV51216, 满足大内存使用的需求。 本实验采用IS62WV51216 芯片,访问速度为55ns。 一。IS62WV51216简介 兼容TTL电平就是兼容5V,支持高/低字节控制,可以访问8位的字节。 本次实验选择的封装没有CS2引脚,只有CS1,为低电平片选。 LB和UB为低电平有效,比如如果LB==0,说明I/O 0
[单片机]
33. 外部SRAM实验
STM32 USB学习笔记1
主机环境:Windows 7 SP1 开发环境:MDK5.14 目标板:STM32F103C8T6 开发库:STM32F1Cube库和STM32_USB_Device_Library 之前在STM32论坛里领取过一块STM32开发板,本来以为是带有USB模块接口的,最后发现NUCLEO里是没有把USB模块外接出来的,所以就自个儿掏钱买了一块单板,如下图所示: 单板很简单,单纯是为了学习一下STM32的USB模块,之所以选择这个是因为它便宜,而且ST官方有提供USB模块库方便开发。 USB开发博大精深,比之串口,SPI,I2C来说多了很多东西,一个很简单的例子就是串口,SPI,I2C都可以使用通用IO口
[单片机]
<font color='red'>STM32</font> USB学习笔记1
STM32基于固件库学习笔记(9)TM3产生PWM调LED亮度
PWM   脉冲宽度调制模式可以产生一个由TIMx_ARR寄存器确定频率、由TIMx_CCRx寄存器确定占空比的信号,也就是说对脉冲宽度的控制。   STM32 的定时器除了 TIM6 和 7。其他的定时器都可以用来产生 PWM 输出。其中高级定时器 TIM1 和 TIM8 可以同时产生多达 7 路的 PWM 输出。而通用定时器也能同时产生多达 4路的 PWM 输出,这样,STM32 最多可以同时产生 30 路 PWM 输出!    在TIMx_CCMRx寄存器中的OCxM位写入’110’(PWM模式1)或’111’(PWM模式2),能够独立地设置每个OCx输出通道产生一路PWM。必须设置TIMx_CCMRx寄存OCxPE
[单片机]
STM32踩坑记录(1):编写代码时遇到STM32无法进入外部中断的原因及解决方法
@STM32踩坑记录(1) 使用的软件及硬件: 硬件平台:RoboMaster C板(STM32F407IGT6)、Jlink仿真调试器 软件平台:keil5 使用的是标准库+freertos。 ##遇到问题时的场景 在编写RoboMaster C板上的IMU(BMI088)温度闭环控制程序时 ,需要配置外部中断引脚 INT1_ACCEL_Pin(PC4),然后在中断服务函数中给温度控制任务发通知(也就是信号量),温度控制任务就会读取BMI088数据寄存器中的陀螺仪、加速度、温度的值,将温度的值传递给PID控制器,进行PID闭环控温程序。 ##:遇到的问题: 因为板载的BMI088上有两个外部中断引脚,分别为INT1
[单片机]
<font color='red'>STM32</font>踩坑记录(1):编写代码时遇到<font color='red'>STM32</font>无法进入外部中断的原因及解决方法
小广播
设计资源 培训 开发板 精华推荐

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

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

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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