Ubuntu上使用CLion开发STM32,并使用JLink下载、调试

目录

  • 一、环境准备
  • 二、下载STM32CubeMX固件库
  • 三、使用STM32CubeMX创建工程
  • 四、CLion配置
  • 五、CMake简单操作和添加DSP库
    • CMake简单操作
    • 添加DSP库
  • 五、调试时查看外设寄存器。
  • 六、使用JLinkGDBServer进行调试
  • 七、总结

下文提到的资源链接

一、环境准备

需要准备的软件有arm-none-eabi-gcc编译器,CLion,STM32CubeMX,OpenOCD
还有可选的JLink驱动套件

  • arm-none-eabi-gcc编译器可以再其官网下载。
    下载之后解压,在/etc/profile中设置PATH环境变量即可
  • CLion也是官网下载,但是这里不讲破解。
  • JLink还是官网下载对应操作系统的安装包。
  • OpenOCD可以通过apt安装。sudo apt install openocd
  • STM32CubeMX依然是通过官网下载。要注意的是STM32CubeMX是基于Java的软件,所以需要先安装Java,使用apt安装默认版本即可sudo apt install default-jre,运行其中的SetupSTM32CubeMX-****.linux按照图形界面安装即可,操作与Windows大同小异,就是不会自动创建桌面图标

二、下载STM32CubeMX固件库

安装好STM32CubeMX之后第一次启动需要设置固件库的路径并下载固件库。
Ubuntu上使用CLion开发STM32,并使用JLink下载、调试_第1张图片
点击右侧第二个按键INSTALL/REMOVE打开固件库列表
Ubuntu上使用CLion开发STM32,并使用JLink下载、调试_第2张图片
勾选需要的固件库下载安装。我已经装过了。(这个仅需设置一次)

三、使用STM32CubeMX创建工程

安装完成后回到主界面,点击中间深蓝色框内的第一个按键ACCESS TO MCU SELECTOR打开MCU列表,如果出现一个进度条没完没了可以直接关闭,不影响。
Ubuntu上使用CLion开发STM32,并使用JLink下载、调试_第3张图片
选择MCU,通过左侧上方的搜索框可以快速找到需要的MCU,我使用STM32F103C8T6为例。
双击列表的那一栏选择。
Ubuntu上使用CLion开发STM32,并使用JLink下载、调试_第4张图片
设置PC13引脚为输出,来一个点灯,RCC中的外部高速时钟为图片中的,SYS的debug为Serial Wire。
其他的都可以不设置,SYS的debug是一定一定要设置的,否则下一次下载程序的时候会因为调试接口关闭无法下载,如果还是忘记了可以在下载开始的一瞬间按下复位键手动复位,时机自己摸索去吧,多试几次就能成功,问题不大。
Ubuntu上使用CLion开发STM32,并使用JLink下载、调试_第5张图片
转到第二个选项卡,时钟设置直接把HCLK输入最高的72M然后回车让它自动设置。
Ubuntu上使用CLion开发STM32,并使用JLink下载、调试_第6张图片
给自己的工程起个名字,选择一个路径,Toolchain/IDE选择SW4STM32,这是CLion能够解析的。
Ubuntu上使用CLion开发STM32,并使用JLink下载、调试_第7张图片
转到左侧第二个选项卡,的第二个框的第一个选项,这个选项能把每一个外设的初始化代码分别写在独立的.c/.h文件里,更加整洁。
Cube的配置到此结束,点击右上角的GENTER CODE来生成你的工程。完事后直接关掉弹窗

四、CLion配置

打开CLion。
Ubuntu上使用CLion开发STM32,并使用JLink下载、调试_第8张图片
CLion打开,找到工程文件夹里的ioc文件然后作为一个工程打开。
Ubuntu上使用CLion开发STM32,并使用JLink下载、调试_第9张图片
打开CLion的设置,找到Build,Execute,Deployment->Embedded Development选项,填入OpenOCD的路径和Cube的路径并测试,如果是apt安装的openocd路径应该是一样的,Cube自己找,完成后保存。(这个仅需设置一次)
Ubuntu上使用CLion开发STM32,并使用JLink下载、调试_第10张图片
还是Build,Execute,Deployment,找到第一个Toolchain选项,点击加号选择System新建一个工具链,按照arm-none-eabi-gcc编译器的路径分别找到bin/arm-none-eabi-gccbin/arm-none-eabi-g++bin/arm-none-eabi-gdb作为C编译器,C++编译器,调试器。CMake和make自动就好。(这个仅需设置一次)
Ubuntu上使用CLion开发STM32,并使用JLink下载、调试_第11张图片
转到Toolchain下方的CMake选项卡,把右侧焦点的工具链选项设置为刚刚新建的工具链到此,工程的编译工具就设置完了。
回到CLion主界面,CMake已经自动运行一次了配置成功了。
Ubuntu上使用CLion开发STM32,并使用JLink下载、调试_第12张图片
右上角的生成目标选择***.elf然后点击旁边的锤子进行编译,可以看见已经编译成功了。
自己在Src/main.c的主循环里写两行点灯代码再编译一遍。

  /* USER CODE BEGIN WHILE */
  while (1)
  {
      HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_13);
      HAL_Delay(300);
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
  }

