STM32 & Clion

2023-05-16

注:这个方法已经不适用于最新版本的的Clion了。
(最近通过Android认识了Jetbrain公司,从此彻底迷上了这个公司的产品,Unity上用Rider,Java上用IDEA,于是我就有想法了,我可以先在Clion里编辑代码,然后再用IAR编译。试过一段时间后,觉得这样反倒是很麻烦,切换来切换去,还要两边添加头文件。于是去Google了一起下。看看有没有在Clion里直接编译调试STM32的,这样一搜还真有。地址如下:
https://blog.jetbrains.com/clion/2016/06/clion-for-embedded-development/
但是它使用的是J-link,我用的是开发板上的ST-link-v2.1,没办法全套照搬。相对于此,我参考了很多人的博客。终于在半个月后搞定了。下面把配置过程贴上来)
环境:Win7x64
工具:

1. Clion
2. SW4STM32
3. GNU Tools ARM Embedded
4. Python 3.5+
5. MXCUBE

首先,为什么会有工具2呢,我来解释一下,调试需要用到OpenOCD我一直搞不定,所以需要借用它的OpenOCD。工具4是因为需要用到一个Python的程序。

###1. 安装软件和配置环境变量。

安装就不用多说了。重要的是环境变量的配置,需要在CMD下能够直接使用 arm-none-eabi-c++pythonopenocd.exe 。OpenOCD在我电脑里的目录是:

C:\Ac6\SystemWorkbench\plugins\fr.ac6.mcu.externaltools.openocd.win32_1.16.1.201710251246\tools\openocd\bin\openocd.exe

###2. 安装cubemx2cmake
这里要用到某位老兄的软件:cubemx2cmake ,地址如下:
https://github.com/eugene-babichenko/cubemx2cmake
按照Installation安装就没问题了。其次,确认CMD中可以使用 cubemx2cmake 命令。进入下一步之前重启一次电脑。
###3. 使用CUBEMX创建工程

这里写图片描述

选择SW4STM32,勾选右边的选项(重点)。生成代码。
###4. 导入Clion&设置Cmake
这里写图片描述

这里写图片描述

这里写图片描述

这个页面啥也别点,直接OK。
进入界面,打开下面的Terminal,使用命令 cubemx2cmake。然后会产生很多文件。

这里写图片描述

其中,首先修改CMakeLists.txt.template。重命名为CMakeLists.txt 覆写。
接着重命名STM32Toolchain.cmake.templateSTM32Toolchain.cmake
接下来就可以试编译一下了。出现了报错:

C:/Users/Godenfreemans/STM32/B-L475E-IOT01A/test/Drivers/CMSIS/Device/ST/STM32L4xx/Include/stm32l4xx.h:179:3: error: #error “Please select first the target STM32L4xx device used in your application (in stm32l4xx.h file)”
#error “Please select first the target STM32L4xx device used in your application (in stm32l4xx.h file)”

这个就是没有定义芯片类型。我使用的开发板用的是STM32L475,所以
就选STM32L475xx这个定义。将它添加在Cmake里。

CmakeList.txt文件中
删除下面两条语句

add_definitions(-DSTM32L475xE)
add_definitions(-DUSE_HAL_LIBRARY)

将这预定义添加在STM32Toolchain.cmake文件中的

set(COMMON_FLAGS “-mcpu=cortex-m4 -mfloat-abi=hard -mfpu=fpv4-sp-d16 -lc -specs=nosys.specs -mthumb -mthumb-interwork -ffunction-sections -fdata-sections -g -fno-common -fmessage-length=0”)

中:

set(COMMON_FLAGS “-DSTM32L475xx -DUSE_HAL_LIBRARY -mcpu=cortex-m4 -mfloat-abi=hard -mfpu=fpv4-sp-d16 -lc -specs=nosys.specs -mthumb -mthumb-interwork -ffunction-sections -fdata-sections -g -fno-common -fmessage-length=0”)

(这里埋个坑,看看读者能不能发现,笑)
接下来再编译,会发现错误:

C:\Users\GODENF~1\AppData\Local\Temp\ccozlDLD.s: Assembler messages:
C:\Users\GODENF~1\AppData\Local\Temp\ccozlDLD.s:517: Error: number of operands mismatch for ds' C:\Users\GODENF~1\AppData\Local\Temp\ccozlDLD.s:536: Error: number of operands mismatch fords’
mingw32-make.exe[2]: *** [CMakeFiles/test.elf.dir/Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_cortex.c.obj] Error 1
mingw32-make.exe[2]: *** Waiting for unfinished jobs…

