Skip to content

kuanghl/stm32-gcc-cmake

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

8 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

stm32-gcc-cmake

ubuntu上使用gcc + cmake + gcc_arm_none_eabi编译STM32项目的示例项目。

可以使用LL HAL库。

依赖

# vscode插件
Cortex-Debug
C/C++
C/C++ Extension Pack
CMake
CMake Tools

# # 编译器和烧录软件
# # sudo apt install gdb-multiarch
# # ln -s /usr/bin/gdb-multiarch /usr/bin/arm-none-eabi-gdb 
sudo apt install gcc-arm-none-eabi # https://developer.arm.com/tools-and-software/open-source-software/developer-tools/gnu-toolchain
sudo apt install openocd
# arm-none-eabi-gcc --version
# arm-none-eabi-g++ --version
# arm-none-eabi-gdb --version
# arm-none-eabi-size --version

# xpm compile
# node更新
node -v
sudo npm install n -g
sudo n stable
hash -r
rehash
npm install --global xpm@latest
xpm init
xpm install @xpack-dev-tools/arm-none-eabi-gcc@latest --verbose
ls -l xpacks/.bin

# repo
https://github.com/ObKo/stm32-cmake.git
https://github.com/STMicroelectronics/STM32CubeF1.git

# 使用版本分支commit id
STM32CubeF1 : c750eab6990cac35ab05020793b0221ecc1a8ce5
stm32-cmake : 6a0d25571178c89b75c46c831e54fe279600353d

# !!! STM32CubeF1 STM32CubeFxx后续版本需要处理子模块
git clone --recursive https://github.com/STMicroelectronics/STM32CubeF1.git

使用说明

构建

# case 1 直接使用
git clone --recursive git@github.com:kuanghl/stm32-gcc-cmake.git
cd stm32-gcc-cmake
make

# case 2 自构建
mkdir stm32-demo && cd stm32-demo
git clone https://github.com/ObKo/stm32-cmake.git
cd stm32-cmake && git checkout -b old 6a0d25571178c89b75c46c831e54fe279600353d
git clone https://github.com/STMicroelectronics/STM32CubeF1.git
cd STM32CubeF1 && git checkout -b old c750eab6990cac35ab05020793b0221ecc1a8ce5
# todo... 编写CMakeLists.txt Makefile
mkdir build && cd build && cmake .. && make -j8

烧录

git clone --recursive git@github.com:openocd-org/openocd.git
cd openocd
./bootstrap
./configure -help
./configure --enable-jlink
make -j8
sudo make install

# stlink-v2.cfg对应烧录器,支持的烧录器在/usr/share/openocd/scripts/interface
# stm32f4x.cfg对应MCU,支持的芯片在/usr/share/openocd/scripts/target
openocd -f interface/stlink-v2.cfg -f target/stm32f4x.cfg  # 链接到MCU
telnet localhost 4444 # 通过telnet连接openocd
program ./test01.hex  # 烧录hex文件
reset                 # 复位STM32
exit                  # 关闭连接

# 单独烧录指令
openocd -f interface/jlink_swd.cfg -f target/stm32f4x.cfg -c init -c halt -c \
	"program ./build/test01.hex" -c reset -c shutdown

Overview

目录结构

本节介绍示例项目目录结构。

.                   # 根目录
├── .clang-format   # 配合编辑器或集成开发环境自动格式化 c/c++ 源文件
├── .git            # 表示为项目目录创建了一个 git 仓库
│   └── ...         #
├── .gitignore      # 指定 git 仓库的排除路径,主要是 `build/`
├── CMakeLists.txt  # 指定项目编译方式
├── src             # 源文件放在这个目录下
│   ├── library.h   #
│   ├── library.c   #
│   └── main.c      #
├── Makefile        # 简化编译指令
├── README.md       # 项目说明文件
├── STM32CubeF1     # 子模块。提供 cmake 模板,供 CMakeLists.txt 使用
│   └── ...         #
├── build           # 构建目录,从 git 排除
│   └── ...         #
└── stm32-cmake     # 子模块([产品页](https://www.st.com/zh/embedded-software/stm32cubef1.html))。STM32F1 产品系列的软件包,在 CMakeLists.txt 中引用
    └── ...         #

配置文件示例

