如何在linux环境下使用gcc进行stm32项目开发

背景

我之前一直是从事单片机相关的开发工作,对于STM32平台的开发,都是在keil中进行的。后来转为搞linux相关的开发了,发现开发工具是大大的不同,linux下的开发都是makefile+gcc+gdb,写代码也是用sourceInsight,代码的编译也是在服务器上进行的,没有了集成开发环境,当对这样的开发模式逐渐熟悉之后才发现Makefile真的很强大,开发效率高,对底层细节也是掌握了很多,弥补了不少盲区。keil工具虽然十分方便,但对于开发人员来说,隐藏了太多的细节,灵活性不高,对于高级应用显得力不从心了。因此在习惯了linux平台的开发之后,我萌生了一个想法:在linux下进行stm32的开发,这里涉及到的开发环境的搭建和调试手段的介绍。本文希望能尽可能详尽的将我所学习到的方法分享给广大技术爱好者和从事stm32开发的工作人员。如有疑问,欢迎留言提问。

开发环境介绍

在linux上进行开发时,公司都会有专用的编译服务器,我们写好的代码都是使用编译服务器上的交叉编译工具链进行编译的,在家里,我使用一台闲置的电脑主机,在其上安装了centos 6.5操作系统,使用它作为编译服务器。编码和调试的开发工作是在一台安装有windows 7的机器上进行的。它们的分工和彼此之间的联系用下图可以表示。

我只是想尽可能详尽的将开发的框架图和涉及到的相关工具罗列清楚,希望不要觉得它们的关系很复杂。服务器是没有显示器可用的,开机以后就不用动它了,所有与服务器相关的操作都是在windows上通过远程登录之后进行的,远程登录使用的工具是SecureCRT,如果你习惯于其它的远程工具也是可以的。在服务器上,我配置并开启了samba服务,这样我就可以在windows上访问inux上的目录与文件,因为我的工程代码都是存放在Linux上的磁盘上的。关于如何配置samba服务,大家可以参考网络上的一些文章。我在windows上映射了一个网络驱动器Z盘,这样可以像访问本地磁盘一样访问linux上的文件。代码编写是在soure Insight中进行的,然后在SecureCRT中的命令行下执行make对工程进行编译,编译好之后再命令行下使用gdb进行调试。当然,这里只能使用远程调试,在Windows上安装了j-link工具,j-link工具安装好以后会找到一个gdbserver的软件,打开它,就可以与j-link调试器通过USB连接好。j-link调试器使用排线连接开发板的jtag接口。整个框架的大致介绍就是这样的,搭建完成以后,编码都是在source insight上进行,编译和调试都是在secureCRT上进行,习惯之后也是非常方便的。

开发环境的构建

1、linux环境搭建

  • samba服务器的搭建

参考网络文章Linux中samba服务器的搭建

安装好以后通过win+R,在运行输入框中输入\\192.168.1.106\public,即可访问linux中的文件系统,192.168.1.106是我的linux的IP地址。

  • 开启SSH服务

参考网络文章Linux开启ssh服务

  • 安装交叉编译工具链

我使用的工具是gcc-arm-none-eabi-4_6-2012q4,该工具可以直接在网上下载,然后解压,添加环境变量即可。

工具链下载路径:https://launchpad.net/gcc-arm-embedded/+download

添加环境变量:export PATH=/opt/gcc-arm-none-eabi-4_6-2012q4/bin:$PATH

2、Windows环境搭建

  • 安装source insight

  • 安装SecureCRT
  • 安装j-Link

我使用的版本是v6.14,请不要使用低版本的j-link,我之前使用的低版本j-link,调试时下载bin文件的速度特别慢。

使用gdb调试代码

设备的连接

  • 将jlink,开发板和PC机链接好,然后上电,打开gdbserver软件,然后进行相关配置。

点击OK按钮后,gdbserver就与j-link调试器建立了链接,但是gdbserver与gdb的链接还未建立。

代码的编译

先看一下我的工程目录

  • 在src目录下存放的都是用户代码,包括main.c
  • 在Libraries目录下存放了stm32的外设库源码,
  • ucosii下存放的是ucos源码
  • libs下存放的是.a的静态库,在编译成功后可看到。
  • build目录下存放的是Makefile文件,进入该目录执行命令make,即可完成编译,
  • bin目录下生成各种结果文件,包括elf文件。

进入build目录,执行make,结果如下:

[justin@localhost build]$  make

开始gdb调试

编译成功后进入bin目录

[justin@localhost build]$  cd ../bin

galieo.elf是我们要调试的程序文件。

在bin目录下执行:

[justin@localhost bin]$  arm-none-eabi-gdb galileo.elf

这里需要重点说明一下,之所以我能在执行完命令之后让gdb自动与gdbserver进行连接,并且启动程序,让程序停在main函数处。主要是利用了.gdbinit的初始化脚本。.gdbinit的初始化脚本存放在与elf文件相同的目录下,即bin目录。脚本的内容如下

target remote 192.168.1.104:2331
set mem inaccessible-by-default off
monitor speed auto
monitor endian little
monitor reset
monitor flash device = STM32F103ZE
monitor flash breakpoints = 1
monitor flash download = 1
load
monitor reg sp = (0x08000000)
monitor reg pc = (0x08000004)
break main
continue

在 /home目录下也创建一个.gdbinit文件,文件内容为:

set auto-load safe-path /

192.168.1.104是我的windows主机的IP。在gdb下使用monitor命令,可以让gdbserver给j-link发送命令,这里操作包括:设置速度、设置大小端模式、复位、设置flash大小、设置栈指针和pc指针等等。然后设置断点,最后使用continue让调试运行。
这时候,可以看到gdbserver软件与运行在linux上的arm-none-eabi-gdb建立了网络连接。

 在gdb下执行命令continue(或者直接使用c快捷命令),即可继续运行程序。

可看到串口上已有相关字符的输出,说明程序已经在跑了。

参考工程源码

为了方便大家掌握这种开发方法,我提供了一个示例工程,里面最有用的东西就是makefile的编写和链接脚本的修改了。

下载地址为:https://gitee.com/my-zhongjun/stm32f10x_platform_development.git

  • 9
    点赞
  • 55
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值