STM32程序下载成功但是不运行

本文记录了STM32程序在加入SD卡及文件系统功能后无法正常运行的问题,并详细解析了解决方案——调整堆栈大小。通过增大栈(stack)和堆(heap)的分配空间,确保了程序稳定运行。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

调试stm32程序,发现如下问题:

       STM32编写程序,当程序中没有sd卡部分时,程序正常下载,正常运行。当程序中运行sd卡加文件系统时程序能正常下载但是不能正常的运行。发现问题就要解决问题呀,好了大家一起来和我解决问题吧!​

根据自己问题,上网查找解决办法,最终将问题锁定在堆栈设置问题上。(堆栈设置的空间不够大)

解决办法在​stm32的程序目录下查找STM32F10x.s(或者是startup_stm32f10x_hd,这取决于你是用的寄存器还是函数库)

在打开文件,在文件的开头很醒目的位置,发现了关于堆栈的设置。​

从中我们可以看出来对于栈(stack)的大小设置为0x200,堆(heap)的大小为0x0,当修改程序为栈(stack)的大小设置为0x800,堆(heap)的大小为0x400。再试一下,没错,程序可以正常的运行了!

 

       注意我曾尝试单纯的修改栈或者单纯的修改堆的大小但是程序还都是不运行。这似乎说明程序中即有栈溢出,也有堆不够的情况。

分析:原来的设置栈stack的数量是0x200即512个字节。在Fatfs操作过程中,他的每一个写操作的单位就是512字节,堆栈也是512字节,自然会溢出没得说,然后程序就会跳到硬件中断那里歇着去了。所以我们把他改成了2048个字节。(大点应该没有坏处吧。。)

       另外,​栈溢出不一定会死机,比如栈只生长到堆区,或者稍微进入变量区,而且溢出整个过程不对这些区域做写入操作,不对这些区域做取指操作,就可以完美避免hardfault,但溢出还是溢出了,数据还是被修改了.最"直接"的表现是函数调用后,还没看到执行用户代码就发现某些不相干的数据被修改,不过这也足够隐蔽了. 而且,hardfault也不一定是栈溢出的直接结果,只是入栈后数据被修改,出栈时跳转错误(最容易出现),导致指令访问错误,或者数据访问错误。

好这里就说到这里了,下一篇博客将是对stm32堆栈的引申学习​

传送门:

在使用 STM32CubeIDE 下载程序后,程序无法正常运行,可能涉及多个方面的问题,包括硬件连接、软件配置、代码设置以及链接脚本配置等。以下是详细的排查与解决方法: ### 检查硬件连接与供电状态 确保 STM32 开发板与计算机之间的连接稳定,尤其是调试接口(如 SWD 或 JTAG)是否正常工作。检查电源是否稳定,避免因供电足导致芯片无法正常启动。可以尝试更换同的 USB 线或端口以排除连接问题[^1]。 ### 验证调试器配置 STM32CubeIDE 默认使用 ST-LINK 调试器进行程序烧录和调试。检查调试器是否被正确识别,并且在 STM32CubeIDE 的调试配置中选择了正确的调试接口(SWD 或 JTAG)。可以在 **Run > Debug Configurations** 中查看调试器设置是否正确[^1]。 ### 检查启动模式配置 STM32 微控制器的启动模式由 BOOT 引脚决定。确保 BOOT0 和 BOOT1 引脚配置正确,通常情况下,BOOT0 接地(0)表示从主 Flash 启动。若 BOOT 引脚配置错误,可能导致芯片无法从 Flash 启动程序[^1]。 ### 检查复位电路 确保复位电路正常工作,有时复位引脚被外部拉低或复位电容匹配,会导致芯片无法正常复位并进入运行状态。可以尝试手动按下复位键,观察是否能触发程序运行。 ### 查看链接脚本配置 如果程序使用了特殊的内存布局(如 IAP 设计),需要确保链接脚本(`.ld` 文件)正确配置。例如,在 STM32F072RBTX 的链接脚本中,若程序跳转功能占用了前 256 字节的内存,需调整 RAM 起始地址以避免冲突: ```ld RAM (xrw) : ORIGIN = 0x20000100, LENGTH = 16128 ``` 此修改可防止程序跳转时覆盖系统内存关键区域,从而导致程序无法正常运行[^4]。 ### 检查 HAL 库或标准外设库配置 如果使用 HAL 库开发,确保 `SystemClock_Config()` 函数中的时钟配置正确,错误的时钟设置可能导致外设无法正常工作。对于使用标准外设库的情况,需要手动配置启动文件和时钟系统,确保入口函数 `main()` 被正确调用[^3]。 ### 使用调试器单步执行排查问题 通过 STM32CubeIDE 的调试功能,设置断点并单步执行程序,观察是否在某个函数或初始化过程中卡死。尤其是检查 `main()` 函数是否被正确进入,以及系统时钟是否成功初始化。 ### 检查工程配置与编译输出 确保工程配置中选择了正确的 MCU 型号和调试接口。在编译输出信息中查看是否出现警告或错误提示,尤其是链接阶段是否报错或出现未定义符号。 ### 检查 Flash 编程设置 在 STM32CubeIDE 的下载配置中,确保选择了正确的 Flash 算法,并且下载地址与链接脚本一致。可以在 **Run > Run Configurations** 中查看 Flash 下载设置是否正确[^1]。 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值