本节介绍示例项目配置文件。按文件名字典顺序排序。

  • .clang-format

    为编辑器或集成开发环境提供 c/c++ 源文件格式化规则。此项目包含在项目中有助于项目编码风格的一致性。

    本文件通过 clion 生成。详细配置项参见 .clang-format 文档

    示例:略。

  • .gitignore

    示例:

    build/          # cmake 常用的命令行构建路径
    cmake-build-**/ # clion 默认的 cmake 构建路径
    
    .*/             # 常见 ide/editor 创建的配置文件路径,排除这类路径使项目对开发工具中立
  • CMakeLists.txt

    cmake 项目配置。

    示例和说明:

cmake_minimum_required(VERSION 3.16) # 判定 cmake 版本符合要求stm32-cmake 模块本身要求至少 3.16

set(CMAKE_TOOLCHAIN_FILE ${CMAKE_CURRENT_SOURCE_DIR}/stm32-cmake/cmake/stm32_gcc.cmake)  # 引用 stm32-cmake

project(stm32_test CXX C ASM)        # 设定项目名字和支持语言
set(CMAKE_CXX_STANDARD 20)           # 设定语法级别
set(CMAKE_CXX_STANDARD_REQUIRED ON)  # C++标准包
set(CMAKE_INCLUDE_CURRENT_DIR TRUE)  # 引用根目录

set(STM32_CUBE_F1_PATH ${CMAKE_CURRENT_SOURCE_DIR}/STM32CubeF1) # 查找 STMCubeF1 
find_package(CMSIS COMPONENTS STM32F1 REQUIRED)                 # 逐设备引用 CMSIS
find_package(HAL COMPONENTS STM32F1 RCC GPIO CORTEX LL_RCC LL_GPIO REQUIRED) # 逐模块引用 HAL


include_directories(${CMAKE_CURRENT_SOURCE_DIR}/src)                       # 暴露stm32f1xx_hal_conf.h
add_executable(stm32_test_app ${CMAKE_CURRENT_SOURCE_DIR}/src/main.c)      # 一个构建目标,默认生成.elf 

target_link_libraries(stm32_test_app #  CMSISLLHAL 链接到库
    HAL::STM32::F1::RCC          # HAL库
    HAL::STM32::F1::GPIO         # HAL库
    HAL::STM32::F1::CORTEX       # HAL库   
    HAL::STM32::F1::LL_RCC       # LL库
    HAL::STM32::F1::LL_GPIO      # LLCMSIS::STM32::F103C8         # 对于同时适用多种芯片的库不用在这里链接芯片相关库
    STM32::NoSys)                #

add_library(stm32_test STATIC                                # 构建一个静态库静态库只需要构建一次可以在多个目标之间复用
    ${CMAKE_CURRENT_SOURCE_DIR}/src/library.h                # 库的头文件头文件不需要编译但写在这里 VSCode + CMake 插件才会为其提供正确的高亮和跳转
    ${CMAKE_CURRENT_SOURCE_DIR}/src/library.c)               # 库的源文件支持 c 

target_link_libraries(stm32_test_app stm32_test) # 链接库

stm32_print_size_of_target(stm32_test_app)       # 打印目标文件容量
stm32_generate_binary_file(stm32_test_app)  # 生成.bin
stm32_generate_hex_file(stm32_test_app)     # 生成.hex
stm32_generate_srec_file(stm32_test_app)    # 生成.srec
  • Makefile

    简化使用 cmake 构建项目的步骤。

    注意:不要从 markdown 文件中拷贝 Makefile。Makefile 文件要求脚本指令前使用 tab,markdown 中为规范格式已替换为空格。

    示例和说明:

    .PHONY : build # 按 release 构建
    build:
        mkdir -p build/release
        cd build/release \
        && cmake -DCMAKE_BUILD_TYPE=Release \
           ../.. \
        && make -j2
    
    .PHONY : build-debug # 按 debug 构建
    debug:
        mkdir -p build/debug
        cd build/debug \
        && cmake -DCMAKE_BUILD_TYPE=Debug \
           ../.. \
        && make -j2
    
    .PHONY : clean # 删除构建目录
    clean:
        rm -rf build

About

stm32-cmake gcc-arm-none-eabi STM32Cube

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published