最近其实心思并不在学习上,这篇文章本该前几天完成,硬生生拖到今天,下不为例。
此篇文章的终极目的是为了提升不同操作系统之间单片机开发的兼容性,并彻底甩开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插件,目前用着很顺手,如这张图片的配置