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

news/2024/11/17 4:24:45 标签: stm32, linux

环境安装

注:文末提供一键脚本

stm32cubeclt_6">下载安装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_25">下载安装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 Used
             RAM:        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.233

Hard reset is performed

MCU Reset

Software reset is performed

RUNNING 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            : Enabled
        LogFile Name               : debug.log
        Logging Level              : 31
        Listen Port Number         : 61234
        Status Refresh Delay       : 15s
        Verbose Mode               : Disabled
        SWD Debug                  : Enabled

COM 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/bash

export 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" ]; then
        echo "Creating build directory..."
        mkdir build
    fi

    cd build
    if [ ! -f "Makefile" ]; then
        echo "Running CMake..."
        cmake ..
    fi

    echo "Compiling project..."
    make
    if [ $? -eq 0 ]; then
        echo "Compilation successful."
    else
        echo "Compilation failed."
        exit 1
    fi
    cd ..
}

# 烧录函数
flash() {
    if [ ! -f "build/${PROJECT_NAME}.elf" ]; then
        echo "ELF file not found. Please compile the project first."
        exit 1
    fi

    echo "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" ]; then
        echo "ELF file not found. Please compile the project first."
        exit 1
    fi

    echo "Starting ST-Link GDB server..."
    $STLINK_UTIL &
    STUTIL_PID=$!

    local load_command=""
    if [ "$1" = "load" ]; then
        echo "exec load"
        load_command="-ex load build/${PROJECT_NAME}.elf"
    fi
    echo "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" in
        build)
            compile
            ;;
        flash)
            flash
            ;;
        dbg)
            if [ "$2" = "load" ]; then
              debug load
            else
              debug
            fi
            ;;
        help)
            show_help
            ;;
        *)
            echo "Invalid option. Use '$0 help' for usage information."
            exit 1
            ;;
    esac
}

# 执行主函数
main "$@"

http://www.niftyadmin.cn/n/5754870.html

相关文章

【网络安全】网络安全防护体系

1.网络安全防护体系概述 1.1 网络安全的重要性 网络安全是保护网络空间不受恶意攻击、数据泄露和其他安全威胁的关键。随着数字化转型的加速&#xff0c;网络安全的重要性日益凸显&#xff0c;它不仅关系到个人隐私和企业机密的保护&#xff0c;还涉及到国家安全和社会稳定。…

使用 Vue 和 ECharts 创建交互式图表

使用 Vue 和 ECharts 创建交互式图表 引言 在现代 Web 应用中&#xff0c;数据可视化是一个重要的组成部分。它不仅能够帮助用户更好地理解复杂的数据&#xff0c;还能提升用户体验。 技术背景 Vue.js Vue.js 是一个渐进式 JavaScript 框架&#xff0c;用于构建用户界面。…

Python进程间通讯大揭秘:原理深度剖析与实战案例分享

在Python编程中,进程间通讯(Inter-Process Communication,简称IPC)是一个不可或缺的概念。它允许多个进程在操作系统中相互协作,共享信息或执行特定的任务。本文将深入剖析Python进程间通讯的原理,并通过实例展示其实现方法,帮助读者更好地理解和应用这一技术。 一、进程…

nacos集群源码解析-cp架构

目录 1 简介 1.1 什么是 CP 架构&#xff1f; 1.2 Nacos 中的 CP 架构特点 1.3 优缺点 1.4适用场景 2 cp架构的主节点选举 2.1 选举流程 2.2 总结 3 cp架构主节点的心跳发送 3.1 leader发送心跳 3.2 follower接收心跳 3.3 总结 4 cp架构的服务注册 4.1 注册流程 …

引领豪华MPV新趋势,比亚迪夏内饰科技广州车展全球首发

11月15日&#xff0c;比亚迪第五代DM技术中大型旗舰MPV夏内饰科技在广州车展正式发布。作为王朝网全新IP夏的首款同名车型&#xff0c;夏采用王朝新一代内饰设计语言&#xff0c;传承华夏文化深厚底蕴&#xff0c;从技术、平台、安全、设计、空间、智享、智驾七大维度&#xff…

自己动手写Qt Creator插件

文章目录 前言一、环境准备1.先看自己的Qt Creator IDE的版本2.下载源码 二、使用步骤1.参考原本的插件2.编写自定义插件1.cmakelist增加一个模块2.同理&#xff0c;qbs文件也增加一个3.插件源码 三、效果总结 前言 就目前而言&#xff0c;Qt Creator这个IDE&#xff0c;插件比…

7天用Go从零实现分布式缓存GeeCache(学习)(3)

目录结构 ├── geecache │ ├── byteview.go │ ├── cache.go │ ├── consistenthash │ │ ├── consistenthash.go │ │ └── consistenthash_test.go │ ├── geecache.go │ ├── go.mod │ ├── http.go │ ├── lru │ …

android应用调用c语言的so库

android应用调用c语言的so库&#xff0c;可以将c代码放在android工程里直接ndk编译&#xff0c;或者外部一个so库&#xff0c;ndk编一个调用so的桥接库。普通的c函数java代码不能直接调用&#xff0c;桥接的虚函数不可少&#xff0c;所以此处仅记录一下桥接函数。有的固定路径的…