前面零散地记录了一些如何安装编译器,调试器等笔记,这里就准备开始着手试一下这整块系统了。
简单不完全地回顾一下所需要安装的软件:
1 编译器
使用的是codesourcey,因为之前有使用过该套编译器,所以就顺手了。该套编译套件已经被mentor graphic收购了,它一直在更新并提供了lite版本。类似的交叉编译套件还可以使用Linaro,YAGARTO,summon等,都是免费使用的。
按各自官方网站下载并编译安装就可以了。安装完成在命令行中运行
arm-none-eabi-gcc --version
有显示类似信息就表示安装好了编译器
merlin@riliwan:~$ arm-none-eabi-gcc --version
arm-none-eabi-gcc (Sourcery CodeBench Lite 2013.11-) 4.8.
Copyright (C) Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. merlin@riliwan:~$
2 如果你和我一样,对Makefile不熟悉,那么你可能想用eclipse来管理你的工程(这样就不用编写makefile文件啦)
去www.eclipse.org下载Juno For C/C++版本的(Eclipse IDE for C/C++ Developers, 148 MB)
由于eclipse是基于java的程序,而默认的ubuntu是没有安装jre的,这时你还需要安装jre。在terminal中输入以下命令安装JRE
sudo apt-get install default-jre
这时就可以运行eclipse了。
还需要在eclipse中安装管理ARM工程的插件(通常来说是使用下面的方法来安装的,地址:http://gnuarmeclipse.sourceforge.net/updates),看图:
但是,该插件已经更新到了Kepler版本的eclipse了,直接在这里安装时会缺少信赖项(它信赖更高级的CDT)。因而只能把对应的插件下载到硬件中来,然后从硬盘安装。步骤如下:
A 下载对应的GNU ARM插件版本Version: 0.5.5.201309281715
似乎只能使用该版本的,更高版本并不兼容Juno。
B 下载下来之后,在Help -> Install New Software...中Add... -> Archive...后安装就可以了
C 安装成功后查看一下Help -> About -> Installation Details
可能有些同学会问,那既然GNU ARM不支持更低版本的Eclipse又支持最新版本的Eclipse。为何不使用最新版本的呢,这样不就很匹配了吗?这里有一个问题是GDB Haraware Debugging插件安装上去之后调试界面那里没有对应的设置页出来,相当于无法调试了!我在网上查阅了许多资料,也碰到过有人也遇到同样的情况,未解决,所以只能这样退出而求其次了。(也有一个发现,有人使用基于CodeBlocks来做嵌入式IDE开发环境的,你可以自己去看看,地址http://www.emide.org/)
在调试之前,还需要安装以下插件。在Help -> Install New Software...中找到或者自己输入地址http://download.eclipse.org/tools/cdt/releases/juno)
- C/C++ GDB Hardware Debugging
- C99 LR Parser
- GNU ARM C/C++ Development Support
这些插件之后,就可以到小虫子->Configuration看到下面内容了
如果你的Kepler可以看到这些内容,烦请告诉我一声,我的Kepler安装了GDB Hardware Debugging之后一直是出不来这个项的。
3 安装STLinkV2
第一步是安装libusb库和pkg-config,后者一般是已经安装好了的。
sudo apt-get install libusb-1.0.-dev pkg-config
第二步是下载源码,在某个有写权限的地方新建一个文件夹用于存储源文件,进入该文件夹然后在终端中输入以下命令从git上获取源码
git clone https://github.com/texane/stlink
进入包含有Makefile文件的文件夹,执行以下命令:
$ ./autogen.sh
$ ./configure
$ make
生成st-flash,st-info,st-util等文件,将这些生成的st-*文件拷贝某处并添加到PATH,这样就可以在终端上执行这些命令了。PATH可以使用export设置,也可以使在.~/bashrc中设置,更可以在/etc/enviroment中设置(推荐,这样就可以不光只能在终端中调用这些命令了)
不过这个时候,在ubuntu下去访问stlink会出现错误提示:
merlin@riliwan:~$ st-util
--28T13:: WARN src/stlink-usb.c: Couldn't open ST-Link/V2 device 002:006
哦,原来这里还差一步,进入stlink源码中将根目录下的*.rules文件拷贝到/etc/udev/rules.d/下面去,执行下面两条指令
$ sudo cp *rules /etc/udev/rules.d/
$ sudo udevadm control --reload-rules
这样做之后,重新插拔一次stm32f4-discovery开发板就能正确识别了,看图:
好了,准备工作都差不多了。
可是。。。你是不是现在还担心这套环境是不是真的方便使用呢?我们现在立刻马上就下载一个程序到板子上去运行试试。
我这里提供一个bin文件,这样你通过查看现在就可以确保程序已经真正下载到板上去了。
如果你的板就是原来的demo程序,那么先把这些程序擦除掉,使用下面命令
$ st-flash erase
然后使用下载命令
$ st-flash write t/STM32F4-Discovery_Demo_0x08008000.bin 0x08008000
下载成功后你的开发板就该有现象了(灯就会闪了。按User键之后它会切换闪烁模式了有没有?不过复位之后这个程序就不能再运行了,需要重新再烧写),看图:
测试完毕。
以上准备已经差不离了,我们正式开团
原本我是想使用st.com官方库来做demo的,但我发现了另外一个好玩意,就是libopencm3,大家可以自己去该官网去下载源码然后编译之。(直接进stm32f4目录下面执行make就可以生成libopencm3_stm32f4.a了)。
使用Eclipse新建一个叫做ocm3_blink的工程。
1 启动eclipse,然后新建一个工程,名字就叫做ocm3_blink;
2 将编译生成的libopencm3_stm32f4.a复制到工程目录/lib下面,将libopencm3源码中的include文件夹直接复制到工程目录中来(虽然里面有许多头文件明显不是stm32的,但暂时还不用去理会这些),最后将blink.c复制到工程/user目录下去。最后得到这样的目录结构:
3 设置头文件搜索目录
4 设置链接时的库文件搜索目录及库文件
5 将libopencm3源码中的两个ld文件libopencm3_stm32f4.ld和stm32f4-discovery.ld复制到Debug目录中来,之后设置链接器使用该脚本。这里还需要注意一点,要把Do not use standard start files这个选项给选上,否则无法编译成功(会出VFP register错误)。
6 然后点击编译按键
6 编译好程序之后需要将程序下载到实际板子上运行才知道它是不是已经达到我们的目的了,在此我们进一步尝试使用Eclipse的硬件调试功能。下拉这只小虫子然后选择Configuration
7 新建一个GDB Hardware Debugging,设置一下Debugger标签中的内容后close(因为需要运行了st-util才能正确debug),如下图
8 这里我们在终端中启动一个st-util服务
merlin@riliwan:~/t$ st-util
--09T22:: INFO src/stlink-common.c: Loading device parameters....
--09T22:: INFO src/stlink-common.c: Device connected is: F4 device, id 0x10016413
--09T22:: INFO src/stlink-common.c: SRAM size: 0x30000 bytes ( KiB), Flash: 0x100000 bytes ( KiB) in pages of bytes
Chip ID is , Core ID is 2ba01477.
Target voltage is mV.
Listening at *:...
9 再回来Eclipse中,点击Debug按键开始调试,应该看到类似这样的界面了(该界面我自己重新定制过),表明已经在调试状态了。
全速运行之后会发现灯在闪烁(有的时候可能全速后就会死掉,那你可以先试一下手动运行到main函数中,在时头的while()循环中全速运行。我这里就是这样子的)。
示例工程下载ocm_blink.zip