这里默认的编译工具是mingw,要把它定向到arm的编译器。
首先在这里添加arm编译器的路径:
这里写图片描述
图片看不清的话,右键在新选项卡中打开

-DCMAKE_TOOLCHAIN_FILE=STM32Toolchain.cmake
-DBuild_Tools=“C:\Program Files (x86)\GNU Tools ARM Embedded\6 2017-q2-update”

上面的是设置编译工具链文件。就是之前改好名字的STM32Toolchain.cmake,其次就是定义一个变量叫Build_Tools
,接下来会用到它。
接下来设定Cmake寻找编译工具的目录。在STM32Toolchain.cmake文件中添加

SET(CMAKE_FIND_ROOT_PATH ${Build_Tools}/bin)

然后将这两条语句:

CMAKE_FORCE_C_COMPILER(arm-none-eabi-gcc GCC)
CMAKE_FORCE_CXX_COMPILER(arm-none-eabi-g++ GCC)

换成

set(CMAKE_C_COMPILER arm-none-eabi-gcc)
set(CMAKE_CXX_COMPILER arm-none-eabi-g++)
set(CMAKE_ASM_COMPILER arm-none-eabi-as)

接下来就在下面的CMAKE视图中使用一次Rset Cache and Reload Project按钮(在齿轮里),使用多次Reload CMAKE Project按钮直到CMAKE窗口中没有任何错误出现。再次编译,会有错误出现:

c:/progra2/gnutoo1/62017-~1/bin/…/lib/gcc/arm-none-eabi/6.3.1/…/…/…/…/arm-none-eabi/bin/ld.exe: warning: cannot find entry symbol Reset_Handler; defaulting to 08000000

没有设置代码开头地址。

这是由于没有添加启动头文件startup_STM32L475xE导致的。虽然Cmake文件中有添加这个文件,但是实际上那个目录里没有文件。

修改其指向正确的汇编文件。
CmakeList.txt文件中,将

file(GLOB_RECURSE CMSIS_STARTUP Drivers/CMSIS/Device/ST/STM32L4xx/Source/Templates/gcc/startup_STM32L475xE.s)

改成

file(GLOB_RECURSE CMSIS_STARTUP startup/startup_stm32l475xx.s)

再编译一次,就没有问题了。

这里写图片描述

###5. 调试。
开发怎么能不需要调试呢,这里要感谢Maxim Karpov制作的插件:μCL
在Clion的插件中心安装它。
然后在Clion的设置中会出现一个选项:

这里写图片描述

在右边设置openocd的目录位置。
我的是在:C:\Ac6\SystemWorkbench\plugins\fr.ac6.mcu.externaltools.openocd.win32_1.16.1.201710251246\tools\openocd\bin\openocd.exe
然后设置GDB为arm的GDB。

这里写图片描述

OK,这部分设置完成了。接下来还没完。打开这个设置页面。

这里写图片描述

删除flash和test.elf。添加OpenOCD根。将unnamed命名为flashTarget选择为elf文件下面的Executable同样为elf文件,接着OpenOCD paraments选项设置为

-s “C:\Ac6\SystemWorkbench\plugins\fr.ac6.mcu.debug_2.1.3.201710240950\resources\openocd\st_scripts”

复制粘贴的时候注意引号会莫名其妙的变成中文符。
用来指定OpenOCD的脚本目录。
OpenOCD script选项填充如下内容:

source [find interface/stlink-v2-1.cfg]
source [find target/STM32L4x.cfg]
init
reset init
halt
flash write_image erase build/ComunityWithUnity.bin 0x08000000
verify_image build/ComunityWithUnity.bin 0x08000000
shutdown

反勾选Upload firmware to the target
到这里刷写flash就写完了。
这里写图片描述

复制flash,命名为Debug。设置Working directory为arm的目录:

C:\Program Files (x86)\GNU Tools ARM Embedded\6 2017-q2-update\arm-none-eabi\bin

接下来将OpenOCD script修改为:

# This is an ComunityWithUnity board with a single STM32L475VGTx chip
#
# Generated by System Workbench for STM32
# Take care that such file, as generated, may be overridden without any early notice. Please have a look to debug launch configuration setup(s)

source [find interface/stlink-tcp.cfg]

set WORKAREASIZE 0x8000

