31.7 STM32 开发环境
安装 STM32CubeMX
$ unzip stm32cubemx-lin-v6-17-0.zip -d /home/ykla/stm$ ./SetupSTM32CubeMX-6.17.0








安装其他工具
编译与烧录
Shell
配置文件
写入内容
最后更新于
[Desktop Entry]
Name=STM32CubeMX
Exec=/home/ykla/STM32CubeMX/STM32CubeMX %U
Terminal=false
Type=Application
Icon=/home/ykla/STM32CubeMX/help/STM32CubeMX.png
StartupWMClass=STM32CubeMX
Categories=Development;
Comment=STM32CubeMX
MimeType=application/x-STM32CubeMX-ioc;# pkg install gcc-arm-embedded cmake ninja openocd stlink# cd /usr/ports/devel/gcc-arm-embedded && make install clean # 嵌入式 ARM 工具链
# cd /usr/ports/devel/cmake && make install clean # 项目构建系统核心
# cd /usr/ports/devel/ninja && make install clean # 高效的构建工具
# cd /usr/ports/devel/openocd && make install clean # 通用 JTAG/SWD 调试和烧录工具
# cd /usr/ports/devel/stlink && make install clean # ST 官方 ST‑LINK 调试器的用户空间工具集# 最小 cmake 版本
cmake_minimum_required(VERSION 3.22)
# 交叉编译配置
set(CMAKE_SYSTEM_NAME Generic)
set(CMAKE_SYSTEM_PROCESSOR arm)
set(CMAKE_TRY_COMPILE_TARGET_TYPE STATIC_LIBRARY)
# FreeBSD 下 arm-none-eabi-gcc 默认安装路径
set(TOOLCHAIN_PREFIX "/usr/local/gcc-arm-embedded-14.2.rel1/bin")
set(CMAKE_C_COMPILER ${TOOLCHAIN_PREFIX}/arm-none-eabi-gcc)
set(CMAKE_ASM_COMPILER ${TOOLCHAIN_PREFIX}/arm-none-eabi-gcc)
set(CMAKE_OBJCOPY ${TOOLCHAIN_PREFIX}/arm-none-eabi-objcopy)
# 避免查找主机库/头文件
set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY)
# 项目定义
project(test LANGUAGES C ASM) # 改为实际的项目名称
# 收集源文件
file(GLOB_RECURSE HAL_SOURCES "Drivers/STM32F1xx_HAL_Driver/Src/*.c")
# 剔除所有的模板文件,这些文件不应参与编译
list(FILTER HAL_SOURCES EXCLUDE REGEX ".*_template\\.c$")
file(GLOB CORE_SOURCES "Core/Src/*.c")
set(ASM_SOURCES "startup_stm32f103xb.s") # 占位符——启动文件,必须改为实际型号对应的启动文件
# 定义编译标志
set(MCU_FLAGS "-mcpu=cortex-m3" "-mthumb" "-mfloat-abi=soft")
# 创建可执行目标
add_executable(${PROJECT_NAME}
${CORE_SOURCES}
${HAL_SOURCES}
${ASM_SOURCES}
)
# 配置目标属性 (Include, Options, Definitions)
target_include_directories(${PROJECT_NAME} PRIVATE
Core/Inc
Drivers/CMSIS/Include
Drivers/CMSIS/Device/ST/STM32F1xx/Include
Drivers/STM32F1xx_HAL_Driver/Inc
Drivers/STM32F1xx_HAL_Driver/Inc/Legacy
)
target_compile_options(${PROJECT_NAME} PRIVATE
${MCU_FLAGS}
-O2
-ffunction-sections
-fdata-sections
-Wall
)
target_compile_definitions(${PROJECT_NAME} PRIVATE
STM32F103xB # 占位符——芯片型号宏,必须改为实际型号
USE_HAL_DRIVER # 启用 HAL 驱动
)
target_link_options(${PROJECT_NAME} PRIVATE
${MCU_FLAGS}
-Wl,--gc-sections
-T${CMAKE_CURRENT_SOURCE_DIR}/STM32F103XX_FLASH.ld # 占位符——链接脚本,必须改为实际型号对应的 .ld 文件
-specs=nosys.specs
-Wl,-Map=${PROJECT_NAME}.map
)
# 生成二进制文件
add_custom_command(TARGET ${PROJECT_NAME} POST_BUILD
COMMAND ${CMAKE_OBJCOPY} -O binary $<TARGET_FILE:${PROJECT_NAME}> ${PROJECT_NAME}.bin
COMMENT "Building ${PROJECT_NAME}.bin"
)
# 烧录目标
add_custom_target(flash
COMMAND openocd -f interface/stlink.cfg -f target/stm32f1x.cfg -c "program ${PROJECT_NAME}.bin 0x08000000 verify reset exit"
DEPENDS ${PROJECT_NAME}
WORKING_DIRECTORY ${CMAKE_BINARY_DIR}
COMMENT "Flashing ${CMAKE_BINARY_DIR}/${PROJECT_NAME}.bin via OpenOCD"
)# 在项目根目录执行
# 第一次创建 build 目录
$ mkdir build && cd build
# 配置
$ cmake .. -G Ninja
# 开始编译
$ ninja# 在 build 目录下执行
ninja flash