stm32在linux环境下的开发与调试

环境安装

注:文末提供一键脚本

下载安装stm32cubeclt

下载地址为:https://www.st.com/en/development-tools/stm32cubeclt.html

选择 linux版本下载安装

在这里插入图片描述

安装好后默认在家目录st下

> $ ls ~/st/stm32cubeclt_1.16.0                                                                           
CMake                jre    STLink-gdb-server           STLinkUpgrade.sh          STM32CubeProgrammer  STMicroelectronics_CMSIS_SVD       uninstall_clt.sh
GNU-tools-for-STM32  Ninja  stlink-server.uninstall.sh  STM32CubeCLT_metadata.sh  STM32target-mcu      st-stlink-udev-rules.uninstall.sh

下载安装stm32cubemx

下载地址为https://www.st.com/en/development-tools/stm32cubemx.html

同样下载安装linux版本,安装好后默认在~/STM32CubeMX

开发调试

1. 工程初始化

使用cubemx随意生成一个cmake的测试工程,进入到工程目录

cd balance-car  #balance-car为我测试工程文件夹
export PATH=$PATH:$HOME/st/stm32cubeclt_1.16.0/GNU-tools-for-STM32/bin
mkdir build && cd build
cmake ..

2. 工程编译

继续在build目录执行make命令

make

出现以下内容表示编译成功

Memory region         Used Size  Region Size  %age UsedRAM:        2928 B        20 KB     14.30%FLASH:       53928 B        64 KB     82.29%
[100%] Built target balance-car

编译好后的二进制名为balance-car.elf

3.工程下载

执行以下命令下载程序

 ~/st/stm32cubeclt_1.16.0/STM32CubeProgrammer/bin/STM32_Programmer_CLI --connect port=swd --download ./balance-car.elf -hardRst -rst --start

下载成功提示输出:

Erasing memory corresponding to segment 0:
Erasing internal memory sectors [0 52]
Download in Progress:
[==================================================] 100%File download complete
Time elapsed during download operation: 00:00:03.233Hard reset is performedMCU ResetSoftware reset is performedRUNNING Program ...Address:      : 0x8000000
Application is running, Please Hold on...
Start operation achieved successfully

4.工程调试

启动gdbserver

打开一个新的命令窗口进入以下目录

cd ~/st/stm32cubeclt_1.16.0/STLink-gdb-server/bin/

修改此目录下config.txt 中-cp字段,注意需要将home后yala字段修改为自己对应家目录名称

###############################################################
#  -cp <path>         : Path to STM32CubeProgrammer
#                       Modify to correct path
#                       for STM32_Programmer_CLI executable
###############################################################
-cp /home/yala/st/stm32cubeclt_1.16.0/STM32CubeProgrammer/bin

此修改只进行一次,修改完成后启动gdb

./ST-LINK_gdbserver -c config.txt

启动成功输出如下

STMicroelectronics ST-LINK GDB server. Version 7.8.0
Copyright (c) 2024, STMicroelectronics. All rights reserved.Starting server with the following options:Persistent Mode            : EnabledLogFile Name               : debug.logLogging Level              : 31Listen Port Number         : 61234Status Refresh Delay       : 15sVerbose Mode               : DisabledSWD Debug                  : EnabledCOM frequency = 4000 kHz
Target connection mode: Default
Reading ROM table for AP 0 @0xe00fffd0
Hardware watchpoint supported by the target
ST-LINK Firmware version : V2J45S7
Device ID: 0x410
PC: 0x800b31c
ST-LINK device status: HALT_MODE
ST-LINK detects target voltage = 3.00 V
ST-LINK device status: HALT_MODE
ST-LINK device initialization OK
Stm32Device, pollAndNotify running...
SwvSrv state change: 0 -> 1
Waiting for connection on port 61235...
Waiting for debugger connection...
Waiting for connection on port 61234...
开始调试

回到build目录,启动gdb

~/st/stm32cubeclt_1.16.0/GNU-tools-for-STM32/bin/arm-none-eabi-gdb balance-car.elf

在gdb中连接到gdbserver

(gdb) target remote localhost:61234
Remote debugging using localhost:61234
Reset_Handler () at /home/junchao/work/balance-car/startup_stm32f103xb.s:64
64          bl  SystemInit

到这里就可以正常开始下断点调试了

EXT:方法2

