Skip to content

Latest commit

 

History

History
429 lines (325 loc) · 14.4 KB

Guide1.md

File metadata and controls

429 lines (325 loc) · 14.4 KB

自己搭工具链

VSCode + STM32CubeMX + STM32CubeCLT (推荐,稳定能用)

安装VSCode
安装插件 STM32 VS Code Extension

安装插件 CMake Tools

安装插件 C/C++ Extension Pack

安装stm32cubemx
安装stm32cubeclt
安装过程最好不要修改路径,或者改成你知道的路径

  1. 使用CubeMX创建工程,然后选择生成Cmake工程

  2. 在VSCode左侧导入cmake工程

到此Build和Debug就都可用了

VS + STM32CubeMX + STM32CubeCLT (不推荐,可尝鲜)

首先下载VS,安装C/C++与嵌入式支持

安装stm32cubeclt,安装过程不要修改路径

打开命令行输入

iex (iwr -useb https://aka.ms/vcpkg-init.ps1)

使用STM32CubeMX创建工程,选择STM32CubeIDE工程导出,使用VS打开

VSCode Cmake Ninja GCC Stm32CubeMX Debug (不推荐,已过时)

首先安装cmakegccninjaMinGWopenocd

VSCodeStm32CubeMX

VSCode与Stm32CubeMX的初始化有大量教程,这里不再说明

只用展开文件,然后添加进运行环境

在控制台输入测试

如果都能找到说明正常

安装VScode扩展

Cortex-Debug需要安装对应芯片的扩展包,我用的是H7所以安装H7的扩展包

语法高亮可以自行选择

使用Stm32CubeMX生成一个项目

这里演示使用STM32H743并启用了rtos和fatfs

代码生成选项

生成代码之后的文件夹

使用VSCode打开此文件夹,新建一个CMakeLists.txt 内容大致为

set(CMAKE_SYSTEM_NAME Generic)
set(CMAKE_SYSTEM_VERSION 1)
cmake_minimum_required(VERSION 3.18)

# specify cross-compilers and tools
set(CMAKE_C_COMPILER arm-none-eabi-gcc)
set(CMAKE_CXX_COMPILER arm-none-eabi-g++)
set(CMAKE_ASM_COMPILER  arm-none-eabi-gcc)
set(CMAKE_AR arm-none-eabi-ar)
set(CMAKE_OBJCOPY arm-none-eabi-objcopy)
set(CMAKE_OBJDUMP arm-none-eabi-objdump)
set(SIZE arm-none-eabi-size)
set(CMAKE_TRY_COMPILE_TARGET_TYPE STATIC_LIBRARY)

# project settings
project(//TODO C CXX ASM)
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_C_STANDARD 11)

#Uncomment for hardware floating point
#add_compile_definitions(ARM_MATH_CM4;ARM_MATH_MATRIX_CHECK;ARM_MATH_ROUNDING)
#add_compile_options(-mfloat-abi=hard -mfpu=fpv4-sp-d16)
#add_link_options(-mfloat-abi=hard -mfpu=fpv4-sp-d16)

#Uncomment for software floating point
#add_compile_options(-mfloat-abi=soft)

add_compile_options(-mcpu=cortex-m4 -mthumb -mthumb-interwork)
add_compile_options(-ffunction-sections -fdata-sections -fno-common -fmessage-length=0)

# uncomment to mitigate c++17 absolute addresses warnings
#set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-register")

# Enable assembler files preprocessing
add_compile_options($<$<COMPILE_LANGUAGE:ASM>:-x$<SEMICOLON>assembler-with-cpp>)

if ("${CMAKE_BUILD_TYPE}" STREQUAL "Release")
    message(STATUS "Maximum optimization for speed")
    add_compile_options(-Ofast)
elseif ("${CMAKE_BUILD_TYPE}" STREQUAL "RelWithDebInfo")
    message(STATUS "Maximum optimization for speed, debug info included")
    add_compile_options(-Ofast -g)
elseif ("${CMAKE_BUILD_TYPE}" STREQUAL "MinSizeRel")
    message(STATUS "Maximum optimization for size")
    add_compile_options(-Os)
else ()
    message(STATUS "Minimal optimization, debug info included")
    add_compile_options(-Og -g)
endif ()

include_directories(
    //TODO
)

add_definitions(
    //TODO
)

file(GLOB_RECURSE SOURCES
    //TODO
)

set(LINKER_SCRIPT ${CMAKE_SOURCE_DIR}/
    //TODO
.ld)

add_link_options(-Wl,-gc-sections,--print-memory-usage,-Map=${PROJECT_BINARY_DIR}/${PROJECT_NAME}.map)
add_link_options(-mcpu=cortex-m4 -mthumb -mthumb-interwork)
add_link_options(-T ${LINKER_SCRIPT})

add_executable(${PROJECT_NAME}.elf ${SOURCES} ${LINKER_SCRIPT})

set(HEX_FILE ${PROJECT_BINARY_DIR}/${PROJECT_NAME}.hex)
set(BIN_FILE ${PROJECT_BINARY_DIR}/${PROJECT_NAME}.bin)

add_custom_command(TARGET ${PROJECT_NAME}.elf POST_BUILD
        COMMAND ${CMAKE_OBJCOPY} -Oihex $<TARGET_FILE:${PROJECT_NAME}.elf> ${HEX_FILE}
        COMMAND ${CMAKE_OBJCOPY} -Obinary $<TARGET_FILE:${PROJECT_NAME}.elf> ${BIN_FILE}
        COMMENT "Building ${HEX_FILE}
Building ${BIN_FILE}")

然后打开.cproject
对照修改CMakeLists.txt

  1. 项目名字
project(//TODO C CXX ASM)

中的//TODO修改为项目名字,例如

project(mcu1 C CXX ASM)
  1. 浮点处理器(不需要的可以跳过)
#Uncomment for hardware floating point
#add_compile_definitions(ARM_MATH_CM4;ARM_MATH_MATRIX_CHECK;ARM_MATH_ROUNDING)
#add_compile_options(-mfloat-abi=hard -mfpu=fpv4-sp-d16)
#add_link_options(-mfloat-abi=hard -mfpu=fpv4-sp-d16)

#Uncomment for software floating point
#add_compile_options(-mfloat-abi=soft)

如果使用软件浮点

#Uncomment for hardware floating point
#add_compile_definitions(ARM_MATH_CM4;ARM_MATH_MATRIX_CHECK;ARM_MATH_ROUNDING)
#add_compile_options(-mfloat-abi=hard -mfpu=fpv4-sp-d16)
#add_link_options(-mfloat-abi=hard -mfpu=fpv4-sp-d16)

#Uncomment for software floating point
add_compile_options(-mfloat-abi=soft)

如果使用硬件浮点

#Uncomment for hardware floating point
add_compile_definitions(ARM_MATH_CM4;ARM_MATH_MATRIX_CHECK;ARM_MATH_ROUNDING)
add_compile_options(-mfloat-abi=hard -mfpu=fpv4-sp-d16)
add_link_options(-mfloat-abi=hard -mfpu=fpv4-sp-d16)

#Uncomment for software floating point
#add_compile_options(-mfloat-abi=soft)
  1. CPU内核
add_compile_options(-mcpu=cortex-m4 -mthumb -mthumb-interwork)
add_compile_options(-ffunction-sections -fdata-sections -fno-common -fmessage-length=0)

...

add_link_options(-Wl,-gc-sections,--print-memory-usage,-Map=${PROJECT_BINARY_DIR}/${PROJECT_NAME}.map)
add_link_options(-mcpu=cortex-m4 -mthumb -mthumb-interwork)
add_link_options(-T ${LINKER_SCRIPT})

其中的-mcpu=要修改为你的单片机内核

  • H7:cortex-m7
  • F4:cortex-m4
  • F1:cortex-m3
  1. 全局定义
add_definitions(
    //TODO
)

.cproject中查找definedSymbols

其中的value就是要添加的东西
修改后为(要记得前面加上-D)

add_definitions(-DDEBUG -DUSE_FULL_LL_DRIVER -DUSE_HAL_DRIVER -DSTM32H743xx)
  1. 代码文件
file(GLOB_RECURSE SOURCES
    //TODO
)

.cproject中查找sourceEntries

其中的Name就是要添加的东西
修改后为

file(GLOB_RECURSE SOURCES "Core/*.*" "FATFS/*.*" "Middlewares/*.*" "Drivers/*.*")
  1. 头文件路径
include_directories(
    //TODO
)

.cproject中查找includePath

其中的Value就是要添加的东西
修改后为(前面的../去掉)

include_directories(Core/Inc FATFS/Target FATFS/App Drivers/STM32H7xx_HAL_Driver/Inc Drivers/STM32H7xx_HAL_Driver/Inc/Legacy Middlewares/Third_Party/FreeRTOS/Source/include Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS_V2 Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM4F Middlewares/Third_Party/FatFs/src Drivers/CMSIS/Device/ST/STM32H7xx/Include Drivers/CMSIS/Include)
  1. LD文件
set(LINKER_SCRIPT ${CMAKE_SOURCE_DIR}/
    //TODO
.ld)

在根目录下有两个.ld文件,选择FLASH的那个

set(LINKER_SCRIPT ${CMAKE_SOURCE_DIR}/STM32H743VITx_FLASH.ld)

修改完成后的CMakeLists.txt

set(CMAKE_SYSTEM_NAME Generic)
set(CMAKE_SYSTEM_VERSION 1)
cmake_minimum_required(VERSION 3.18)

# specify cross-compilers and tools
set(CMAKE_C_COMPILER arm-none-eabi-gcc)
set(CMAKE_CXX_COMPILER arm-none-eabi-g++)
set(CMAKE_ASM_COMPILER  arm-none-eabi-gcc)
set(CMAKE_AR arm-none-eabi-ar)
set(CMAKE_OBJCOPY arm-none-eabi-objcopy)
set(CMAKE_OBJDUMP arm-none-eabi-objdump)
set(SIZE arm-none-eabi-size)
set(CMAKE_TRY_COMPILE_TARGET_TYPE STATIC_LIBRARY)

# project settings
project(mcu_test1 C CXX ASM)
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_C_STANDARD 11)

#Uncomment for hardware floating point
add_compile_definitions(ARM_MATH_CM4;ARM_MATH_MATRIX_CHECK;ARM_MATH_ROUNDING)
add_compile_options(-mfloat-abi=hard -mfpu=fpv4-sp-d16)
add_link_options(-mfloat-abi=hard -mfpu=fpv4-sp-d16)

#Uncomment for software floating point
#add_compile_options(-mfloat-abi=soft)

add_compile_options(-mcpu=cortex-m7 -mthumb -mthumb-interwork)
add_compile_options(-ffunction-sections -fdata-sections -fno-common -fmessage-length=0)

# uncomment to mitigate c++17 absolute addresses warnings
#set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-register")

# Enable assembler files preprocessing
add_compile_options($<$<COMPILE_LANGUAGE:ASM>:-x$<SEMICOLON>assembler-with-cpp>)

if ("${CMAKE_BUILD_TYPE}" STREQUAL "Release")
    message(STATUS "Maximum optimization for speed")
    add_compile_options(-Ofast)
elseif ("${CMAKE_BUILD_TYPE}" STREQUAL "RelWithDebInfo")
    message(STATUS "Maximum optimization for speed, debug info included")
    add_compile_options(-Ofast -g)
elseif ("${CMAKE_BUILD_TYPE}" STREQUAL "MinSizeRel")
    message(STATUS "Maximum optimization for size")
    add_compile_options(-Os)
else ()
    message(STATUS "Minimal optimization, debug info included")
    add_compile_options(-Og -g)
endif ()

include_directories(Core/Inc FATFS/Target FATFS/App Drivers/STM32H7xx_HAL_Driver/Inc Drivers/STM32H7xx_HAL_Driver/Inc/Legacy Middlewares/Third_Party/FreeRTOS/Source/include Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS_V2 Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM4F Middlewares/Third_Party/FatFs/src Drivers/CMSIS/Device/ST/STM32H7xx/Include Drivers/CMSIS/Include)

add_definitions(-DDEBUG -DUSE_FULL_LL_DRIVER -DUSE_HAL_DRIVER -DSTM32H743xx)

file(GLOB_RECURSE SOURCES "Core/*.*" "FATFS/*.*" "Middlewares/*.*" "Drivers/*.*")

set(LINKER_SCRIPT ${CMAKE_SOURCE_DIR}/STM32H743VITx_FLASH.ld)

add_link_options(-Wl,-gc-sections,--print-memory-usage,-Map=${PROJECT_BINARY_DIR}/${PROJECT_NAME}.map)
add_link_options(-mcpu=cortex-m7 -mthumb -mthumb-interwork)
add_link_options(-T ${LINKER_SCRIPT})

add_executable(${PROJECT_NAME}.elf ${SOURCES} ${LINKER_SCRIPT})

set(HEX_FILE ${PROJECT_BINARY_DIR}/${PROJECT_NAME}.hex)
set(BIN_FILE ${PROJECT_BINARY_DIR}/${PROJECT_NAME}.bin)

add_custom_command(TARGET ${PROJECT_NAME}.elf POST_BUILD
        COMMAND ${CMAKE_OBJCOPY} -Oihex $<TARGET_FILE:${PROJECT_NAME}.elf> ${HEX_FILE}
        COMMAND ${CMAKE_OBJCOPY} -Obinary $<TARGET_FILE:${PROJECT_NAME}.elf> ${BIN_FILE}
        COMMENT "Building ${HEX_FILE}
Building ${BIN_FILE}")

点击VSCode的左下角Cmake,或者重新打开VSCode
选择Gcc工具链

GCC 10.3.1 arm-none-eabi

CMake会自动加载,出现这步则加载完成

点击build编译
正常来说会使用ninja来编译并链接

工程创建和构建到此完成,下面是调试

打开VSCode的调试界面,点击创建 launch.json文件
选择C++ GBD

点击显示所有自动调试配置->添加配置

找到cortex-debug

选择你的调试器类型

修改executable.elf路径

"executable": "./build/mcu_test1.elf",

按下F5就能debug了

集成开发工具

Keil (不推荐,付费)

官网下载,安装后即可使用

接下来还需要安装不同的单片机软件包

STM32CubeIDE (新手推荐,后期乏力)

https://www.st.com/zh/development-tools/stm32cubeide.html

Keil一样,这个也是直接安装就能用的,新建工程选择单片机和就能进行编写代码,需要安装芯片包

VSCode + PlatformIO IDE (新手推荐,后期乏力)

安装完Vscode后还需要装插件PlatformIO IDE

安装完成后打开PIO主页,新建或者使用例程

Clion + STM32CubeMX (有钱人推荐)

使用Clion开发还需要下载安装STM32CubeMXmingw64arm-none-eabi

所有都安装完成后,添加mingw64arm-none-eabibin环境变量path

打开Clion新建STM32CubeMX工程即可开始

设置Clion的工具链
设置C编译器为安装路径\bin\arm-none-eabi-gcc.exe
设置C++编译器为安装路径\bin\arm-none-eabi-g++.exe
调试器为安装路径\bin\arm-none-eabi-gdb.exe

在线调试

只有调试工具才能进行在线调试
例如ST-LinkJ-Link

如果你用Keil或者Stm32CubeIDE,调试只需要安装驱动即可,如果你使用VScodeClion需要安装openocd