transport select "hla_swd"

set CHIPNAME STM32L475VGTx

# Enable debug when in low power modes
set ENABLE_LOW_POWER 1

# Stop Watchdog counters when halt
set STOP_WATCHDOG 1

# STlink Debug clock frequency
set CLOCK_FREQ 4000

# use hardware reset, connect under reset
# connect_assert_srst needed if low power mode application running (WFI...)
reset_config srst_only srst_nogate connect_assert_srst
set CONNECT_UNDER_RESET 1

source [find target/stm32l4x.cfg]

OK,到这里就完成了。

这里写图片描述
想要Debug的时候就把选项设置到Debug再点右边的小青虫。就可以Debug了。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

STM32 & Clion 的相关文章

  • CLion 和 Crypto++ 库

    不久前 我开始在 Visual Studio 2015 中编写应用程序 在设置所有库依赖项时没有出现任何问题 现在 我决定搬到 CLion 但是我的应用程序依赖于cryptopp库 我需要将其链接到我的 CLion 项目中 目前 我面临着大
  • 如何配置 CLion 标准控制台输出?

    Problem CLion 不会出于调试目的输出任何控制台输出 我将 CLion 与 MingW 编译器和 cmake 一起使用 无论我是否使用 std cout lt lt Testing lt lt std endl Or printf
  • CLion 在运行可执行文件时找不到共享库

    我正在做一个项目 到目前为止 我一直在使用一个简单的编辑器和我自己的 Makefile 来构建它 不过 我想切换到 CLion 根据这个问题 https stackoverflow com questions 26918459 using
  • STM32 暂停调试器时冻结外设

    当到达断点或用户暂停代码执行时 调试器可以停止 Cortex 中代码的执行 但是 当皮质停止在暂停状态下执行代码时 调试器是否会冻结其他外设 例如 DMA UART 和定时器 您只能保留时间 r 取决于外围设备 我在进入主函数时调用以下代码
  • Arm:objcopy 如何知道 elf 中的哪些部分要包含在二进制或 ihex 中?

    我正在开发一个项目 其中涉及解析arm elf 文件并从中提取部分 显然 elf 文件中有很多部分没有加载到闪存中 但我想知道 objcopy 到底如何知道要在二进制文件中包含哪些部分以直接闪存到闪存中 以arm elf文件的以下reade
  • for循环延时时间计算

    提示 文章写完后 目录可以自动生成 如何生成可参考右边的帮助文档 文章目录 前言 一 pandas是什么 二 使用步骤 1 引入库 2 读入数据 总结 前言 之前做led点亮的实验 好像是被delay函数影响了 因为delay参数设置的不对
  • 如何在 CLion 中创建、编译和运行单个文件

    我正在研究一些c 我讨厌必须创建一个全新的项目才能在文件上运行一些东西 我也不喜欢在创建项目时如何调用文件main cpp 我只想制作一个包含一些函数或类的单个文件 创建整个项目还不够重要 我想创建一个文件并按我想要的名称命名 只需创建一个
  • 核心耦合内存在 STM32F4xx 上可执行吗?

    尝试从 STM32F429s CCM 运行代码 但每当我命中 CCM 中的第一条指令时 我总是会遇到硬故障 并且 IBUSERR 标志被设置 该指令有效且一致 STM32F4xx 是否可能不允许从 CCM 执行 数据访问效果良好 alios
  • 没有规则可以创建“opencv.exe”所需的目标“C:/opencv/build/lib/libopencv_world300d.dll.a”。停止

    所以我试图构建一个简单的 opencv 代码 但我不断收到此错误 而且我似乎在互联网上找不到任何解决方案 操作系统 Windows 8 1 编译器 GNU GCC 601 IDE CLion CMake 3 0 和 mingw64 这是我从
  • 如何设置 CLion 以使用 waf 作为构建系统

    我正在尝试配置我的 Intellij Clion IDE 以使用 ns 3 由于 ns 3 使用的是 waf 它比我想象的更棘手 并且很高兴听到任何建议 CLion 支持编译数据库 https www jetbrains com help
  • 通过JTAG恢复STM32 MCU磨掉的标记

    我有一块可能带有 STM32 MCU 的板 我想为该板制作定制固件 因为库存板有很多问题 不幸的是 电路板制造商很友善地磨掉了所有标记 有没有办法通过 jtag 获取设备 系列 ID 并将其交叉引用到型号 我能找到的一切都是关于获取芯片的唯
  • osx 和 clion,找不到 omp.h

    如何说服 cmake 在 CLion 内 我有可用的 OpenMP 标头 我正在尝试编译这个项目SCD https github com DAMA UPC SCD我收到以下错误 15 Building CXX object tools se
  • CLion 无法从剪贴板粘贴正确的代码片段

    虽然在我的编程 职业生涯 中大部分时间都使用 Java 和 PHP 但我现在正在尝试更深入地学习 C 为此 我使用 CLion 作为我的 IDE 主要是因为我非常熟悉 phpStorm 和 IntelliJ IDEA 除了学习一门新语言之外
  • STM32 上的 ADC 单次转换

    我正在研究 STM32 F103x 上的 ADC 编程 并从最简单的情况 单次转换开始 测量内部温度传感器 连接到 ADC1 的值 并使用 USART 将其发送到 COM 端口 目标似乎很明确 但是当我尝试将源代码下载到闪存时 它不会向 C
  • CLion:调试由 python 生成的 C++ 子进程

    CLion 有没有办法调试从 Python 脚本运行的 C 程序subprocess Popen 我可以设置断点并调试Python程序 如果直接运行C 程序 我可以设置断点并调试它 但是当程序从Popen启动时 我无法触发C 断点 我尝试在
  • 当端点和 PMA 地址均更改时,CubeMX 生成的 USB HID 设备发送错误数据

    我正在调试我正在创建的复合设备的问题 并在新生成的仅 CubeMX 代码中重新创建了该问题 以使其更容易解决 我添加了少量代码main 让我发送 USB HID 鼠标点击 并在按下蓝色按钮时使 LED 闪烁 uint8 t click re
  • CLion编辑标准项目模板

    我在 C Lion IDE 中编程 我找不到使用标准模板创建 c 文件的解决方案 我需要它 因为我必须在文件的开头生成一个注释块 我需要这个创建一个新项目 所以我必须更改标准项目模板的主文件 但我找不到任何解决方案 只是如何为新文件创建模板
  • Clion如何将文件添加到项目中

    这看起来真的很基本 如何将文件添加到项目中而无需手动编辑CMakeLists txt 例如另一个目录中的源文件 CLion 解析CMakeLists txt并使用它生成项目视图 但我相信将文件添加到项目的唯一方法是编辑CMakeLists
  • 是否可以配置CLion来独立编译项目中的源文件?

    我目前正在使用 JetBrains CLion IDE 用 C 语言进行一些 Project Euler 挑战 当我用 Python 和 Java 分别用 PyCharm 和 IntelliJ 完成这些任务时 我总是能够创建一个名为 Pro
  • 读取STM32 MCU SPI数据寄存器的值

    有很多类似的问题 但似乎没有一个问题完全相同 我正在将 STML4 MCU 连接到 6 轴传感器 LSM6DS3 我已经成功地在 I2C 中实现了所有内容 但想要 SPI 的额外速度 和 DMA 如果我能让这些第一步工作起来的话 因此 第一

