学习stm32cudemx +vs 创建hex文件,刷机

1.使用DAP 调试器下载

下载openODC 执行程序

在Unofficial binary packages 模块中下载相关程序

https://openocd.org/pages/getting-openocd.html

2.在工程的根目录的cmake下面添加:

yaml 复制代码
cmake_minimum_required(VERSION 3.22)

#
# This file is generated only once,
# and is not re-generated if converter is called multiple times.
#
# User is free to modify the file as much as necessary
#

# Setup compiler settings
set(CMAKE_C_STANDARD 11)
set(CMAKE_C_STANDARD_REQUIRED ON)
set(CMAKE_C_EXTENSIONS ON)


# Define the build type
if(NOT CMAKE_BUILD_TYPE)
    set(CMAKE_BUILD_TYPE "Debug")
endif()


# Set the project name
set(CMAKE_PROJECT_NAME PWM_Light)

# Enable compile command to ease indexing with e.g. clangd
set(CMAKE_EXPORT_COMPILE_COMMANDS ON)

# Core project settings
project(${CMAKE_PROJECT_NAME})
message("Build type: " "${CMAKE_BUILD_TYPE}")

# Enable CMake support for ASM and C languages
enable_language(C ASM)

#添加用户自定义文件
file(GLOB_RECURSE USER_SOURCES CONFIGURE_DEPENDS
    ${CMAKE_CURRENT_SOURCE_DIR}/Core/Src/app/*.c
    )
#打印用户自定义文件
 message("User Sources: " ${USER_SOURCES})

# Create an executable object type
add_executable(${CMAKE_PROJECT_NAME}
    ${USER_SOURCES}   # 用户添加的源文件
)




# Add STM32CubeMX generated sources
add_subdirectory(cmake/stm32cubemx)


# Link directories setup
target_link_directories(${CMAKE_PROJECT_NAME} PRIVATE
    # Add user defined library search paths
)

# Add sources to executable
target_sources(${CMAKE_PROJECT_NAME} PRIVATE
    # Add user sources here
)

# Add include paths
target_include_directories(${CMAKE_PROJECT_NAME} PRIVATE
    # Add user defined include paths
    Drivers/CMSIS/Device/ST/STM32F1xx/Include
    Drivers/CMSIS/Include
    Drivers/STM32F1xx_HAL_Driver/Inc
    Core/Inc
    Core/Src/app # 如果 ws2812.h 在 app 目录下,可能需要添加此包含路径,或者确保 Core/Inc 能搜到
)

# Add project symbols (macros)
target_compile_definitions(${CMAKE_PROJECT_NAME} PRIVATE
    # Add user defined symbols
)

# Remove wrong libob.a library dependency when using cpp files
list(REMOVE_ITEM CMAKE_C_IMPLICIT_LINK_LIBRARIES ob)

# Add linked libraries
target_link_libraries(${CMAKE_PROJECT_NAME}
    stm32cubemx

    # Add user defined libraries
)


# ============================================================
# 产物生成 ------ 必须放在根 CMakeLists.txt
# (add_custom_command 的 TARGET 形式要求目标与本命令同目录)
# ============================================================

# 1) 产物名统一在这里定义,全局复用
set(HEX_FILE ${CMAKE_PROJECT_NAME}.hex)
set(BIN_FILE ${CMAKE_PROJECT_NAME}.bin)
set(MAP_FILE ${CMAKE_PROJECT_NAME}.map)

# 2) 工具变量兜底:兼容 CMAKE_SIZE_UTIL(ST 官方)与 CMAKE_SIZE(社区)两种命名
if(NOT CMAKE_OBJCOPY)
    set(CMAKE_OBJCOPY arm-none-eabi-objcopy)
endif()
if(NOT CMAKE_SIZE_UTIL)
    if(CMAKE_SIZE)
        set(CMAKE_SIZE_UTIL ${CMAKE_SIZE})
    else()
        set(CMAKE_SIZE_UTIL arm-none-eabi-size)
    endif()
endif()

# 3) 链接完成后生成 hex / bin 并打印体积
add_custom_command(TARGET ${CMAKE_PROJECT_NAME} POST_BUILD
    COMMAND ${CMAKE_OBJCOPY} -O ihex      $<TARGET_FILE:${CMAKE_PROJECT_NAME}> ${CMAKE_BINARY_DIR}/${HEX_FILE}
    COMMAND ${CMAKE_OBJCOPY} -O binary -S $<TARGET_FILE:${CMAKE_PROJECT_NAME}> ${CMAKE_BINARY_DIR}/${BIN_FILE}
    COMMAND ${CMAKE_SIZE_UTIL} $<TARGET_FILE:${CMAKE_PROJECT_NAME}>
    COMMENT "生成 ${HEX_FILE} / ${BIN_FILE} 并打印体积"
    WORKING_DIRECTORY ${CMAKE_BINARY_DIR}
    VERBATIM
)

# 4) clean 时连带删除。用 APPEND,不要用 set_target_properties(会覆盖)
set_property(TARGET ${CMAKE_PROJECT_NAME} APPEND PROPERTY ADDITIONAL_CLEAN_FILES
    ${CMAKE_BINARY_DIR}/${MAP_FILE}
    ${CMAKE_BINARY_DIR}/${HEX_FILE}
    ${CMAKE_BINARY_DIR}/${BIN_FILE}
)

3.使用刷机的脚本

yaml 复制代码
@echo off
setlocal
chcp 65001 >nul
cd /d "%~dp0"
:: ============ 路径配置(按实际安装位置修改) ============
set "OPENOCD_EXE=C:\Program Files\xpack-openocd-0.12.0-7\bin\openocd.exe"
set "OPENOCD_SCRIPTS=C:\Program Files\xpack-openocd-0.12.0-7\openocd\scripts"

:: ============ 接口与目标芯片 ============
set "IFACE_CFG=interface/cmsis-dap.cfg"
set "TARGET_CFG=target/stm32f1x.cfg"

:: ============ 默认 HEX 路径 ============
set "Hex_Path=build/Debug/PWM_Light.hex"
set "OPENOCD_SCRIPT=flash.cfg"
set "KEEP_SCRIPT=0"
:: ============ 检查固件是否存在 ============
if "%~1"=="" (
    if not exist "%Hex_Path%" (
        echo [ERROR] 固件不存在: %Hex_Path%
        echo 当前 build 目录下的 hex 文件:
        dir /s /b build\Debug\*.hex 2>nul
        exit /b 1
    )
    set "HEX_FILE=%Hex_Path%"
) else (
    set "HEX_FILE=%~1"
)

:: ============ 生成 OpenOCD 命令脚本 ============
if exist "%OPENOCD_SCRIPT%" del /f /q "%OPENOCD_SCRIPT%"

>>"%OPENOCD_SCRIPT%" echo adapter speed 1000
>>"%OPENOCD_SCRIPT%" echo init
>>"%OPENOCD_SCRIPT%" echo reset halt
>>"%OPENOCD_SCRIPT%" echo program "%HEX_FILE%" verify
>>"%OPENOCD_SCRIPT%" echo reset run
>>"%OPENOCD_SCRIPT%" echo shutdown



:: ============ 执行烧录 ============
"%OPENOCD_EXE%" -s "%OPENOCD_SCRIPTS%" ^
    -f "%IFACE_CFG%" ^
    -f "%TARGET_CFG%" ^
    -f "%OPENOCD_SCRIPT%"

if %ERRORLEVEL% EQU 0 (
    echo [OK] 烧录成功
) else (
    echo [FAIL] 烧录失败,错误码 %ERRORLEVEL%
)

del /f /q "%OPENOCD_SCRIPT%"
endlocal
相关推荐
小范的技术工坊2 小时前
Linux应用开发(文件IO)
linux·stm32·单片机
桀人5 小时前
I2C概念引入
stm32·单片机·嵌入式硬件
我是人✓7 小时前
STM32上跑FreeRTOS:实时任务调度全解析
stm32·单片机·嵌入式硬件
Zw-awa9 小时前
让电机走到指定位置:编码器位置环 PID
stm32
澄纸气10 小时前
KEIL的调试模式
stm32
皓月盈江10 小时前
Linux Debian下STM32CubeProgrammer串口连接失败解决方案
linux·stm32·debian·串口下载·stm32f103c8t6·usb转ttl·stm32cubepro
深圳老胡10 小时前
C语言实现C++面向对象程序设计示例
笔记·stm32·单片机·代码规范
LCG米10 小时前
STM32时钟树配置实测:HSE起振失败回退HSI、PLL分频倍频计算与Flash等待周期陷阱
stm32·单片机·嵌入式硬件·嵌入式
巴巴媛66611 小时前
【Debug1】程序死机,while(1)循环,怎么办?
c语言·笔记·stm32·嵌入式硬件·bug