接上篇文章,弃用Keil,配置CLion编译STM32程序。
参考文章:
1.Clion实现Stm32标准库开发 - 哔哩哔哩 (bilibili.com)
2.【教程】手把手教你用Clion进行STM32开发【如何优雅の进行嵌入式开发】 - 知乎 (zhihu.com)
过程不再赘述,记录我遇到的关键问题:
1.用CLion生成CubeMX工程
创建工程到这一步
还未打开CubeMX的时候,整个工程就已经创建出来了,生成的目录如下:
可以看到已经有Startup这个文件夹,里面有启动文件:
芯片默认是f030f4px,不知道为什么是这样,但没关系,点击“Open with STM32CubeMx”
打开软件后更改芯片,设置好后,点击Generate Code
会覆盖原来的目录,新生成的目录如下:
Startup在Core文件夹里:
里面有更改过的芯片的启动文件:
2.移植标准库,整理目录
网上的文章移植标准库,整理目录,大家都不太一样。有两个原因:
1.大家本来用的开发板不一样,对应的Keil工程文件目录也不一样,有原子的,有野火的,也可能有别家的。
2.STM32CubeMx的版本不一样也可能导致生成的工程文件目录不一样。
我参考了本文开头的两篇文章链接,然后根据自己的情况试出来后总结出两点关键建议:
1.请留意STM32CubeMx生成的Startup文件夹内的启动文件,这个一定要保留。
2.其它有关Hal字样的文件所在的文件夹都可以删掉
比如我的情况,Core文件夹里有三个子文件夹 :
Inc和Src都有hal字样,这样我就只保留Core\Startup,里面有启动文件,其他两个都删掉。
(hal代表hal库开发相关的,因为现在是标准库开发,所以删掉,当然仅凭hal这样的字眼推测整个文件夹可以删掉是不严谨的,但是我试过删了不影响程序运行,暂时也没时间仔细研究各个文件具体是做什么的,所以就先放掉)
这个文件夹很显然是Hal库文件,整个删掉。
至于CMSIS文件夹,也是可以删掉的,取而代之的是野火工程里的Libraries文件夹:
左边是我整理好的一个工程StdDemo,里面粘贴了野火工程里的Libraries文件夹,右边是没整理好的StdDemo1,程序生成的Drivers文件夹。可以看一下两个文件夹里面的文件对比。有相似的文件,也有很不一样的地方。要细致地探讨那个文件应该保留哪个要删掉太浪费时间。
总之我们需要的是之前在Keil中使用野火工程里包含的库文件,把这些移植过来,因为这些库文件已经被验证是足够用来跑程序的,野火工程的目录结构如下:
这里需要把Libraries和User两个文件复制过去,只有这两个文件夹和C代码相关
这里提一下,有文章说需要把Project也移过去,其实不必要,移过去也要删掉
因为Project文件夹只是Keil的工程信息,没有库文件。
好,文件夹复制过去后,结构如下:
发现有两个Startup文件夹了(一个S大写,一个小写s),Core\Startup是STM32CubeMX创建的,另一个startup是野火工程复制过来的。把野火里的全都删掉,包括你的芯片对应的那一个启动文件(我这里是startup_stm32f10x_hd.s)。因为是用STM32CubeMX创建的文件目录,自然要尊重主人,用它的启动文件了。当然,startup_stm32f103zetx.s放在Core\Startup内,还是Libraries/CMSIS/startup/里,我是选择了后者,是可以的,前者未试。具体它是怎么找的,会自动找还是需要手动在哪里指定启动文件位置,暂时不清楚。日后可以再研究一下。
然后就是在有C和.h文件的目录中,用Src和Inc文件夹归类:
从CMSIS开始:
原来的CMSIS:
整理后的CMSIS:
FWlib因为已经是整理好的,不需要修改。
然后是User文件夹:
原来这样:
整理后:
是的led这样的文件夹我也删掉了,这样,就整理完了。
注:当这么整理的时候,Clion会自动修改文件的#include语句
整理后:
个人体会:文件目录怎么整理并不重要,没有规定,只要按inc和src把.h和.c文件分开,自己能看明白就行。
3.修改CMakeList
第52行:
所有有inc文件夹的目录都添加进来
第56行:
工程根目录下包含有C代码的所有子文件夹(我这里就是Libraries和User)
并在文件夹后加上通配符 /*.* 代表所有文件。
其实我对CMake不了解,刚接触,不太明白就先照着做了。
改完后点击reload
4.编译工程
在编译前,我们需要打开stm32f10x.h,在里面加入两句话
#define STM32F10X_HD
#define USE_STDPERIPH_DRIVER
这两个宏定义在Keil里是在此处定义的
所以移植到Clion我们要手动加上
重点
再打开core_cm3.c修改第736行和753行,如果不改编译直接报错Assembler messages:Error
把 “=r”
改成 “=&r”
这一点很重要,在知乎那篇文章中没提到,B站那篇提到了。知乎那篇说用的野火的STM32F4x芯片工程,B站那篇是原子的STM32F10x。我是结合了两篇文章才找到适合我的解决办法。总之改了之后就没有了Assembler messages:Error 这种错误。
引用下B站作者的总结(其实内联汇编我不懂,以后碰到了再研究)
这里总结下,修改了哪些地方:
1.stm32f10x.h中加入了两句宏定义
2.core_cm3.c中第736行和753行修改了两句内联汇编
B站那篇还在sys.c文件修改了内联汇编 ,我是野火的工程,没有这个文件,就没改。
5.下载烧录(OpenOCD)
下载烧录需要用到OpenOCD,OpenOCD是用于对STM32进行下载仿真的工具
,是一个开源软件包,Windows版本下从这里下载,下载好解压到一个目录就行。比如我下载解压后放在了
D:\Program Files\OpenOCD-20231002-0.12.0
(有人说目录不能有空格,但是我这里“Program Files”也没出问题)
往下找到bin\openocd.exe,在工程里Embedded Development →OpenOCD Location中浏览选中这个文件。
点击Edit Configurations
进入下面这个界面:
可以看到Board config file那里是空的,于是下面出现了警告,点击右边的Assist会弹出配置文件选择界面:
这些配置文件是各个厂商官方的开发板对应的配置文件,野火原子这种开发板没有对应的官方配置文件。所以需要手动创建。
调试单片机程序需要调试器,在 Keil 或者 IAR 等 IDE 中可以通过图形界面选择需要的调试器,但 CLion 本身并没有调试 STM32 的能力,而是要通过 OpenOCD。OpenOCD 则通过调试配置文件确定使用的调试器和目标芯片类型。打开 OpenOCD 的软件目录 openocd-0.10.0\share\openocd\scripts (不同版本可能有所差异),可以看到下面三个文件夹:board, interface, target
board 文件夹存储了各家厂商官方开发板的配置文件,如果你使用的是 ST 官方出品的开发板,就可以直接使用其中的调试文件,例如 NUCLEO-F103RB(如下图) ,那么 board 文件夹中的 st_nucleo_f103rb.cfg 就是你应该选择的,其他官方开发板同理。
interface 文件夹存储了各种调试器的配置文件,包括 cmsis-dap、stlink-v2 等。target 文件夹则存储了各种芯片的配置文件,例如 stm32f1x.cfg 就对应着 STM32F1 系列。正点原子、野火等国内企业出品的开发板不属于官方开发板,自然在 board 文件夹中不会有他们的配置文件,因此我们需要根据自己使用的调试器和芯片,写自己的配置文件。
上述内容来自文章:在CLion中开发STM32 - 知乎 (zhihu.com)
没有配置文件的情况下,如果我们点击绿色三角按钮运行的话,会出现下列错误提示:
好,先关闭上面那个选择配置文件的界面,我们在工程根目录下新建一个文件夹Config
,在里面新建一个配置文件daplink.cfg
(因为我这里使用的是野火fireDap作为仿真器)
文件的内容如下:
# choose st-link/j-link/dap-link etc.
# choose CMSIS-DAP Debugger
adapter driver cmsis-dap
# select SWD port
transport select swd
# 0x10000 = 64K Flash Size
# 1MB on FireDebugger
set FLASH_SIZE 0x100000
source [find target/stm32f4x.cfg]
# download speed = 5MHz
# 5MHz on FireDebugger
adapter speed 5000
# connect under reset
reset_config srst_only
具体每一句代表什么意思,可以去搜文章了解,这里不赘述。
回到配置文件选择界面,选择刚刚新建的文件。
然后再点击运行,就可以下载了,大功告成。
注:也可以把配置文件放在openOCD的board文件夹内
(D:\Program Files\OpenOCD-20231002-0.12.0\share\openocd\scripts\board):
这样点击assist的话,会跳出来可以选择。
点击Use可以使用,调试有效。点击Copy to Project & Use则会另复制一份到工程根目录下:
配置文件放在board文件夹好处是可以对日后的工程共享一份配置文件,比较方便,不用到处复制。
这里顺便再记录一下遇到过的错误,因为在先前创建工程过程中,选择配置文件的对话框有时候会自己弹出来。我有一次手太快不消息按了回车,所以选中了一份,比如说选中了下列这份文件。
这种情况下如果运行,会发生什么呢?
看红色提示中的Error部分:
Error: open failed
in procedure 'program'
** OpenOCD init failed **
shutdown command invoked
这些错误信息可以用来搜索解决方案,值得保留记录。