我之前一直是从事单片机相关的开发工作,对于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上进行,习惯之后也是非常方便的。
参考网络文章Linux中samba服务器的搭建
安装好以后通过win+R,在运行输入框中输入\\192.168.1.106\public,即可访问linux中的文件系统,192.168.1.106是我的linux的IP地址。
参考网络文章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
我使用的版本是v6.14,请不要使用低版本的j-link,我之前使用的低版本j-link,调试时下载bin文件的速度特别慢。
点击OK按钮后,gdbserver就与j-link调试器建立了链接,但是gdbserver与gdb的链接还未建立。
先看一下我的工程目录
进入build目录,执行make,结果如下:
[justin@localhost build]$ make
编译成功后进入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