使用CLion和STM32CubeMX进行STM32开发(包含断点调试、寄存器查看和printf重定向)

文章目录

  • 摘要
  • 下载安装clion
  • 下载arm-gcc
  • 下载配置openocd
  • 下载安装STM23Cubemx
  • 新建demo工程
  • 使用CubeMX生成初始化代码
  • 使用Clion写代码和烧录固件
  • 有插件且已经配置过一次情况
  • 没有插件情况
  • 调试
  • printf重定向
  • 断点调试调试
  • 查看外设寄存器值
  • 写在后面
  • 摘要

    在嵌入式领域中开发以ARM公司的Cortex M内核为代表的单片机时程序员使用最多的IDE一定是Keil公司的MDK4 MDK5,而Keil已经脱离现代智能IDE,近年来IAR逐步向现代智能IDE靠近但还不足,一些芯片原厂提供了基于eclipse改装版IDE,这些工具在调试方面有优势,比如查看外设寄存器,内核寄存器,反汇编,支持多种调试器烧录固件,但在代码提示,代码跳转、代码重构、查找调用代码等等这些功能很匮乏,而Jetbrains公司的Clion是一款现代化跨平台IDE,不仅能编写传统c/c++程序,还能配合插件开发单片机程序,解决了传统嵌入式IDE的痛点。专业的嵌入式IDE是内置烧录调试工具,使用第三方IDE需要借助开源工具openocd,openocd有很多版本适配不同芯片能够满足使用。当前最热门的单片机就是stm32,得益于资料公开,有第三方板卡商家,SDK代码规范易读,甚至还有初始化代码生成工具CubeMX极大程度降低了嵌入式开发的门槛(有些国内半导体厂家的资料是传家宝见不得人),让嵌入式程序员更加注重应用。本文主要内容是使用Clion+CubeMX+arm-gcc+openocd开发stm32环境,当然不仅仅是开发stm32,只要是能使用gcc系列编译器编译代码,并配合编写编写的cmake脚本的都可以爆改适配,博主已经适配过乐鑫的ESP32、沁恒微电子的CH32。

    关键字: Clion、STM32、CubeMX


    环境说明

  • 操作系统:win11
  • 单片机:stm32f103rct6
  • IDE:Clion2023
  • 代码生成器:STM32CubeMX 6.8.1
  • 工具链:amr-gcc
  • 固件烧录软件:openocd -20231002
  • 调试器:ST-Linkv2

  • 下载安装clion

  • 进入官网下载windos版,下载完成双击安装
  • 点击下一步
  • 选择安装路径,安装路径不要有空格和中文
  • 安装选项,勾选如图就行了,再点击下一步
  • 默认创建菜单文件夹,点击安装就开始安装了
  • 安装完成选择稍后重启

  • 下载arm-gcc

  • 进入官网下载windos版arm交叉编译器,选择zip压缩包链接,解压后可以不用安装直接使用。
  • 进入解压的bin文件夹,把这个路径添加到系统环境变量PATH中。以win11为例 设置 –>系统–>高级系统设置–>环境变量–>系统变量–>在PATH中添加解压后的bin文件夹路径
  • 在命令行中验证添加成功没有,wim+r,输入cmd打开命令行,输入 arm-none-eabi-gcc.exe -v(注意隔了一个空格),出现了版本号说明添加成功,没有成功重启电脑系统重新加载环境变量再验证,还是没有验证成功查询下如何添加系统环境变量。

  • 下载配置openocd

  • 进入第三方网站(博主在官网没有找到已经编译好的程序只有源码)下载解压就行了,这个网站也提供arm-gcc下载。
  • 安装驱动,本文使用的ST-Link,安装ST-Link驱动,双击bat脚本自动安装驱动
  • 使用J-link时,先安装J-link驱动,再用UsbDriverTool软件转换USB驱动为libusb。
  • openocd烧录调试程序时需要配置文件,下文提供了配置文件示例。调试烧录器配置项是通用的(为了演示提供的文件中设置了三种,选择一个就行了)适用于很多芯片,选择接口同理,文件命令后缀与上图相同,名字随意。
  • #设置使用的调试烧录器为ST-Linkv
    source [find interface/stlink.cfg]
    
    #设置使用的调试烧录器为J-link
    source [find interface/jlink.cfg]
    
    #设置使用的调试烧录器为DAP-Link
    source [find interface/cmsis-dap.cfg]
    
    # 调试接口选择swd,此类型是ST-Link专用的
    transport select hla_swd
    
    # 调试接口选择swd,此类型是J-link,DAP-Link通用
    transport select swd
    
    #设置目标芯片,选择stm32f1x,如果是f4系列的换成f4就行了其他系列以此类推
    source [find target/stm32f1x.cfg]
    

    编辑完成文件保存到openocd的文件夹,方便在clion中选择配置文件


    下载安装STM23Cubemx

  • 进入官网,向下滑动页面,找到如图windos版栏,选择6.8.1版本,下载安装包需要登录st账号没有账号可以使用邮箱注册一个,注册以后ST时不时会往邮箱发一些新闻类邮件(可能是为了推广产品),所以选择一个不常用的但能收到邮件的邮箱就行了,博主测试高版本安装后发现有bug且需要登录账号才能下载开发包,下载后是一个压缩包,解压后直接双击安装。
  • 点击下一步
  • 同意下一步
  • 同意下一步
  • 选择安装路径,并下一步,安装路径不要有空格和中文
  • 没有文件夹需要创建,点击确认
  • 选择开始菜单文件,按需修改,点击下一步开始安装
  • 安装完成,下一步
  • 完成安装
  • 启动CubeMX安装开发包(也可以不安装后续新建工程选择芯片自动下载)
  • 选择对应芯片型号点击install安装,安装完成地点击clsoe退出

  • 新建demo工程

    使用CubeMX生成初始化代码

  • 输入芯片名称选好型号,开始新建工程
  • 配置外部时钟
  • 配置调试器接口
  • 配置GPIO点灯,引脚编号根据实际的板卡来,直接在右下侧配置IO为输出
  • 配置外部时钟,注意使用的外部时钟频率与板卡匹配
  • 工程配置,注意IDE选择STM32CubeIDE,Clion能转换这个工程为cmake工程
  • 生成代码以源文件加头文件方式(方便模块化代码编写),再点击生成代码,弹框选择打开文件夹
  • 使用Clion写代码和烧录固件

    创建一个嵌入式如门经典demo工程点灯

  • 右键菜单选择使用clion作为工程打开
  • 第一次使用clion打开选择不发送
  • 信任项目
  • 有插件且已经配置过一次情况

  • 选择openocd配置文件(没有弹窗可能是插件没有设置,后文再说明),没有图中的配置见上文提到的添加配置文件,由于博主是已经搭建过一次环境有一些配置和插件是以前的,还有登录账号会自动同步设置和插件。顺便提一下clion是一个收费软件,第一次使用会让登录账号激活,或者填入激活码,这部分移步其他地方查询方法,又能力的可以直接购买正版年费,想白嫖可以搞一个校园邮箱注册账号免费使用。
  • 在while循环添加以下代码每隔500毫秒闪烁LED
  •   while (1)
      {
          HAL_GPIO_TogglePin(GPIOA,GPIO_PIN_8);
          HAL_Delay(500);
        /* USER CODE END WHILE */
    
        /* USER CODE BEGIN 3 */
      }
    
  • 有图中的图标说明已经安装了插件(新版已经默认绑定安装了),没有则看下文安装插件,点击锤子构建,右侧三角就是烧录,虫子是调试,调试注意打断点
  • 没有插件情况

  • 安装插件
  • 第一步选择左侧的插件市场,为了演示本文选择已经安装选项(已经安装过的插件在插件市场搜不到)
  • 安装完成进行插件设置,选择openocd存放路径,Cubemx安装路径,右侧有可以测试软件是否可用,完成点击OK退出
  • 添加工程构建运行配置,添加完成后就有了上文提到的功能,就可以coding了


  • 板卡配置文件见上文,点击右侧帮助会自动弹出选择窗口,点击确认配置完成
  • 调试

    调试功能同keil相比稍逊色些,但仍然可以断点调试、查看寄存器、反汇编、查看内存、变量值

    printf重定向
  • 在clion中打开CubeMX工程文件,添加打印串口生成代码,关闭CubeMX回到Clion中

  • 由于printf函数很耗时(库的原因)所以使用寄存器代码,在Core/Src/usart.c文件中添加以下代码
  • /* USER CODE BEGIN 1 */
    int __io_putchar(int ch)
    {
        while ((USART1->SR & 0X40) == 0) // 等待上一次发送完
            ;
        USART1->DR = (uint8_t)ch; //串口发送字符
        return 1;
    }
    /* USER CODE END 1 */
    
  • 在Core/Src/usart.h文件中添加以下代码
  • /* USER CODE BEGIN Includes */
    #include <stdio.h>
    /* USER CODE END Includes */
    
  • 在Core/Src/main.c中添加以下代码,IO翻转根据实际情况填写参数,注意printf打印是带有缓冲的遇见换行才会打印输出
  •   /* USER CODE BEGIN WHILE */
      char str[] = "demo\n";
      while (1)
      {
          for (int i = 0; i < 5; ++i)
          {
              printf("%d", i);
          }
          printf("%s", str);
          HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_8);
          HAL_Delay(500);
        /* USER CODE END WHILE */
    
        /* USER CODE BEGIN 3 */
      }
    
    断点调试调试
  • 打好断点,点击小虫子开始调试,在变量栏中右击显示内核寄存器值
  • 调试菜单
  • 在内存中查看变量值

  • 查看外设寄存器值
  • 查看外设寄存器,直接加载keil包中svd,svd文件在keil的Packs文件夹下,选择对应芯片的svd就行了

  • 就能看见熟悉的寄存器了
  • 以查看IO输出数据为例(ODR)
  • 写在后面

    如果本文对你有帮助不要吝啬你的点赞、收藏、评论、关注,你的支持将是我继续输出优质文章的动力,也欢迎嗮出你的博客一起进步

    作者:韩少君

    物联沃分享整理
    物联沃-IOTWORD物联网 » 使用CLion和STM32CubeMX进行STM32开发(包含断点调试、寄存器查看和printf重定向)

    发表评论