stm32局部变量过大,导致栈溢出

发布者:EnchantedWish最新更新时间:2020-01-11 来源: eefocus关键字:stm32  局部变量  栈溢出 手机看文章 扫描二维码
随时随地手机看文章

在做一个以stm32为主控的项目时发现自己程序中一个机构体里面的数据总是一运行就被改变,刚开始以为是自己不小心在哪个地方用了extern扩展了变量的作用域,重新赋了值, 自己忘记了,后来查找了好久都没有其他地方使用这个结构体变量,于是开始单步调试,结果进入一个函数的时候(里面定义了一个200个数据float型的数组),发现只要定了一个这个数组,这时前文提到的那个结构的值就发生改变,通过在keil软件中的Memory窗口查看结构体的变量可以清楚看到结构体的地址里面的数据在这个时候发生改变, 然后修改,这个局部变量数组的大小,把它改小之后,就没有发生问题。因为局部变量是储存在栈中的,于是猜想,这种问题应该是stm32的栈的内存的溢出造成的。


通过查找资料发现stm32栈和堆的大小,是可以通过startup_stm32f40xx.s(stm32f407)文件设置的,如下图:

其中Stack_Size为栈的大小,默认为0x400,上文提到的出现的问题就是这里的栈的大小太小,溢出导致的,这里出现的问题是某个变量被改变,更严重的时候会修改了芯片核心内存里面的东西,会直接导致芯片奔溃。这里可以改动,从而改变芯片的栈的大小,Heap_Size为堆的大小,默认为0x200,如果没有用没有用到标准库的malloc,动态分配内存,这里的heep_size可以设置为0;

关键字:stm32  局部变量  栈溢出 引用地址:stm32局部变量过大,导致栈溢出

上一篇:STM32--今天下午遇到了两个BUG
下一篇:STM32堆栈溢出的问题

推荐阅读最新更新时间:2024-11-03 06:27

STM32 掉电检测程序
当VDD下降到PVD阀值以下或当VDD上升到PVD阀值之上时,根据外部中断第16线的上升/下降边沿触发设置,就会产生PVD中断 void PVD_IRQHandler(void) { led_ctrl(LED1, ON); if(PWR_GetFlagStatus(PWR_FLAG_PVDO)) { MSD0_WriteSingleBlock(1, buf); } EXTI_ClearITPendingBit(EXTI_Line16); } void PVD_Init(void) { EXTI_InitTypeDef EXTI_InitStructure; NVIC_InitTypeD
[单片机]
STM32外设驱动篇——DHT11温湿度传感器
已在STM32上进行过测试。本例使用PC0引脚连接DHT11的data引脚。 main函数中调用下面代码中的DTH11_test函数即可。 //数据定义: //----以下变量均为全局变量-------- //----温度高8位== U8T_data_H------ //----温度低8位== U8T_data_L------ //----湿度高8位== U8RH_data_H----- //----湿度低8位== U8RH_data_L----- //----校验 8位 == U8checkdata----- u8 U8T_data_H,U8T_data_L,U8RH_data_H,U8RH_da
[单片机]
STM32做SPI主机很常见,但是SPI从机玩过吗?
在平常的开发中,很多时候我们使用SPI都是使用主机模式去驱动一些传感器、存储器等等,很少会用到SPI从机。有时候,我们又需要STM32的SPI配置为从机去接收数据,本文就是介绍如何使用探索者开发版配置SPI从机。 这里我们以探索者开发版标准库实验25SPI实验为基础例程进行修改。这里我们把SPI从机只定义为一个接收,所以没有发送数据的操作。SPI的基础知识需要大家自己去学习,这里着重说明使用方法。 接下来,我们来看一下具体代码实现。 SPI初始化函数修改为如下代码: 这里特别需要几点: 以上代码跟原来程序不同点: ①SPI1的引脚使用的是PA4(SPI1_NSS),PA5(SPI1_CLK)和PA7(SPI1_MOSI)三
[单片机]
基于STM32基本定时器3的PWM输出
说明:使用标准库3.4 #include stm32f10x.h TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; TIM_OCInitTypeDef TIM_OCInitStructure; uint16_t CCR1_Val = 250; uint16_t CCR2_Val = 500; uint16_t CCR3_Val = 750; uint16_t CCR4_Val = 0; uint16_t PrescalerValue = 0; void RCC_Configuration(void); //时钟配置 void GPIO_Configuration(v
[单片机]
STM32学习笔记1 IO口学习
STM32的IO口可以由软件配置成8种模式: 1,输入浮空 2,输入上拉 3,输入下拉 4,模拟输入 5,开漏输出 6,推挽输出 7,推挽复用功能 8,开漏复用功能 每个IO口可以自由编程,单IO口寄存器必须要按32位字被访问。 这里就是寄存器不能位操作咯 STM32的每个IO端口都有7个寄存器来控制。他们分别是:配置模式的2个32位的端口配置寄存器CRL和CRH;2个32位的数据寄存器IDR和ODR;1个32位的置位/复位寄存器BSRR;一个16位的复位寄存器BRR;1个32位的锁存寄存器LCKR;这里我们仅介绍常用 的几个寄存器,我们常用的IO端口寄存器只有4个:CRL、CRH、IDR、ODR。 STM32的CRL控制
[单片机]
STM32中重要的C语言知识点总结
说在前面的话一位初学单片机的小伙伴让我推荐C语言书籍,因为C语言基础比较差,想把C语言重新学一遍,再去学单片机,我以前刚学单片机的时候也有这样子的想法。 其实C语言是可以边学单片机边学的,学单片机的一些例程中,遇到不懂的C语言知识,再去查相关的知识点,这样印象才会深刻些。 下面就列出了一些STM32中重要的C语言知识点,初学的小伙伴可以多读几遍,其中大多知识点之前都有写过,这里重新整理一下,更详细地分析解释可以阅读附带的链接。 assert_param断言(assert)就是用于在代码中捕捉这些假设,可以将断言看作是异常处理的一种高级形式。 断言表示为一些布尔表达式,程序员相信在程序中的某个特定点该表达式值为真。
[单片机]
<font color='red'>STM32</font>中重要的C语言知识点总结
STM32 按键EXTI方式 使用ST3.0.0库
把IO配置为 EXTI中断的步骤: 1:使能EXTI Line时钟和第二功能时钟。 2:配置EXTI Line中断优先级(NVIC) 3:配置EXTI Line IO (哪个引脚,输入模式,初始化) 4:把引脚配置为EXTI Line的中断源(GPIO操作),配置IO口的工作模式 5:配置EXTI Line的工作模式。 ============================================================================== 例如: GPIO_InitTypeDef GPIO_InitStructure; EXTI_InitTypeDef EXTI_InitStruc
[单片机]
STM32使用HAL库开发指南
准备内容 好奇心,耐心,细心 一台电脑,并安装keil5,以及STM32CUBEMX等开发应用。 JLINK或者ST-LINK模块。 STM32开发板或者最小系统板(我选用STM32F103RET6模块,配置与逻辑大同小异)。 01创建工程 步骤 1:在STM32CubeMX中创建一个项目 打开STM32CubeMX软件,在右上方的“Project”标签下,选择“New Project”。 在主界面上选择你需要使用的STM32系列芯片型号。 在左侧的选项树中,选择你需要的外设配置和时钟设置,并进行相应的配置。你可以根据自己的需求勾选或取消勾选相应的外设。 生成完成后,你可以选择打开生成代码所在
[单片机]
<font color='red'>STM32</font>使用HAL库开发指南
小广播
设计资源 培训 开发板 精华推荐

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

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

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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