基于不同系统使用cmsis-dap完成stm32代码调试和烧录

最近其实心思并不在学习上,这篇文章本该前几天完成,硬生生拖到今天,下不为例。

此篇文章的终极目的是为了提升不同操作系统之间单片机开发的兼容性,并彻底甩开keilv5这个大包袱。具体的转变原因可以参考这篇文章:正确姿势开发单片机项目——以stm32为例 - 知乎


在搞完基于clion的stm32开发后

Linux系统下速通stm32的clion开发环境配置_fedora linux配置stm32开发环境-CSDN博客

我一直在尝试如何在windows和linux系统下完成相同工程的配置与开发和烧录。最终发现linux上使用clion,windows上使用cubeide是最方便的,可以完成全平台开发,也可以不需要再借助keil和flymcu这样的软件完成烧录。

(其实linux上用cubeide也完全可以,clion配置的本质和cubeide一样,都是cmake+arm-gcc工具链的方式,二者可以通用。我是因为linux上有clion再加上好看,所以配置clion。至于windows上只有cubeide,没有必要再配置一次clion)


重要事项:生成代码,编译代码,烧录代码都需要用arm-gcc,arm-gdb工具链,有时cubeide或者clion工具会默认用自带的gdb编译或烧录,这肯定是有问题的!!!!!

 1.cubeide怎么改变字体大小

windows---preference下,点开general---appearance选项,会看到一个colors and fonts,如下图所示,否则代码看起来会很不方便。

 2. 生成代码时的一些小技巧

和keil上的库函数开发不同的是(或使用cubemx生成hal库的程序,再导入keil),会发现cubeide生成代码烧录之后,有时会没反应。这种情况下有两种可能性。

1.时钟配置失败。m3的芯片应该配置72MHZ,然后再区分APB1和APB2总线,m4芯片应该配置168MHZ。具体可以看相关手册。如果时钟配置失败,会导致初始定义程序加载失败,程序运行不到main函数内,或者是延时时间过长,看不到效果。以下为stm32f103的时钟配置,官方手册中也有。个人觉得如果想认真开发,一定要多看官方的开发手册

2.初始配置的外设不要太多,用到什么配什么。我之前使用keil开发的时候,因为是用正点家的基础模板来开发,会选择一些已经有基础外设配置的模板并在它的基础上去改。但是这不太适用于cubeide生成烧录的方式,有的时候初始外设太多会导致烧录后没有任何效果,像卡住或者阻塞了一样。比如说在这里我就故意删去了一些初始外设配置,只保留能用的上的。

