硬汉嵌入式论坛

 找回密码
 立即注册
查看: 640|回复: 16
收起左侧

[开发工具] 尝试在Ubuntu中使用gcc-arm-none-eabi和标准库开发stm32单片机,但是出错了

  [复制链接]

1

主题

7

回帖

10

积分

新手上路

积分
10
发表于 2025-3-10 23:15:56 | 显示全部楼层 |阅读模式

尝试在Ubuntu中使用gcc-arm-none-eabi和标准库开发stm32单片机,但是报错了。使用的工具有gcc-arm-none-eabi,cmake,openocd。启动文件和链接脚本是在stm32f10x固件库里面随便找的,不知道是否是这里出了问题。在stm32f103c8t6最小系统板烧录了一个点亮pc13引脚的led的程序,烧录成功但是灯没亮,在gdb调试一直卡在0x20000004。我自己觉得还有一个可能是在编译时出了问题,因为在使用cmake时也报了一些错误,是文件找不到之类的,但是我后来加上了,然后也没有报错。
(gdb) target remote localhost:3333
Remote debugging using localhost:3333
0x20000004 in completed ()
(gdb) n
Single stepping until exit from function completed.1,
which has no line number information.
halted: PC: 0x20000004
halted: PC: 0x20000004
halted: PC: 0x20000004
halted: PC: 0x20000004
halted: PC: 0x20000004
halted: PC: 0x20000004
halted: PC: 0x20000004
(gdb) load STM32Project.elf
Loading section .text, size 0x174 lma 0x8000000
Loading section .init_array, size 0x8 lma 0x8000174
Loading section .fini_array, size 0x4 lma 0x800017c
Loading section .data, size 0x4 lma 0x8000180
Start address 0x08000000, load size 388
Transfer rate: 1 KB/sec, 97 bytes/write.
(gdb) info registers pc
pc             0x8000000           0x8000000 <deregister_tm_clones>
(gdb) n
warning: Invalid state, unable to determine sp alias, assuming msp.
Single stepping until exit from function deregister_tm_clones,
which has no line number information.
halted: PC: 0x08000002
halted: PC: 0x08000004
halted: PC: 0x08000006
halted: PC: 0x0800000e
halted: PC: 0x20000004
0x20000004 in completed ()
编译成功后有警告
[ 96%] Building C object CMakeFiles/STM32Project.elf.dir/src/system_stm32f10x.c.o
[100%] Linking C executable STM32Project.elf
/home/cien/桌面/gcc-arm-tool/gcc-arm-none-eabi/bin/../lib/gcc/arm-none-eabi/14.2.1/../../../../arm-none-eabi/bin/ld: warning: cannot find entry symbol Reset_Handler; defaulting to 08000000
/home/cien/桌面/gcc-arm-tool/gcc-arm-none-eabi/bin/../lib/gcc/arm-none-eabi/14.2.1/../../../../arm-none-eabi/bin/ld: warning: STM32Project.elf has a LOAD segment with RWX permissions
工程压缩包附上了。希望有懂的人能够不吝赐教,我对这方面不太了解,感谢你们的回复与帮助。 led.7z (226.13 KB, 下载次数: 2)
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115434
QQ
发表于 2025-3-11 05:51:33 | 显示全部楼层
帮顶。
回复

使用道具 举报

0

主题

19

回帖

19

积分

新手上路

积分
19
发表于 2025-3-11 08:42:27 | 显示全部楼层
用 stm32cubemx 生成 makefile 工程,这样你就得到了 makefile 文件、启动文件、连接文件
我用国产 mcu 也是搬 cube 生成的 三件套 使用
(除了 at32 也有 cube 工具可生成 启动文件、连接文件,只借用 stm32 的 makefile 文件)
回复

使用道具 举报

0

主题

19

回帖

19

积分

新手上路

积分
19
发表于 2025-3-11 08:43:52 | 显示全部楼层
warning: STM32Project.elf has a LOAD segment with RWX permissions
这个警告可以忽略,是 elf 文件在电脑上的权限问题,对最终 hex 或 bin 文件没有任何影响
回复

使用道具 举报

1

主题

7

回帖

10

积分

新手上路

积分
10
 楼主| 发表于 2025-3-11 11:01:11 | 显示全部楼层
