当前位置:   article > 正文

使用clion配合STM32CubeMX开发stm32(包含断点调试,查看寄存器值,printf重定向)_clion debug 的时候显示通用寄存器的值

clion debug 的时候显示通用寄存器的值

摘要

在嵌入式领域中开发以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]
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

编辑完成文件保存到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 */
  }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 有图中的图标说明已经安装了插件(新版已经默认绑定安装了),没有则看下文安装插件,点击锤子构建,右侧三角就是烧录,虫子是调试,调试注意打断点
    在这里插入图片描述

没有插件情况

  • 安装插件
    在这里插入图片描述
  • 第一步选择左侧的插件市场,为了演示本文选择已经安装选项(已经安装过的插件在插件市场搜不到)
    在这里插入图片描述
  • 安装完成进行插件设置,选择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 */
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 在Core/Src/usart.h文件中添加以下代码
/* USER CODE BEGIN Includes */
#include <stdio.h>
/* USER CODE END Includes */
  • 1
  • 2
  • 3
  • 在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 */
  }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
断点调试调试
  • 打好断点,点击小虫子开始调试,在变量栏中右击显示内核寄存器值
    在这里插入图片描述
  • 调试菜单
    在这里插入图片描述
  • 在内存中查看变量值
    在这里插入图片描述
    在这里插入图片描述
查看外设寄存器值
  • 查看外设寄存器,直接加载keil包中svd,svd文件在keil的Packs文件夹下,选择对应芯片的svd就行了
    在这里插入图片描述
    在这里插入图片描述
  • 就能看见熟悉的寄存器了
    在这里插入图片描述
  • 以查看IO输出数据为例(ODR)
    在这里插入图片描述

写在后面

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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Cpp五条/article/detail/380081?site
推荐阅读
相关标签
  

闽ICP备14008679号