3.新的代码不能随意找地方添加。要在原先生成的代码注释里才行,否则容易被cubemx/cubeide更新后删除。(这个我会在之后的文章里具体说明)。总之,主程序代码要在/* USER CODE BEGIN WHILE */和/* USER CODE END WHILE */之间,否则就会啥也没有。

 /* USER CODE BEGIN WHILE */
  while (1)
  {
	  HAL_GPIO_WritePin(GPIOE, GPIO_PIN_5, GPIO_PIN_RESET);
	  HAL_Delay(100);
	  HAL_GPIO_WritePin(GPIOB, GPIO_PIN_5, GPIO_PIN_RESET);
	  HAL_Delay(300);
	  HAL_GPIO_WritePin(GPIOE, GPIO_PIN_5, GPIO_PIN_SET);
	  HAL_Delay(100);
	  HAL_GPIO_WritePin(GPIOB, GPIO_PIN_5, GPIO_PIN_SET);
	  HAL_Delay(300);
    /* USER CODE END WHILE */

如果想放置新的文件,必须改变cmakelist.txt并在不属于core文件夹内的地方新建文件夹,囊括新建的文件。(这里面的new文件夹及里面的文件就是)。

include_directories(Core/Inc Drivers/STM32F1xx_HAL_Driver/Inc Drivers/STM32F1xx_HAL_Driver/Inc/Legacy Middlewares/Third_Party/FreeRTOS/Source/include Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS_V2 Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM3 Drivers/CMSIS/Device/ST/STM32F1xx/Include Drivers/CMSIS/Include New/Inc)

add_definitions(-DDEBUG -DUSE_HAL_DRIVER -DSTM32F103xE)

file(GLOB_RECURSE SOURCES "Core/*.*" "Middlewares/*.*" "Drivers/*.*" "New/*.*")

实验发现在cubeide里光改这个还没用,还是得设置:

 

3.完成烧录的第一种方式(效果不好,但可以尝试)

是利用设置一站式完成烧录(但是可能不通用,而且有时无法使用arm-gdb烧录,用传统的gdb就会一直有问题)

要生成这个launch文件,改变stm32project2 Debug.cfg,这个设置本身没啥问题,但是因为找不到dap烧录器端口,提示烧录失败。

# This is an genericBoard board with a single STM32F103ZETx chip
#
# Generated by STM32CubeIDE
# 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/cmsis-dap.cfg]


set WORKAREASIZE 0x8000

transport select "swd"

set CHIPNAME STM32F103ZETx
set BOARDNAME genericBoard

# 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 8000

# Reset configuration
# use hardware reset, connect under reset
# connect_assert_srst needed if low power mode application running (WFI...)
reset_config none
set CORE_RESET 0

# ACCESS PORT NUMBER
set AP_NUM 0
# GDB PORT
set GDB_PORT 3333





# BCTM CPU variables

source [find target/stm32f1x.cfg]

# SWV trace
set USE_SWO 0
set swv_cmd "-protocol uart -output :3333 -traceclk 72000000"
source [find board/swv.tcl]

 

4.用命令完成烧录(推荐)

win系统下可以输入命令烧录代码并完成调试过程。先在这里新建openocd_start.bat文件,里面驱动openocd的exe文件,并配置烧录cmsis_dap和stm32f1x(根据自己芯片来选)

例如我使用的是dap烧录器,芯片型号为stm32f103zet6,那我在这里的配置就是:

.\openocd.exe -f interface\cmsis-dap.cfg -f target\stm32f1x.cfg

 之后插入烧录器,点开这个批处理文件,会显示监听到3333端口

不要关这个界面 ,打开这个stm32项目里的Debug文件夹,在里面新建run_project.bat

set PATH=D:\Program Files (x86)\GNU Arm Embedded Toolchain\10 2021.10\bin;%PATH%
arm-none-eabi-gdb -x commends.gdb

 第一行,先设置这个命令行环境内的arm-none-eabi-gdb工具链引用路径。它的原理是先在官网上下载工具链,后配置到路径内引用。

第二行,使用工具链编译运行commends.gdb,以下是commends.gdb的内容:

target extended-remote localhost:3333 //跟踪端口
monitor halt  //立即停止目标设备上的运行程序,防止其干扰后续操作。
monitor reset halt  //将目标设备复位,并保持在停止(halted)状态,清除寄存器和外设状态
monitor flash erase_sector 0 //擦除目标设备的闪存,通常用于清除已有程序或准备写入新程序。
file stm32project2.elf //加载要烧录的文件,根据自己的文件来改,是的这里并不需要生成hex文件
load  //将 stm32project2.elf 文件中的程序写入到目标设备(通常是闪存)

之后只需要source commends.gdb就可以重新烧录程序,看一下正常烧录的状态

发现烧录后状态不达预期,可以quit退出run_project.bat,并ctrl+c退出openocd_start.bat,重新插拔烧录器即可恢复正常。

5.cubeide怎么生成bin和hex文件

如果想要usb烧录,还是要生成bin和hex文件。打开proijects-properties-c/c++ build,试图生成这两个文件。clion里不需要特意配置,每次重新生成代码之后都会重新生成一次bin和hex文件。

6. 从linux系统向win系统迁移代码的注意事项

不要改变迁移过来的文件夹名字,为了区分不同的模块。可以在前面新建文件夹。

7.linux系统内编译和烧录程序(如果只想看成功的方法可以直接跳过这块)

单片机编译看这篇文章:

Linux系统下速通stm32的clion开发环境配置_linux使用clion开发stm32-CSDN博客

我尝试了正点原子家的mini-dap仿真器和ATK-DAP仿真器,发现lsusb能显示出设备,但是使用openocd烧录时就一直无法烧录,显示没有匹配的设备,也改了文件本身,但没什么用,还是搜索不到设备。问店家店家也不知道,说他们只在windows上尝试过烧录程序。。。。。。我将自己测试用的命令,项目设置和结果放在这里,如果有知道该怎么改的,可以在评论区里说一下。

 

如果换成stlink烧录,会出现比较奇怪的问题:

不知道是不是和盗版芯片有关系。。。idcode一直不太对

当时调试的时候还遇到stlink,openocd进程死活关不上的问题,重启时进程也关不掉,无奈只能强制关机后开机。

其实这个用kill命令就好了。出现这个问题是因为我调试的时候没有注意,stlink gui点的太多加载不出来,openocd烧录时把单片机上的3v接到了stlink烧录器上的5v引脚,所以全卡住了。。。。。

8.怎么在linux系统上烧录单片机程序

此方法需使用stlink烧录器,不要使用cmsis-dap烧录器

yay -S stlink

下载stlink gui后,打开界面,点一下connect连接

然后使用编译出的bin或hex文件,烧录到单片机上。每次改完代码后需要重新导入文件

至此,任务结束

--------------------------------------------------------------------------------------------------------------------------

clion添加新文件,直接在CMakeLists.txt里添加路径就可以

9.使用openocd在linux系统上烧录与编译

最近用了两个官方芯片版本的stlink烧录器,忽然发现可以顺利完成openocd烧录了,到这里记录一下

在某路径下新建run_openocd.sh

先允许文件在命令行中的访问权限

sudo chmod a+rx /path/to/run_openocd.sh        //这块运行权限是a+rx,不是a+rw

在run_openocd中写入,并使用命令行运行

openocd -f /usr/share/openocd/scripts/interface/stlink-v2.cfg -f /usr/share/openocd/scripts/target/stm32f4x.cfg    //根据自己配置来改
/path/to/run_openocd.sh               //尝试运行

出现如下反应,说明openocd已经开启

 然后在要运行的debug文件夹下新建run_project.sh和commends.gdb,clion下下载shell运行插件(clion应该会自动推荐)

run_project.sh下写入

#!/bin/bash
arm-none-eabi-gdb -x commends.gdb

commends.gdb下写入

set pagination off                  // 禁用分页输出(精确描述功能)
target extended-remote localhost:3333  // 连接OpenOCD调试服务(标准术语)
monitor halt                       // 暂停目标芯片执行
monitor flash erase_sector 0 0 0   // 擦除flash bank0的第0扇区(增加参数说明)
monitor reset halt                 // 复位芯片并保持暂停状态(非擦除操作)
file Bit6project2.elf              // 加载调试符号文件
load                               // 烧录程序到flash
monitor reset                      // 执行硬件复位(启动新程序)

如果想擦除全部扇区,需要查一下不同芯片使用的扇区个数(flash),比如bit6的flash是2MB,12个扇区:

monitor flash erase_sector 0 0 11

  想烧录的话,直接运行run_project.sh即可,另外我还配置了marscode ai插件,目前用着很顺手,如这张图片的配置

### 如何使用CMSIS-DAP烧录HEX文件 #### 准备工作 在使用CMSIS-DAP烧录HEX文件之前,需要确认以下几点: - 开发环境已安装CMSIS-DAP驱动并配置好工具链[^1]。 - 已经生成目标设备所需的HEX文件。可以通过Keil或其他IDE设置选项来生成HEX文件,例如勾选`Create HEX File`选项[^2]。 #### CMSIS-DAP硬件兼容性注意事项 需要注意的是,不同型号的MCU可能需要特定版本的CMSIS-DAP固件才能实现功能完整的烧录操作。例如,某些DAPLink固件仅适用于某一类芯片系列(如STM32F103),而对其他系列(如STM32F4)则不提供支持[^3]。 #### 使用CMSIS-DAP虚拟U盘拖拽方式烧录HEX文件 对于支持虚拟U盘模式的CMSIS-DAP调试器,可以采用简单的拖拽方式进行烧录: 1. 将开发板连接至PC,确保CMSIS-DAP被识别为USB存储设备。 2. 找到对应的虚拟U盘分区,并将生成的目标HEX文件复制到此分区中。 3. 断开并重新连接开发板电源,系统会自动完成程序加载过程。 #### 使用命令行工具烧录HEX文件 除了图形化界面外,还可以利用官方提供的命令行工具执行更灵活的操作。以下是具体方法: ```bash # 进入CMSIS-DAP工具所在目录 cd path/to/cmsis-dap-tool/ # 使用命令行工具指定hex文件路径以及目标设备参数 ./cmsis-dap-cli flash --file your_program.hex --device STM32Fxxx ``` 上述脚本展示了如何调用CMSIS-DAP CLI接口向目标单片机写入数据[^4]。需替换实际使用的hex文件名与匹配的具体器件标识符。 #### 特殊情况处理——STLink-V2-1升级后的CMSIS-DAP应用 当尝试把标准版STLink-V2-1更新成具备CMSIS-DAP特性的新型号时,可能会遇到一些特殊状况。比如经过初步转换后再次试图通过原厂软件进行二次刷写会出现失败现象。这是因为新植入的功能模块可能存在额外的安全机制阻止进一步更改。此时建议先恢复原始状态再继续后续步骤[^5]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值