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