从第三步开始,可以使用stlink开源工具实现程序下载、调试

从https://github.com/stlink-org/stlink/releases下载最新deb安装包,安装

sudo dpkg -i ./stlink_1.8.0-1_amd64.deb
  1. 启动gdbserver

    st-util
    

    成功输出为

    st-util 1.8.0
    2024-11-15T15:40:21 INFO common.c: NRST is not connected --> using software reset via AIRCR
    2024-11-15T15:40:21 INFO common.c: STM32F1xx_MD: 20 KiB SRAM, 64 KiB flash in at least 1 KiB pages.
    2024-11-15T15:40:21 INFO gdb-server.c: Listening at *:4242...
    
  2. 下载调试

    回到build目录,执行改变

    ~/st/stm32cubeclt_1.16.0/GNU-tools-for-STM32/bin/arm-none-eabi-gdb balance-car.elf
    

    在gdb中连接到gdbserver

    (gdb) target remote localhost:4242
    Remote debugging using localhost:4242
    main () at /home/junchao/work/balance-car/Core/Src/main.c:74
    74        uint32_t loop_cnt = 0;
    

    现在即可开始调试。若重新编译二进制后可以使用load命令下载更新程序

    (gdb) load balance-car.elf
    Loading section .isr_vector, size 0x10c lma 0x8000000
    Loading section .text, size 0xbe54 lma 0x8000110
    Loading section .rodata, size 0x1108 lma 0x800bf68
    Loading section .ARM, size 0x8 lma 0x800d070
    Loading section .init_array, size 0x4 lma 0x800d078
    Loading section .fini_array, size 0x4 lma 0x800d07c
    Loading section .data, size 0x228 lma 0x800d080
    Start address 0x0800b31c, load size 53920
    Transfer rate: 11 KB/sec, 5392 bytes/write.
    

一键脚本

编写了一个脚本用于一键操作

将脚本放到工程根目录(勿放到build目录),cubemx生成的工程文件夹名称不能修改,脚本依赖它运行

使用示例

./st-tool build  #编译项目
./st-tool dbg  # 启动调试
./st-tool dbg load # gdb启动后先进行程序下载操作再进行调试
./st-tool flash # 下载程序

请注意修改 脚本中$HOME/st/stm32cubeclt_1.16.0路径

#!/bin/bashexport PATH=$PATH:$HOME/st/stm32cubeclt_1.16.0/GNU-tools-for-STM32/bin/  # 自动检测项目名称
PROJECT_NAME=$(basename $(pwd))# 工具链配置
TOOLCHAIN_PREFIX="arm-none-eabi-"
GCC="${TOOLCHAIN_PREFIX}gcc"
OBJCOPY="${TOOLCHAIN_PREFIX}objcopy"
GDB="${TOOLCHAIN_PREFIX}gdb"# ST-Link配置
STLINK_FLASH="st-flash"
STLINK_UTIL="st-util"# 编译函数
compile() {if [ ! -d "build" ]; thenecho "Creating build directory..."mkdir buildficd buildif [ ! -f "Makefile" ]; thenecho "Running CMake..."cmake ..fiecho "Compiling project..."makeif [ $? -eq 0 ]; thenecho "Compilation successful."elseecho "Compilation failed."exit 1ficd ..
}# 烧录函数
flash() {if [ ! -f "build/${PROJECT_NAME}.elf" ]; thenecho "ELF file not found. Please compile the project first."exit 1fiecho "Creating binary file..."$OBJCOPY -O binary "build/${PROJECT_NAME}.elf" "build/${PROJECT_NAME}.bin"echo "Flashing binary to device..."$STLINK_FLASH write "build/${PROJECT_NAME}.bin" 0x8000000
}# GDB调试函数
debug() {if [ ! -f "build/${PROJECT_NAME}.elf" ]; thenecho "ELF file not found. Please compile the project first."exit 1fiecho "Starting ST-Link GDB server..."$STLINK_UTIL &STUTIL_PID=$!local load_command=""if [ "$1" = "load" ]; thenecho "exec load"load_command="-ex load build/${PROJECT_NAME}.elf"fiecho "Starting GDB debug session..."# $GDB -ex "target remote localhost:4242" "build/${PROJECT_NAME}.elf"$GDB -ex "set confirm off" \-ex "target remote localhost:4242" \$load_command \-ex "monitor reset halt" \-ex "monitor reset init" \"build/${PROJECT_NAME}.elf"# 清理ST-Link GDB server# kill $STUTIL_PID
}# 帮助信息
show_help() {echo "Usage: $0 [option]"echo "Options:"echo "  build    Compile the project"echo "  flash      Flash the binary to the device"echo "  dbg      Start a GDB debug session"echo "  help       Show this help message"
}# 主函数
main() {case "$1" inbuild)compile;;flash)flash;;dbg)if [ "$2" = "load" ]; thendebug loadelsedebugfi;;help)show_help;;*)echo "Invalid option. Use '$0 help' for usage information."exit 1;;esac
}# 执行主函数
main "$@"

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/886288.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Go语言中的类型

