先说两句
最近公司要做一个单片机上的项目,虽然之前学过一点点,不过当时只会写“hello world”级别的代码。感觉这东西挺好玩的,趁着晚上下班没事学一下,随便记录一下开发环境的搭建过程。
开发板是STM32F407G-DISC1
,大学搞飞控的时候买的,当时我在团队里面是划水的。之前是在win10系统开发,现在换了linuxmint系统,要重新学一下怎么搭环境,主要是参考大佬的 https://blog.csdn.net/u010000843/article/details/114531922 这篇博客搭的。用到的工具先列一下吧:
工具 | 介绍 |
---|---|
vscodium | vscode完全开源版的IDE,和vscode很像 |
STM32CubeMX | ST公司的代码自动生成工具 |
gcc-arm-none-eabi | arm平台的GNU编译器 |
openOCD | 开源的烧录调试工具 |
好的,接下来就开始吧。
开发工具安装
vscodium
去GitHub上下载,地址:https://github.com/vscodium/vscodium/releases。建议不要装1.5x.x版本的,代码提示经常加载不出来,vscode也是一样。
STM32CubeMX
ST官网上下载安装就好了,传送门。
gcc-arm-none-eabi
这个在arm官网上有,传送门,下载后解压到你喜欢的某个路径下,然后把里面的bin
目录添加到PATH
环境变量里。方法如下:
1 | vi ~/.bashrc |
一切顺利的话,可以查到编译器的版本号。
1 | arm-none-eabi-gcc --version |
openOCD
用apt安装:
1 | sudo apt-get install openocd |
成功安装完后可以看到openOCD版本号,电脑用USB线连接上开发板后,可以用lsusb
命令可以看到相关信息。
1 | openocd -v |
生成工程代码
作为演示,这里就生成一个点亮板子LED灯的代码吧。
创建项目
首先,打开STM32CubeMX,新建一个project。
然后选择对应的芯片型号,我这块板子用的是
STM32F407VGT6
这块MCU,所以选这个:
配置项目
打开调试功能:
打开System Core->SYS,Debug模式选择Serial Wire,也就是SWD。配置GPIO:
去官网上查这块开发板的CAD文档,在最后一页右下角找到了LED的部分,发现绿色的灯连的是PD12引脚,黄色的灯是PD13,红色的是PD14,蓝色的是PD15,这里就试一下蓝色和红色的灯吧,那接下来配置PD14和PD15这两个引脚就好了。
回到STM32CubeMX里,在芯片图右边找到这两个引脚,鼠标单击,两个引脚都配置成GPIO_Output
模式。
然后点击左边的System Core->GPIO就可以看到这两个引脚的配置选项了,接下来把这两个引脚配置成输出高电平(High),使用推挽输出(Pull-up)方式(不记得这个推挽输出是啥意思了),如下图:
到这里项目就配置好了,接下来是生成代码。
生成代码
进入Project Manager,填写项目名字和保存路径,选择使用Makefile管理项目,然后点右上角的GENERATE CODE生成代码。
如果是第一次生成代码,会弹出一个框,意思大概是要先下载一个F4的包才能生成代码,这个包默认是下载到home目录下的STM32Cube里,因为文件夹开头是不带”.”隐藏的,对于我这个强迫症来说,受不了home目录下有莫名其妙的文件夹。幸好在Help->Updater Setting有个Repository Folder,可以指定包的保存路径(设置前要先点File保存关闭项目才能设置),把路径改成了CubeMX的安装路径,然后把home目录下的STM32Cube删除,舒服了(๑¯∀¯๑)!
编译烧录
编译
在项目目录下make
就好了。如果编译成功,项目会在目录下创建一个build文件夹,里面有与项目名字相同的.bin文件和.hex文件。
1 | make |
烧录
把开发板连上电脑,然后开一个终端,用openocd连接开发板,命令如下:
1 | openocd -f 烧录器配置文件 -f MCU配置文件 |
烧录器配置文件在/usr/share/openocd/scripts/interface
目录下,MCU的配置文件在/usr/share/openocd/scripts/target
目录下,根据开发板选择对应的配置文件。我的这块开发板的烧录器是stlink-v2.1,MCU是STM32F407VGT6
,所以连接的命令和输出是酱紫的:
1 | openocd -f /usr/share/openocd/scripts/interface/stlink-v2-1.cfg -f /usr/share/openocd/scripts/target/stm32f4x.cfg |
连接成功后再开一个终端,用telnet
连接本地的4444端口,与openocd通信。然后用program 生成的hex文件路径
把程序烧录进开发板,如果出现** Programming Finished **
,说明烧录成功。然后用reset
命令重启开发板,这个时候应该就可以看到开发板的红灯和蓝灯亮了,最后用exit
命令退出。
1 | telnet localhost 4444 # 连接 |
配置vscodium
安装ARM插件
在vscodium插件商店里搜索ARM
和Cortex-Debug
,安装。vscodium默认用的是插件商店是open-vsx.org,下载比较慢,而且很多vscode库里的插件没有,改成vscode库的方法可以参考这里传送门。
添加C++配置
用vscodium打开项目后会有很多红色的报错,可以添加C/C++的配置文件来去掉。按下快捷键Ctrl+Shift+p
,输入C/C++,然后点击Edit Configurrations(JSON)
然后打开项目目录下的.vscode/c_cpp_properties.json文件,把defines
配置成下面这样:
1 | { |
一键编译烧录调试
在工程的.vscode目录下新建一个tasks.json
和launch.json
。
tasks.json
用来编译项目,在这里就是make一下,可以参考下面这样写。
1 | { |
launch.json
用来配置运行和调试,可以参考下面这样写。
1 | { |
launch.json
里面有个svdFile
配置项,用来指定svd文件,有这个文件能查看寄存器的值,不配置这个选项也能调试。可以在https://github.com/posborne/cmsis-svd找到,每个MCU都不同,下载对应的svd文件,放到项目目录下就好了。
接下来试一下能不能调试,在Core/Src/main.c
的main
函数里设置一个断点,然后按F5开始调试,然后就gg了….emmmm….
打开调试控制台,发现报了下面这个错误。
undefined/home/ganyuo/programs/gcc-arm-none-eabi/bin/arm-none-eabi-gdb: error while loading shared libraries: libncurses.so.5: cannot open shared object file: No such file or directory
意思是说找不到libncurses.so.5
这个动态链接库,用ldconfig
命令找了一下,发现只有libncurses.so.6
,2333…..
1 | ldconfig -p | grep libncurses.so |
用apt-get
把libncurses5
这个包装上以后就可以找到这个库了。
1 | $ sudo apt-get install libncurses5 |
再试一下能不能调试,这次没问题了,开心!<(* ̄▽ ̄*)/
刚开始调试的时候会停在用来引导的汇编代码里面,继续按F5就运行到main函数里的断点了。