打印
[其他ST产品]

解决PLATFORMIO STM32F407VE工程卡死在启动文件的问题

[复制链接]
223|11
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
g36xcv|  楼主 | 2023-1-30 12:47 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
解决PLATFORMIO STM32F407VE工程卡死在启动文件的问题
由于工作原因,需要在linux平台做固件开发,因此在查询了一些资料后,选择了vscode+platformio的方式来搭建STM32的开发环境。但是在调试STM32F407工程的时候出现了一些问题,因此特意记录一下。

环境
Ubuntu 18.04 lts;vscode 1.58.0;platformio core5.1.1 home 3.3.4;MCU STM32F407VET6

问题现象
使用board generic-stm32f407vet6创建的工程还未跳转到main就卡死在启动文件的Infinite_Loop中,如下图。


————————————————

版权声明:本文为CSDN博主「salalei」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。

原文链接:https://blog.csdn.net/salalei/article/details/118711952

使用特权

评论回复
沙发
g36xcv|  楼主 | 2023-1-30 12:52 | 只看该作者
分析
经过仔细调试发现程序一旦运行到__libc_init_array以后就会跳转到Infinite_Loop,而__libc_init_array查找资料后发现是用来初始化C库的,而为何最后会跳转到Infinite_Loop,实际上是因为我们的HardFault_Handler的中断函数没有定义,所以跳转到默认的中断函数上,我们可以定义一个HardFault_Handler函数,就会发现确实是触发硬件错误中断。如下图。

使用特权

评论回复
板凳
g36xcv|  楼主 | 2023-1-30 12:54 | 只看该作者

使用特权

评论回复
地板
g36xcv|  楼主 | 2023-1-31 10:57 | 只看该作者
一开始我以为是启动文件存在问题,反复试了很多次后,却发现board选择STM32F407IGT6就是没问题,并且他和STM32F407VET6共用一个启动文件,没办法,于是我只能反复确认两者编译时需要的文件哪些不同,最后我定位到了STM32F407VE_DEFAULT.ld文件,在./platformio/packages/tool-ldscripts-ststm32中,可以发现这文件是copy自STM32F030C6Tx,连头部注释都没改。如图。

使用特权

评论回复
5
g36xcv|  楼主 | 2023-1-31 11:01 | 只看该作者

使用特权

评论回复
6
g36xcv|  楼主 | 2023-1-31 11:01 | 只看该作者
仔细检查该文件,发现在内存定义那有个严重错误。如图。

使用特权

评论回复
7
g36xcv|  楼主 | 2023-1-31 11:02 | 只看该作者
STM32F407VET6内存大小确实是192KB,但是他其实是有三块内存组成,其中有一块64KB的CCM地址是不连续的。以下为数据手册描述。

使用特权

评论回复
8
g36xcv|  楼主 | 2023-1-31 11:03 | 只看该作者


使用特权

评论回复
9
g36xcv|  楼主 | 2023-1-31 11:09 | 只看该作者
到这里问题就简单了,直接将RAM的LENGTH修改为128K,重新编译,运行,解决。

使用特权

评论回复
10
g36xcv|  楼主 | 2023-1-31 11:10 | 只看该作者
结论
STM32F407VE_DEFAULT.ld文件内存定义存在问题。

使用特权

评论回复
11
g36xcv|  楼主 | 2023-1-31 11:10 | 只看该作者
解决方法
将./platformio/packages/tool-ldscripts-ststm32/STM32F407VE_DEFAULT.ld中的内存定义改为下图方式

使用特权

评论回复
12
g36xcv|  楼主 | 2023-1-31 11:11 | 只看该作者

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

22

主题

194

帖子

0

粉丝