Go语言是一种静态类型的编程语言&#xff0c;这意味着每个变量和表达式在编译时都有确定的类型。Go提供了丰富的内置类型&#xff0c;包括基本数据类型、复合数据类型和引用类型等。本文将详细介绍Go中的各种类型&#xff0c;并提供实例说明。 基本数据类型 布尔型&#xff0…

【从零开始的LeetCode-算法】3270. 求出数字答案

给你三个 正 整数 num1 &#xff0c;num2 和 num3 。 数字 num1 &#xff0c;num2 和 num3 的数字答案 key 是一个四位数&#xff0c;定义如下&#xff1a; 一开始&#xff0c;如果有数字 少于 四位数&#xff0c;给它补 前导 0 。答案 key 的第 i 个数位&#xff08;1 < …

⾃动化运维利器 Ansible-变量

⾃动化运维利器Ansible-变量 一、变量命名规则二、变量的类型2.1 全局变量2.3 剧本变量2.4 资产变量2.5 facts变量2.6 注册变量 三、变量的优先级 按顺序食用&#xff0c;口味更佳 ( 1 ) ⾃动化运维利器Ansible-基础 ( 2 ) ⾃动化运维利器 Ansible-Playbook ( 3 ) ⾃动化运维利…

蓝桥杯每日真题 - 第12天

题目&#xff1a;&#xff08;数三角&#xff09; 题目描述&#xff08;14届 C&C B组E题&#xff09; 解题思路&#xff1a; 给定 n 个点的坐标&#xff0c;计算其中可以组成 等腰三角形 的三点组合数量。 核心条件&#xff1a;等腰三角形的定义是三角形的三条边中至少有…

项目技术栈-解决方案-注册中心

项目技术栈-解决方案-注册中心 ZookeeperEureka、Nacos、Consul和Etcd参考文章 服务注册中心&#xff08;Registry&#xff09;&#xff1a;用于保存 RPC Server 的注册信息&#xff0c;当 RPC Server 节点发生变更时&#xff0c;Registry 会同步变更&#xff0c;RPC Client 感…

uniapp适配暗黑模式配置plus.nativeUI.setUIStyle适配DarkMode配置

uniapp适配暗黑模式配置 目录 uniapp适配暗黑模式配置setUIStyleDarkMode 适配app-plus manifest.json配置theme.json配置pages.json配置页面切换代码实现同步手机暗黑配置额外适配 参考官方文档&#xff1a;https://uniapp.dcloud.net.cn/tutorial/darkmode.html 主要用到api…

Wireshark中的length栏位

注&#xff1a;Ethernet II的最小data length为46&#xff0c;如果小于&#xff0c;会补全到46. 1.指定网卡抓取的&#xff0c;链路为ethernet。 IPv4 Ethernet II 长度为 14 bytes - L1ipv4 header中的length包括header和payload的总长度 - L2wireshark中length表示抓取的pac…

Spring 4.3 源码导读

Spring Framework 是一个功能强大的开源框架&#xff0c;广泛用于企业级 Java 应用程序开发。Spring 4.3 是一个成熟的版本&#xff0c;提供了丰富的功能和模块。以下是对 Spring 4.3 源码的一些关键部分的导读&#xff0c;帮助你更好地理解其架构和设计理念。 1. 源码获取 从…

前端开发迈向全栈之路:规划与技能

一、前端开发与全栈开发的差异 前端开发主要负责构建和实现网页、Web 应用程序和移动应用的用户界面。其工作重点在于网页设计和布局&#xff0c;使用 HTML 和 CSS 技术定义页面的结构、样式和布局&#xff0c;同时运用前端框架和库如 React、Angular 或 Vue.js 等构建交互式和…