我重新换了一下启动文件和链接脚本,烧录是可以的,但是hex好像有问题,跟例程的hex文件不一样,我在Windows上用例程的hex文件可以成功点亮,但是在Ubuntu上用编译出来的hex文件就不行,不知道问题是不是出在编译过程上,附上更改后的工程文件。想请问一下如何想要在Linux下开发stm32单片机,有什么好的建议吗?个人倾向于使用标准库。 led1.7z (229.42 KB, 下载次数: 1)
Template.txt (3.16 KB, 下载次数: 0)


回复

使用道具 举报

1

主题

7

回帖

10

积分

新手上路

积分
10
 楼主| 发表于 2025-3-11 11:03:22 | 显示全部楼层
dukelec 发表于 2025-3-11 08:42
用 stm32cubemx 生成 makefile 工程,这样你就得到了 makefile 文件、启动文件、连接文件
我用国产 mcu 也 ...

请问使用标准库开发也可以使用stm32cubemx生成吗?国产的单片机也可以用stm32cubemx生成吗?请问具体应该怎么做呢?
回复

使用道具 举报

1

主题

5

回帖

8

积分

新手上路

积分
8
发表于 2025-3-11 11:42:37 | 显示全部楼层
楼主的工程主要有两个错误。
1. Cmake project配置错误,楼主的工程需要编译汇编文件,那么project(STM32Project C)应该改为project(STM32Project C ASM)

2.startup启动汇编文件和ld链接脚本文件不符合。汇编文件中有_estack(设置堆栈地址)和_sidata(data段在flash中的加载地址),这两个需要在ld脚本中指定。
                            . = ALIGN(4);
                            .data {
                            };
                            _sidata = LOADADDR(.data);

                           _stack_top = ORIGIN(RAM) + LENGTH(RAM);
                         PROVIDE(_estack = _stack_top);
回复

使用道具 举报

1

主题

7

回帖

10

积分

新手上路

积分
10
 楼主| 发表于 2025-3-11 12:58:41 | 显示全部楼层
