基于不同系统使用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)
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系统迁移代码的注意事项
不要改变迁移过来的文件夹名字,为了区分不同的模块。可以在前面新建文件夹。
inux系统上的生成与烧录与此类似,最近暂时没有回学校,一直是远程连接电脑,没有办法实地测试。最近在接触强化学习相关的东西,这篇文章之后还会更新的。
作者:Turnin11111