一定要写在 USER CODE BEGIN 注释和USER CODE END注释之间,否则Cube重新生成的时候会抹掉。
Ubuntu上使用CLion开发STM32,并使用JLink下载、调试_第13张图片
右上角的生成目标打开第一个配置选项,第一行的Target点击,选中****.elf然后第二行的也自动配置了。
找到配置的第三行Board config file,点最后面的Assist。在弹窗中随便找一个,然后点击下方中间的Copy to Project & Use复制到自己的工程里,然后把原文删掉,替换成如下的。

interface jlink		                                   #使用JLink
transport select swd                             #SWD接口
source [find target/stm32f1x.cfg]    #stm32f1x的配置文件

如果嫌麻烦的可以找到模板的目录,把自己改好重命名的放进去,这样就可以直接选择不用改动了。
三行改完之后看见最下面的error消失了,OK关闭。
现在就可以点击运行箭头进行程序下载或者debug了。

五、CMake简单操作和添加DSP库

CMake简单操作

在CMakeLists_template.txt的40、42、44行分别是添加全局宏定义,添加源文件,添加include路径的位置,不要更改原来的的,往里填自己的文件就行了,在源文件使用的file函数中也可以使用*.c这样的通配符,宏定义要在前面加-D,就像-DUSE_HAL_DRIVER,中间没有空格,添加完后在Project栏中对ioc文件右键,选择Update CMake Project with STM32CubeMX来更新CMake。CMake就配置成功了。这样就能实现基本的添加文件和宏的操作了。

添加DSP库

Cube不自动生成DSP库的文件,需要自己添加,可以在Keil的CMSIS库中找到也可以直接在我这里下载。
复制DSP文件夹到工程根目录里,然后在CMakeLists_template.txt第44行的include_directories和add_executable之间插入下面四行,重新生成CMakeLists.txt编译就可以了。

#DSP
add_definitions(-DARM_MATH_CM3 -DARM_MATH_MATRIX_CHECK -DARM_MATH_ROUNDING)
include_directories("DSP/Include")
link_directories(DSP/Lib/GCC)
link_libraries(libarm_cortexM3l_math.a)

这个是F1的,没有FPU,如果是F4的有FPU的话在22,23行有注释Uncomment for hardware floating point
取消注释就能启用FPU,库libarm_cortexM3l_math.a也要换成对应的,然后自己添加的add_definitions就和他的重复了可以注释掉了,关于F7,H7那种有双精度FPU的没有试过,应该还要改FPU_FLAGS的内容。

五、调试时查看外设寄存器。

Ubuntu上使用CLion开发STM32,并使用JLink下载、调试_第14张图片
在OCD调试控制台的第三个选项卡有一个Peripherals选项,显示它需要对应芯片的svd文件,在我的wj中有SVD文件夹,里面有F1和F4的芯片的svd文件选择对应的复制到工程里然后Load,弹出的外设选择需要的,不嫌乱就全选,反正还可以点击旁边的小漏斗再筛选。
Ubuntu上使用CLion开发STM32,并使用JLink下载、调试_第15张图片
最终的效果就是这样的,CLion不像Keil,它不能事实更新观察变量或者寄存器的值,只有出现暂停的时候才能刷新,除了配置麻烦点这是唯一的不足,但是看在CLion其他优秀的功能上可以忍(手动滑稽)。
Ubuntu上使用CLion开发STM32,并使用JLink下载、调试_第16张图片

六、使用JLinkGDBServer进行调试

Ubuntu上使用CLion开发STM32,并使用JLink下载、调试_第17张图片
还是选择目标的下拉框,配置,添加一个Embedded GDB Server,如图配置一下就可以用了,实际上使用效果不如OpenOCD。
JLinkGDBServer的GDB端口默认是2331,-device后面的是芯片名字,剩下的照抄就行。

localhost:2331
/usr/bin/JLinkGDBServer
-select USB -device STM32F103C8 -if SWD -speed 4000 -noir

七、总结

Linux上使用CLion开发STM32应该是最好的选择了,win上面OpenOCD的驱动问题实在恶心,JLinkGDBserver只能调试又不能下载程序。所以CLion还是再Linux上好使。JLinkGDBServer因为我是JLinkOB,JLink驱动版本过高没有办法用,如果是V9或者更高的是完全没有问题的,JLink驱动套件中还是有很多强大的工具的,所以带上它了。CLion一些“过分细心”的错误提示高亮在设置里面关一关就行,总体是使用体验还是不错的,这样在Linux下开发单片机和其他Linux程序就不用频繁切换系统了,还不错的选择。

你可能感兴趣的:(STM32)