后端总指挥---文件接口

为了方便编写项目时前后端的连接&#xff0c;在这里引进文件接口的概念&#xff0c;通常包含以下几个部分&#xff1a; 功能请求路径请求方式传输的数据类型请求入参数据样本响应的出参响应成功后的数据样本 这样前端编程与后端编程 可以根据文件接口这个文档来分别编写前后端&…

ISUP协议视频平台EasyCVR视频设备轨迹回放平台智慧农业视频远程监控管理方案

在当今快速发展的农业领域&#xff0c;智慧农业已成为推动农业现代化、助力乡村全面振兴的新手段和新动能。随着信息技术的持续进步和城市化进程的加快&#xff0c;智慧农业对于监控安全和智能管理的需求日益增长。 视频设备轨迹回放平台EasyCVR作为智慧农业视频远程监控管理方…

通过wsl配置Qt的中文开发环境

本文列举了一些在WSL上配置Qt编译环境中遇到的一些问题及解决方案 关键词: Win10 22HUbuntu18.04xfce桌面交叉编译arm64qt / qtcreator中文输入及显示标题 安装qt,qtcreatorqt.qpa.screen: QXcbConnection: Could not connect to displayld: cannot find -lGLqmake: could no…

前端web

题目&#xff1a;制作带有下拉悬停菜单的导航栏 效果图 一、先制作菜单栏 <body> <div id"menu"> <div id"container"> <div class"item">游戏1 <div cla…

PostgreSQL 跨数据库访问

有这样的一个业务场景。有一个表对象在数据库 A 中&#xff0c;但是在同一个实例的数据库 B 中我想访问位于 A 库中的这个对象&#xff0c;那么有什么好的方法可以实现呢。 假设在数据库 cloud_test 中有如下的对象&#xff0c;现在想在数据库 cloud_health 中访问这个对象。 …

《应用概率统计》

《应用概率统计》主要有综合报告、学术论文、应用研究、应用简报、教学研究、学术活动报道、书评、新书介绍等栏目。 一、《应用概率统计》是中国数学会概率统计学会主办的全国性学术刊物&#xff0c;主要刊登概率论与数理统计的理论和应用两方面有创造性的学术论文&#xff0c…

Vue之插槽(slot)

插槽是vue中的一个非常强大且灵活的功能&#xff0c;在写组件时&#xff0c;可以为组件的使用者预留一些可以自定义内容的占位符。通过插槽&#xff0c;可以极大提高组件的客服用和灵活性。 插槽大体可以分为三类&#xff1a;默认插槽&#xff0c;具名插槽和作用域插槽。 下面…

unity3d————Resources异步加载

知识点一&#xff1a;Resources异步加载是什么&#xff1f; 在Unity中&#xff0c;资源加载可以分为同步加载和异步加载两种方式。同步加载会在主线程中直接进行&#xff0c;如果加载的资源过大&#xff0c;可能会导致程序卡顿&#xff0c;因为从硬盘读取数据到内存并进行处理…

fatal error C1083: 无法打开包括文件: “stdio.h”: No such file or directory

在 Windows 上的 “终端” 里&#xff0c;对于已经执行过 cmake -S . -B build -G Ninja 的工程&#xff0c;执行了 cmake --build build出现了报错&#xff1a; fatal error C1083: 无法打开包括文件: “stdio.h”: No such file or directory 原因是&#xff0c;当前 “终端…

SpringBoot开发——Spring Boot 3.3整合RabbitMQ构建高效稳定的消息队列系统

文章目录 一、配置 RabbitMQ二、自动配置的核心组件三、发送消息至指定 Stream四、接收消息与 RabbitListener 注解五、实现自定义 RabbitListenerContainerFactory六、消息重试机制七、总 结 消息队列在分布式系统中起着至关重要的作用&#xff0c;它能够解耦系统、削峰填谷&a…

SpringBoot+Vue3实现数据可视化大屏

前端工程的地址:UserManagerFront: 数据可视化前端 (gitee.com) 效果展示&#xff0c;可以展现出来了&#xff0c;样式可能还有一些丑。 后端代码 后端主要是拿到数据并对数据进行处理&#xff0c;按照前端需要的格式进行返回即可。 import com.njitzx.entity.Student; impor…