随机推荐

  • 华为MA5626-8密码恢复

    设备型号 xff1a 华为MA5626 8 display version VERSION MA5626V800R308C00 PATCH SPC500 SPH505 HP5105 PRODUCT MA5626 准备工作 xff1a 超级终
  • SNMP 获取交换机端口相关信息

    我们想用snmpwalk查看网络设备的端口 xff0c MIB库中相关定义的信息如下 xff1a root 64 redcock lifeng snmpwalk v 2c c lifeng 192 168 100 100 注意后面的点 xf
  • phpMyAdmim和Yii 连接Mysql报错。

    故障 xff1a 之前phpMyAdmim和Yii连接Mysql都好着的 xff0c 某天 xff0c 同时出现如下报错 xff1a 1 linux下phpMyAdmin 出现 缺少 mysqli 扩展 xff0c 请检查 PHP 配置 2
  • linux shell 执行多个命令的方法

    xff08 1 xff09 在每个命令之间用 xff1b xff08 分号 xff09 隔开 xff08 2 xff09 在每个命令之间用 amp amp 隔开 amp amp 表示 xff1a 若前一个命令执行成功 xff0c 才会执行下
  • ARP 属于哪层协议

    教材上把ARP 协议划到网络层 xff0c 是因为 ARP 协议属于 TCP IP 协议簇 在TCP IP 模型中 xff0c 它所有定义的协议是在网际层上的 再看按照OSI 的标准 xff0c 数据在传递时每层会加上自己的信息 当网络层的
  • 什么叫一层交换机,二层交换机,三层交换机?

    转自 xff1a http blog csdn net happypolo article details 5934429 简单地说 xff1a 一层交换机 只支持物理层协议 电话程控交换机可以算一个 二层交换机 支持物理层和数据链路层协议
  • Linux Shell 脚本中字符串的连接方法

    Linux Shell 脚本中字符串的连接方法 如果想要在变量后面添加一个字符 xff0c 可以用一下方法 xff1a value1 61 home value2 61 value1 34 61 34 echo value2 把要添加的字符
  • linux 如何将路径加入环境变量

    PATH 61 PATH 后面加路径 PATH是环境变量 要大写那几个目录是你放置linux命令的目录 输入命令后系统会去PATH中寻找是否存在该命令 查看当前环境变量 echo PATH也可以用set命令看一下设置 export PATH
  • expect spawn、linux expect 用法

    使用expect实现自动登录的脚本 xff0c 网上有很多 xff0c 可是都没有一个明白的说明 xff0c 初学者一般都是照抄 收藏 可是为什么要这么写却不知其然 本文用一个最短的例子说明脚本的原理 脚本代码如下 xff1a usr bi
  • python 调用 shell python shell 间变量传递

    python gt shell xff1a 1 环境变量 python view plain copy print import os var 61 123 或var 61 123 os environ var 61 str var env
  • vSphere,ESXi和vCenter 的区别

    最近在看 VMware 一直没有搞清楚这几个产品之间的区别和联系 正好在网上搜索到一个好文 xff0c 翻译下来 本文翻译自 xff1a http www mustbegeek com difference between vsphere
  • equals和hashCode详解

    在学习的过程中 xff0c 特别是学习集合的时候 xff0c equals和hashCode一直是经常出现的方法 xff0c 而且在面试题中 xff0c 也经常出现equals和 61 61 的区别等问题 xff0c 现在我们就从底层详细的
  • NuttX的应用记录 4 (小记录)

    好久没看过NuttX了 xff0c 做个移植试一试 板子是STM32F407ZE xff0c 有两块屏幕 xff0c 蜂鸣器 xff0c FLASH xff0c E2PROM xff0c LED 先找个类似的 xff0c 复制一个副本 st
  • PetaLinux学习笔记 3

    过年回家没带开发板 终于可以搞一搞了 更新petaLinux到2019 2 重建项目 xff0c flash调整一下 启动过程中提示 xff1a m25p80 spi0 0 found w25q256 expected n25q512a m
  • 高云GW1N-9的SerDes笔记

    GW1NR 9的片子 xff1a 看起来还是很强的 xff0c 但是在工程中使用后会这样提示 xff1a 看起来有点虚标啊 那就按1G来先 xff0c 做个后仿 直接用OSER来输出数据 看起来还可以 输出可以 在做一个输入 xff0c 根
  • NuttX的学习笔记 1

    学习这个系统 xff0c 开始是在PIX的飞控上了解到的 xff0c 感觉这个系统很有兴趣 xff0c 当然 xff0c 这是我第一次接触RTOS xff0c 有不正确的地方 xff0c 请予以指正 注意 过程是我边操作边写的 xff0c
  • NuttX的学习笔记 2

    README文档目录的第二部分 Configuring NuttX Instantiating Canned ConfigurationsRefreshing ConfigurationsNuttX Configuration ToolFi
  • LSM303DLHC

    xff08 PS xff1a 最近在帮人做一个电子罗盘 xff0c 刚好STM32F429i DISCO上有个MEMS xff0c 但是我自己没有看到底是个什么传感器 xff0c 搞搞搞了半天 xff0c 读出来三个数据 xff0c 但我移
  • Embedded Wizard 研究笔记 1

    今天突发奇想看看这个Embedded Wizard xff0c 看介绍视频还是很不错的 而且前几天做的罗盘很丑 xff0c 让我深刻意识到了UI的必要性 xff0c 那么这个Embedded Wizard就是为此而生 刚好我手上还有一块ST
  • STM32 & Clion

    注 xff1a 这个方法已经不适用于最新版本的的Clion了 xff08 最近通过Android认识了Jetbrain公司 xff0c 从此彻底迷上了这个公司的产品 xff0c Unity上用Rider xff0c Java上用IDEA x