这里讲一下如何使用vscode搭建嵌入式开发环境,选择STM32F103C8T6来进行开发,主要是因为硬件便宜而且资料也比较齐全。STM32F103C8T6是cortex-m3
1.1 准备
列出了需要的硬件和软件:
- 硬件:stm32f103c8t6,st-link烧录器
- 软件:vscode,cmake,ninja,gcc编译工具链,st-link烧录工具
1.1.1 硬件
stm32开发板可以直接在淘宝上购买最小系统板,
st-link烧录工具,
1.1.2 软件
- vscode可以在官网下载安装包,
vscode官网:Visual Studio Code - Code Editing. Redefined
- cmake是用于构建系统的生成器,可以用来生成makefile或ninja脚本,在官网下载安装包
cmake官网:Download CMake,如下图下载windows版本:
- ninja是构建工具,相当于makefile,该工具的脚本文件是由cmake生成的,
下载地址:https://github.com/ninja-build/ninja/releases/v1.12.1,如下图,下载windows版本:
- st-link烧录工具,使用开源工具,
下载地址:https://github.com/stlink-org/stlink/releases ,选择window版本,最新版本的我无法使用,之前有用过1.7.0,这里就下载了1.7.0的版本,如下图:
解压完后,进入bin目录,在该文件下右键打开终端
输入st-flash,会显示该命令的参数,
一般烧录固件用下面的命令就够了,
st-flash --reset --freq=10000 write app.bin 0x8000000
也可以添加系统环境变量中,操作方法如下图:
这里只举例了st-link,其它工具方法基本上一样。添加环境变量的好处是在任意目录下打开终端都是执行该工具的命令。
- gcc编译工具链,stm32f103c8t6是基于cortex-M3内核的32位芯片,所以编译代码就需要arm的交叉编译工具链。
下载地址:https://developer.arm.com/downloads/-/arm-gnu-toolchain-downloads,我需要在windows下搭建环境,下载的是windows、32位、非linux的版本,带none就是非linux的,如下图,下载压缩包:
解压后直接放入指定路径即可,bin文件夹下就是编译工具链的集合,
上述工具不建议将gcc添加到环境变量,讲一下我为什么不添加到系统变量中,因为我电脑上有不同版本的gcc,之前比较老的项目用的是2016的版本,一般项目稳定的情况下最好不要更新工具链的版本,所有在你把2016和2024版本的gcc都加入到环境变量中,当你使用的时候就不好区分版本。我的解决办法是在配置项目时,添加一个临时的环境变量,这样就可以指定到你想用的一个版本。
1.1.3 文档
stm32编程手册,可以在官网找到英文版的,不过stm32的开发生态不错,中文版的也可以在其它论坛找到。
官网:https://www.st.com.cn/content/st_com/zh.html,点击开发者社区,选择开发者资源,在该页面下找到技术文档一栏,如下图:
需要的数据手册都可以在下面找到,
我在STM32 MCU中下载了文档,
1.2 编写代码
先来一个比较经典的图,该图基本上描述了代码编译的过程,先对该图了解下,对后续构建环境有所帮助。
如下是文件结构:
1.2.1 CMake编写
不懂CMake的还是要简单了解下基本知识,网上讲的也比较详细,这里就不细讲了。先看下顶层的CMakeList.txt的内容,如下:
cmake_minimum_required(VERSION 3.24.1 FATAL_ERROR)
# 设置编译工具链的路径
set(COMPILER_PATH "${CMAKE_SOURCE_DIR}/../tool/arm-gnu-toolchain-13.3.rel1-mingw-w64-i686-arm-none-eabi/bin")
# 这是必须要设置的变量,嵌入式就设置Generic
set(CMAKE_SYSTEM_NAME Generic)
set(CMAKE_SYSTEM_PROCESSOR cortex-m3)
# 设置临时环境变量,设置环境变量的最前面,这样查找时就会先找该命令。
# 环境变量设置区分windows和Linux下的符号
if("${CMAKE_HOST_SYSTEM_NAME}" STREQUAL "Windows")
set(env_list_delimeter ";")
else()
set(env_list_delimeter ":")
endif()
set(ENV{PATH} "${COMPILER_PATH}${env_list_delimeter}$ENV{PATH}")
# 用于查找命令,并将其路径存储在变量中,命令在系统环境变量中查找
find_program(CMAKE_C_COMPILER arm-none-eabi-gcc)
# 这条命令用来执行gcc,得到版本号
execute_process(
COMMAND ${CMAKE_C_COMPILER} --version
)
# 把编译链工具里的所有命令都找出来
find_program(CMAKE_OBJCOPY arm-none-eabi-objcopy)
find_program(CMAKE_OBJDUMP arm-none-eabi-objdump)
find_program(CMAKE_AS arm-none-eabi-as )
find_progra