CLion 编译下载 STM32程序

接上篇文章,弃用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

这些错误信息可以用来搜索解决方案,值得保留记录。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
OpenOCD是一个开源的调试和编程工具,用于与嵌入式系统进行通信和调试。当我们在gdb中输入设置断点指令时,OpenOCD会起到关键的作用。它通过与目标设备进行通信,提供了与目标设备的连接和控制功能,使得我们可以在目标设备上进行调试操作。 调试步骤通常包括以下几个步骤: 1. 打开两个终端,一个用于运行OpenOCD,另一个用于执行调试操作。在Windows系统中,可以使用PowerShell或者cmd终端。在Linux和Mac系统中,也可以使用相应的终端。 2. 在第一个终端中,运行OpenOCD命令,指定配置文件的路径。例如,可以使用以下命令来启动OpenOCD: ``` openocd -f D:\OpenOCD\share\openocd\scripts\interface\stlink-v2.cfg -f D:\OpenOCD\share\openocd\scripts\board\stm32f4discovery.cfg ``` 这个命令会根据指定的配置文件来初始化OpenOCD,并与目标设备建立连接。 3. 在第二个终端中,可以使用gdb等调试工具来进行调试操作。通过与OpenOCD建立的连接,可以在目标设备上设置断点、查看寄存器状态、单步执行等操作,以便进行调试。 需要注意的是,安装OpenOCD时需要将其安装路径添加到环境变量中,以便在任何位置都可以直接使用OpenOCD命令。可以从https://gnutoolchains.com/arm-eabi/openocd/下载OpenOCD,并将其解压到固定位置。 总之,OpenOCD在调试过程中起到了关键的作用,通过与目标设备进行通信和控制,实现了对目标设备的调试操作。 #### 引用[.reference_title] - *1* [openocd的源码学习0-----利用gdb和openocd对riscv芯片进行debug的总体框图](https://blog.csdn.net/qq_41735476/article/details/120417082)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* *3* [利用openocd 在windows环境下GDB调试(调试器 stlinkv2)STM32](https://blog.csdn.net/chunyexixiaoyu/article/details/120448515)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值