ryq0110 发表于 2025-3-11 11:42
楼主的工程主要有两个错误。
1. Cmake project配置错误,楼主的工程需要编译汇编文件,那么project(STM32P ...

你好,我按照你说的修改了cmakelists,但是我不知道如何修改ld文件,我在github上找了一个也是用arm工具链开发stm32f103的工程,把启动文件和链接脚本都换了,但是仍然不行,请问您可以指导我一下吗,非常感谢。以下是新的工程文件。 end.7z (229.92 KB, 下载次数: 1)

github上面的项目

回复

使用道具 举报

1

主题

7

回帖

10

积分

新手上路

积分
10
 楼主| 发表于 2025-3-11 13:02:04 | 显示全部楼层
ryq0110 发表于 2025-3-11 11:42
楼主的工程主要有两个错误。
1. Cmake project配置错误,楼主的工程需要编译汇编文件,那么project(STM32P ...

这是编译成功的内容。
[ 96%] Building ASM object CMakeFiles/STM32Project.elf.dir/src/startup_stm32f10x_md.s.o
[100%] Linking C executable STM32Project.elf
/home/cien/桌面/gcc-arm-tool/gcc-arm-none-eabi/bin/../lib/gcc/arm-none-eabi/14.2.1/../../../../arm-none-eabi/bin/ld: warning: STM32Project.elf has a LOAD segment with RWX permissions
Generating BIN/HEX and printing size
   text           data            bss            dec            hex        filename
   1284             16           1076           2376            948        STM32Project.elf
[100%] Built target STM32Project.elf

以下是调试时一直卡住的内容。
(gdb) target remote localhost:3333
Remote debugging using localhost:3333
0x080003ae in Reset_Handler ()
(gdb)
(gdb) n
Single stepping until exit from function Reset_Handler,
which has no line number information.
halted: PC: 0x080003ae
halted: PC: 0x080003ae
halted: PC: 0x080003ae
halted: PC: 0x080003ae
halted: PC: 0x080003ae
halted: PC: 0x080003ae
回复

使用道具 举报

0

主题

57

回帖

57

积分

初级会员

积分
57
发表于 2025-3-11 15:30:40 | 显示全部楼层
"启动文件和链接脚本是在stm32f10x固件库里面随便找的",关键文件不能随便呐。

STM32CubeMX 很早就支持生成 makefile,看它的广告现在连 cmake 都支持了。

有兴趣折腾的话,可以考虑从 STM32 Bare-Metal Programming 开始,仅有 C 文件、starup 文件、ld 文件、makefile 等几个文件,Windows 下也能跑。
回复

使用道具 举报

22

主题

319

回帖

385

积分

高级会员

积分
385
发表于 2025-3-11 16:33:28 | 显示全部楼层
回复

使用道具 举报

6

主题

27

回帖

50

积分

初级会员

积分
50
发表于 2025-3-11 16:59:32 | 显示全部楼层
可以试试我这个方法!
不管在Linux还是mac还是windows都可以用:
https://www.armbbs.cn/forum.php?mod=viewthread&tid=127828

开发环境是:stm32cube+stm32cubeclt+vscode(cursor或者trae也可以)+vscode的扩展stm32 vscode extensions+stlink
stm32 vscode extensions是官方前年给vscode做的插件,可以实现用cmake在vscode上编译stm32工程,并且cubeclt提供cortex-debug,不需要自己配置编写openocd
回复

使用道具 举报

1

主题

5

回帖

8

积分

新手上路

积分
8
发表于 2025-3-11 17:02:29 | 显示全部楼层
cien 发表于 2025-3-11 12:58
你好,我按照你说的修改了cmakelists,但是我不知道如何修改ld文件,我在github上找了一个也是用arm工具 ...

你用gdb调试时,生成的elf文件需要带调式信息,那么CMAKE_C_FLAGS需要增加-ggdb
回复

使用道具 举报

1

主题

7

回帖

10

积分

新手上路

积分
10
 楼主| 发表于 2025-3-13 13:12:43 | 显示全部楼层
大家好,感谢大家的回复与帮助,我在github上找了一个stmf103 makefile的模板,将它的链接脚本换到我自己的工程里面,用openocd烧录就可以了,用了江协的例程可以使用。文件附在下面了。CMakeLists和文件结构还需要改进一下,在这过程中还是学到一些东西的,但是这个过程每一步都需要自己搭建,如果想简单点可以使用stm32cubemx和stm32的ide会好一点,只是我只学习了标准库,hal没有尝试过。希望以后能够和大家学到更多东西。 stm32f10x_makefile_template-master.zip (338.21 KB, 下载次数: 1)
end.7z (234.57 KB, 下载次数: 0)


回复

使用道具 举报

1

主题

7

回帖

10

积分

新手上路

积分
10
 楼主| 发表于 2025-3-15 11:20:26 | 显示全部楼层
我完善了cmakelists文件。还有我尝试用stm32cubemx生成的启动文件和链接脚本,同样可以使用,只有旧版本的链接脚本有些问题,需要升级到最新版本。这样就可以使用gcc-arm编译器在linux环境下开发stm32,我用的是标准库可以正常使用(简单的点灯和闪烁程序),hal应该也没有问题。工程文件附在下方了,还有参考的文章。https://community.st.com/t5/stm32cubemx-mcus/flash-ld-syntax-error-when-upgrading-to-cubemx-v6-12-1/m-p/727984#M29732
用cubemx生成的链接文件.7z (233.98 KB, 下载次数: 1) 用原来的链接文件.7z (233.98 KB, 下载次数: 1)


回复

使用道具 举报

0

主题

1

回帖

1

积分

新手上路

积分
1
发表于 2025-3-25 22:26:14 | 显示全部楼层
楼主第一个编译告警怎么解决的
回复

使用道具 举报

1

主题

7

回帖

10

积分

新手上路

积分
10
 楼主| 发表于 2025-4-15 22:26:45 | 显示全部楼层
wzzyyd 发表于 2025-3-25 22:26
楼主第一个编译告警怎么解决的

貌似是换启动文件和链接脚本,两者一定要匹配得上。可以用CUBEMX选择Cmake生成。我上面有发可以使用的模板。如果没有对标准库有硬性要求的话,还是建议使用HAL库,ST官方的IDE和CUBEMX。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2025-4-26 01:53 , Processed in 0.316162 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表