├── .gitignore ├── files ├── .clang-format ├── .gitignore ├── .vscode │ ├── launch.json │ ├── settings.json │ └── tasks.json └── openocd.cfg ├── how_it_works.md ├── how_to_install.md ├── how_to_use.md ├── imgs ├── add_openocd_path.png ├── check_clt.png ├── check_openocd.png ├── cmakelists.png ├── copy_openocd_path.png ├── cubemx_install.png ├── cubemx_login.png ├── cubemx_stm32f4.png ├── download_git.png ├── drag_files.png ├── edit_temp.png ├── extensions.png ├── extract_openocd.png ├── install_cmake_ext.png ├── install_cortex_ext.png ├── install_cpp_ext.png ├── install_vscode.png ├── mkdir_temp.png ├── open_env_var_edit.png ├── open_extension.png ├── open_keyboard_json.png ├── open_powershell.png ├── open_with_code.png ├── select_cmake.png ├── select_debug.png ├── select_preset.png ├── toolchain_and_workflow.png ├── toolchian_table.png └── workflow.png └── readme.md /.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | Thumbs.db -------------------------------------------------------------------------------- /files/.clang-format: -------------------------------------------------------------------------------- 1 | # ref: https://github.com/ament/ament_lint/blob/rolling/ament_clang_format/ament_clang_format/configuration/.clang-format 2 | --- 3 | Language: Cpp 4 | BasedOnStyle: Google 5 | 6 | AccessModifierOffset: -2 7 | AlignAfterOpenBracket: AlwaysBreak 8 | BraceWrapping: 9 | AfterClass: true 10 | AfterFunction: true 11 | AfterNamespace: true 12 | AfterStruct: true 13 | AfterEnum: true 14 | BeforeElse: true 15 | BreakBeforeBraces: Custom 16 | ColumnLimit: 100 17 | ConstructorInitializerIndentWidth: 0 18 | ContinuationIndentWidth: 2 19 | DerivePointerAlignment: false 20 | PointerAlignment: Middle 21 | ReflowComments: false 22 | ... -------------------------------------------------------------------------------- /files/.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | Thumbs.db 3 | build/ -------------------------------------------------------------------------------- /files/.vscode/launch.json: -------------------------------------------------------------------------------- 1 | { 2 | "version": "0.2.0", 3 | "configurations": [ 4 | { 5 | "name": "OpenOCD: Debug", 6 | "cwd": "${workspaceFolder}", 7 | "executable": "${command:cmake.getLaunchTargetPath}", 8 | "request": "launch", 9 | "type": "cortex-debug", 10 | "servertype": "openocd", 11 | "configFiles": [ 12 | "openocd.cfg", 13 | ], 14 | "liveWatch": { 15 | "enabled": true, 16 | "samplesPerSecond": 20 17 | }, 18 | "preLaunchTask": "CMake: build" 19 | } 20 | ] 21 | } -------------------------------------------------------------------------------- /files/.vscode/settings.json: -------------------------------------------------------------------------------- 1 | { 2 | "files.associations": { 3 | "*.h": "c" 4 | }, 5 | "editor.formatOnSave": true, 6 | "[c]": { 7 | "editor.formatOnSave": false, 8 | }, 9 | "cortex-debug.variableUseNaturalFormat": true, 10 | "cmake.configureOnOpen": true, 11 | "cmake.options.advanced": { 12 | "configurePreset": { 13 | "statusBarVisibility": "visible", 14 | }, 15 | "build": { 16 | "statusBarVisibility": "hidden", 17 | }, 18 | "launch": { 19 | "statusBarVisibility": "hidden", 20 | }, 21 | "debug": { 22 | "statusBarVisibility": "hidden", 23 | }, 24 | }, 25 | } -------------------------------------------------------------------------------- /files/.vscode/tasks.json: -------------------------------------------------------------------------------- 1 | { 2 | "version": "2.0.0", 3 | "tasks": [ 4 | { 5 | "type": "shell", 6 | "label": "OpenOCD: flash", 7 | "command": "openocd", 8 | "options": { 9 | "cwd": "${command:cmake.getLaunchTargetDirectory}" 10 | }, 11 | "args": [ 12 | "-f", 13 | "../../openocd.cfg", 14 | "-c", 15 | "program ${command:cmake.getLaunchTargetFilename} verify reset exit" 16 | ], 17 | "group": { 18 | "kind": "build", 19 | "isDefault": true 20 | }, 21 | "dependsOn": "CMake: build", 22 | "detail": "Download program into STM32" 23 | }, 24 | { 25 | "type": "cmake", 26 | "label": "CMake: build", 27 | "command": "build", 28 | "targets": [ 29 | "all" 30 | ], 31 | "preset": "${command:cmake.activeBuildPresetName}", 32 | "group": "build", 33 | "problemMatcher": [], 34 | "detail": "CMake template build task" 35 | } 36 | ] 37 | } -------------------------------------------------------------------------------- /files/openocd.cfg: -------------------------------------------------------------------------------- 1 | # ---------- 选择烧录器 ---------- 2 | # source [find interface/stlink.cfg] 3 | source [find interface/cmsis-dap.cfg] 4 | 5 | # ---------- 选择芯片型号 ---------- 6 | source [find target/stm32f4x.cfg] 7 | # source [find target/stm32H7x.cfg] -------------------------------------------------------------------------------- /how_it_works.md: -------------------------------------------------------------------------------- 1 | ## 引言 2 | 各个软件傻傻分不清?各种软件操作记不住?本文希望通过介绍「工作流」和「工具链」,帮助大家更好地理解、记忆、使用本开发环境所涉及到的软件。 3 | 4 | ## 工作流 5 | 电控组的工作可以分为两大类:硬件(走线、焊线、接线)和软件,前者本文并不涉及。软件相关的工作可以拆解为如下图所示的多个环节, 其中黑底白字的环节是「嵌入式开发」独有的环节。 6 | ![](imgs/workflow.png) 7 | 8 | 举一个具体的例子,比如说你负责「麦轮底盘移动」功能的开发,上述流程可以具体为: 9 | 1. 明确功能:遥控器的输入被C板接收,C板进行速度解算,发送控制命令到电机,电机旋转使底盘移动 10 | 2. 配置芯片: 11 | 1. 芯片的基本配置:配置时钟树、指定烧录引脚、添加freeRTOS的task等等 12 | 2. 遥控器通信需要配置串口(UART),包括波特率、中断、DMA等等 13 | 3. 电机控制需要配置CAN,包括CAN的传输速率、中断等等 14 | 3. 敲代码: 15 | 1. 如何解析遥控器的数据? 16 | 2. 如何将底盘的速度解算成轮子电机的速度? 17 | 3. 如何发送电机的数据? 18 | 4. 编译:把敲好的代码编译成二进制文件 19 | 5. 烧录:把编译好的二进制文件下载到C板中 20 | 6. 调试:是否需要断点调试?底盘能否按照预期移动?移动速度能否更快? 21 | 7. 交付:代码版本管理 22 | 23 | ## 工具链 24 | 各环节对应的软件如下表所示,可以看出新工具链比旧工具链涉及更多的软件,更复杂,但这是值得的。 25 | ![](imgs/toolchian_table.png) 26 | 27 | 新工具链的各个软件在「工作流」上所处的位置如下图所示: 28 | ![](imgs/toolchain_and_workflow.png) 29 | 30 | 可以看出,VSCode是我们工作流的核心工具。然而,VSCode的本职工作只是「代码编辑器」,为了让它完成编译、烧录等工作,我们需要对应的「插件」和「配置文件」,从而使它和底层软件(见上表)对接。 31 | 32 | 这就是为什么我们每次都需要把[这4个文件](files/)拖到「项目文件夹」中: 33 | 1. `.vscode/`: 34 | 1. `launch.json`:配置了「断点调试」 35 | 2. `settings.json`:可自行逐行Google 36 | 3. `tasks.json`:配置了「编译」以及「烧录」 37 | 2. `.clang-format`:代码风格和命名规范 38 | 3. `.gitignore`:可自行Google该文件名 39 | 4. `openocd.cfg`:用于配置芯片型号和烧录器种类 40 | 41 | VSCode执行「编译」「烧录」「调试」的快捷键见[使用说明](how_to_use.md)。 42 | 43 | ## Visual Studio Code 44 | 如果你从未使用过VSCode,下面的内容可能可以帮你更好地使用它: 45 | 1. VSCode有两种模式:打开文件和打开文件夹。前一种模式下,VSCode只是一个「文本编辑器」(类比Word),它有很多功能/快捷键来提高输入效率,如「多光标输入」「文本替换」等等;而后一种模式,VSCode可以读取到该文件夹下面的所有文件,这使得「全局搜索」「代码补全」「插件加载」等高级功能成为可能。 46 | 2. VSCode有丰富的自定义选项:一般通过读取文件夹中的`.vscode`文件夹内的各种后缀为`.json`的文件来进行设置。 47 | 3. VSCode有许多第三方扩展/插件来增强其功能,我们使用了C++插件、CMake插件、Cortex-Debug插件以及它们所依赖的种种插件。 48 | 4. VSCode有一个重要的入口,称为「命令面板」(Command Palette),可以使用`ctrl+shift+p`快捷键来打开,里面可以输入各种命令,例如输入`format document`来格式化代码从而使代码更加整齐。[使用说明](how_to_use.md)中的第5步就利用了这个入口来执行CMake插件。 -------------------------------------------------------------------------------- /how_to_install.md: -------------------------------------------------------------------------------- 1 | ## 1 安装 STM32CubeMX 2 | 1. 创建ST帐户(后续多个步骤需要):https://www.st.com.cn/content/st_com/zh/user-registration.html 3 | 2. 下载安装包(版本>=6.11):https://www.st.com.cn/zh/development-tools/stm32cubemx.html 4 | 3. 安装:按照推荐/默认选项一步一步往下走即可。 5 | 4. 启动后登录ST帐户,如果提示`This feature requires internet connection...`,重新打开软件即可。 6 | ![](imgs/cubemx_login.png) 7 | 5. 选择INSTALL/REMOVE,如果提示`The Updater is already in use and checking the server.`耐心等待即可。 8 | ![](imgs/cubemx_install.png) 9 | 6. 勾选STM32F4,点击Install,如果使用达妙H7开发板,还需勾选STM32H7。 10 | ![](imgs/cubemx_stm32f4.png) 11 | 12 | ## 2 安装 STM32CubeCLT 13 | 1. 下载安装包(版本>=1.15):https://www.st.com.cn/zh/development-tools/stm32cubeclt.html 14 | 2. 安装:按照推荐/默认选项一步一步往下走即可。 15 | - 如果遇到`Error launching installer`,请将安装程序移动到不包含中文的路径下。 16 | - 如果遇到`Error! Can't initialize plug-ins directory. Please try again later.`: 17 | 1. 在C盘根目录下新建Temp文件夹 18 | ![](imgs/mkdir_temp.png) 19 | 2. 打开环境变量 20 | ![](imgs/open_env_var_edit.png) 21 | 3. 按照下图步骤分别将`TMP`和`TEMP`中的内容修改为`C:\Temp`,注意`TMP`和`TEMP`都要修改 22 | ![](imgs/edit_temp.png) 23 | 24 | 3. 检查安装是否成功: 25 | 1. 打开powershell 26 | ![](imgs/open_powershell.png) 27 | 2. 依次输入下面三行命令(注意空格),如果输出和下图一致则安装成功。 28 | ``` 29 | cmake --version 30 | ninja --version 31 | arm-none-eabi-gcc --version 32 | ``` 33 | ![](imgs/check_clt.png) 34 | 35 | ## 3 安装 Visual Studio Code 36 | 1. 下载安装包(版本>=1.92):https://code.visualstudio.com 37 | 2. 安装时注意勾选这两个选项 38 | ![](imgs/install_vscode.png) 39 | 3. 启动后选择左侧插件图标打开插件面板 40 | ![](imgs/open_extension.png) 41 | 4. 安装C++插件 42 | ![](imgs/install_cpp_ext.png) 43 | 5. 安装CMake Tools插件 44 | ![](imgs/install_cmake_ext.png) 45 | 6. 安装Cortex-Debug插件 46 | ![](imgs/install_cortex_ext.png) 47 | 7. 如果插件面板和下图一致则安装成功 48 | ![](imgs/extensions.png) 49 | 50 | ## 4 安装 OpenOCD 51 | 1. 下载压缩包(版本>=20231002):https://gnutoolchains.com/arm-eabi/openocd/ 52 | 2. 解压至C盘根目录 53 | ![](imgs/extract_openocd.png) 54 | 3. 打开解压后的文件夹中的`bin`文件夹,复制其路径 55 | ![](imgs/copy_openocd_path.png) 56 | 4. 打开环境变量 57 | ![](imgs/open_env_var_edit.png) 58 | 5. 按照下图步骤添加所复制的路径 59 | ![](imgs/add_openocd_path.png) 60 | 6. 检查安装是否成功: 61 | 1. 打开powershell 62 | ![](imgs/open_powershell.png) 63 | 2. 输入`openocd --version`,如果输出和下图一致则安装成功。 64 | ![](imgs/check_openocd.png) 65 | 66 | ## 5 安装 SerialPlot 67 | 1. 下载安装包:https://serialplot.ozderya.net/downloads/serialplot-0.12.0-win32-setup.exe 68 | 2. 安装:按照推荐/默认选项一步一步往下走即可。 69 | 70 | ## 6 安装 Git 71 | 1. 下载安装包:https://git-scm.com/download/win 72 | ![](imgs/download_git.png) 73 | 2. 安装:按照推荐/默认选项一步一步往下走即可。 74 | -------------------------------------------------------------------------------- /how_to_use.md: -------------------------------------------------------------------------------- 1 | 1. 使用STM32CubeMX生成项目时,选择CMake 2 | ![](imgs/select_cmake.png) 3 | 4 | 2. 把[这4个文件](files/)拖到「项目文件夹」中 5 | ![](imgs/drag_files.png) 6 | 7 | 3. 使用Visual Studio Code打开「项目文件夹」 8 | ![](imgs/open_with_code.png) 9 | 10 | 4. 第一次打开「项目文件夹」时,选择Debug 11 | ![](imgs/select_debug.png) 12 | 13 | 5. 如果错过了第4步,使用`ctrl+shift+p`快捷键,输入`cmake: select configure preset`,即可回到第4步 14 | ![](imgs/select_preset.png) 15 | 16 | 6. `f5`调试,`f7`编译,`ctrl+shift+b`烧录 17 | 18 | 7. 在`openocd.cfg`中可以配置芯片型号和烧录器种类 19 | 20 | 8. 自己创建的源文件和头文件需要在`CMakeLists.txt`中添加 21 | ![](imgs/cmakelists.png) 22 | 23 | 9. (可选)将`f8`设置为「烧录」的快捷键 24 | 1. 使用`ctrl+shift+p`快捷键,输入`keyboard`,选择下图中的选项: 25 | ![](imgs/open_keyboard_json.png) 26 | 2. 把下面内容覆盖到该json文件中: 27 | ```json 28 | [ 29 | { 30 | "key": "f8", 31 | "command": "workbench.action.tasks.runTask", 32 | "args": "OpenOCD: flash" 33 | } 34 | ] 35 | ``` 36 | 3. 保存后生效。 37 | -------------------------------------------------------------------------------- /imgs/add_openocd_path.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TongjiSuperPower/stm32_dev_env/fcc347e5793560632612c814467f8e0accd8c613/imgs/add_openocd_path.png -------------------------------------------------------------------------------- /imgs/check_clt.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TongjiSuperPower/stm32_dev_env/fcc347e5793560632612c814467f8e0accd8c613/imgs/check_clt.png -------------------------------------------------------------------------------- /imgs/check_openocd.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TongjiSuperPower/stm32_dev_env/fcc347e5793560632612c814467f8e0accd8c613/imgs/check_openocd.png -------------------------------------------------------------------------------- /imgs/cmakelists.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TongjiSuperPower/stm32_dev_env/fcc347e5793560632612c814467f8e0accd8c613/imgs/cmakelists.png -------------------------------------------------------------------------------- /imgs/copy_openocd_path.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TongjiSuperPower/stm32_dev_env/fcc347e5793560632612c814467f8e0accd8c613/imgs/copy_openocd_path.png -------------------------------------------------------------------------------- /imgs/cubemx_install.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TongjiSuperPower/stm32_dev_env/fcc347e5793560632612c814467f8e0accd8c613/imgs/cubemx_install.png -------------------------------------------------------------------------------- /imgs/cubemx_login.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TongjiSuperPower/stm32_dev_env/fcc347e5793560632612c814467f8e0accd8c613/imgs/cubemx_login.png -------------------------------------------------------------------------------- /imgs/cubemx_stm32f4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TongjiSuperPower/stm32_dev_env/fcc347e5793560632612c814467f8e0accd8c613/imgs/cubemx_stm32f4.png -------------------------------------------------------------------------------- /imgs/download_git.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TongjiSuperPower/stm32_dev_env/fcc347e5793560632612c814467f8e0accd8c613/imgs/download_git.png -------------------------------------------------------------------------------- /imgs/drag_files.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TongjiSuperPower/stm32_dev_env/fcc347e5793560632612c814467f8e0accd8c613/imgs/drag_files.png -------------------------------------------------------------------------------- /imgs/edit_temp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TongjiSuperPower/stm32_dev_env/fcc347e5793560632612c814467f8e0accd8c613/imgs/edit_temp.png -------------------------------------------------------------------------------- /imgs/extensions.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TongjiSuperPower/stm32_dev_env/fcc347e5793560632612c814467f8e0accd8c613/imgs/extensions.png -------------------------------------------------------------------------------- /imgs/extract_openocd.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TongjiSuperPower/stm32_dev_env/fcc347e5793560632612c814467f8e0accd8c613/imgs/extract_openocd.png -------------------------------------------------------------------------------- /imgs/install_cmake_ext.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TongjiSuperPower/stm32_dev_env/fcc347e5793560632612c814467f8e0accd8c613/imgs/install_cmake_ext.png -------------------------------------------------------------------------------- /imgs/install_cortex_ext.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TongjiSuperPower/stm32_dev_env/fcc347e5793560632612c814467f8e0accd8c613/imgs/install_cortex_ext.png -------------------------------------------------------------------------------- /imgs/install_cpp_ext.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TongjiSuperPower/stm32_dev_env/fcc347e5793560632612c814467f8e0accd8c613/imgs/install_cpp_ext.png -------------------------------------------------------------------------------- /imgs/install_vscode.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TongjiSuperPower/stm32_dev_env/fcc347e5793560632612c814467f8e0accd8c613/imgs/install_vscode.png -------------------------------------------------------------------------------- /imgs/mkdir_temp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TongjiSuperPower/stm32_dev_env/fcc347e5793560632612c814467f8e0accd8c613/imgs/mkdir_temp.png -------------------------------------------------------------------------------- /imgs/open_env_var_edit.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TongjiSuperPower/stm32_dev_env/fcc347e5793560632612c814467f8e0accd8c613/imgs/open_env_var_edit.png -------------------------------------------------------------------------------- /imgs/open_extension.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TongjiSuperPower/stm32_dev_env/fcc347e5793560632612c814467f8e0accd8c613/imgs/open_extension.png -------------------------------------------------------------------------------- /imgs/open_keyboard_json.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TongjiSuperPower/stm32_dev_env/fcc347e5793560632612c814467f8e0accd8c613/imgs/open_keyboard_json.png -------------------------------------------------------------------------------- /imgs/open_powershell.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TongjiSuperPower/stm32_dev_env/fcc347e5793560632612c814467f8e0accd8c613/imgs/open_powershell.png -------------------------------------------------------------------------------- /imgs/open_with_code.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TongjiSuperPower/stm32_dev_env/fcc347e5793560632612c814467f8e0accd8c613/imgs/open_with_code.png -------------------------------------------------------------------------------- /imgs/select_cmake.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TongjiSuperPower/stm32_dev_env/fcc347e5793560632612c814467f8e0accd8c613/imgs/select_cmake.png -------------------------------------------------------------------------------- /imgs/select_debug.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TongjiSuperPower/stm32_dev_env/fcc347e5793560632612c814467f8e0accd8c613/imgs/select_debug.png -------------------------------------------------------------------------------- /imgs/select_preset.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TongjiSuperPower/stm32_dev_env/fcc347e5793560632612c814467f8e0accd8c613/imgs/select_preset.png -------------------------------------------------------------------------------- /imgs/toolchain_and_workflow.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TongjiSuperPower/stm32_dev_env/fcc347e5793560632612c814467f8e0accd8c613/imgs/toolchain_and_workflow.png -------------------------------------------------------------------------------- /imgs/toolchian_table.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TongjiSuperPower/stm32_dev_env/fcc347e5793560632612c814467f8e0accd8c613/imgs/toolchian_table.png -------------------------------------------------------------------------------- /imgs/workflow.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TongjiSuperPower/stm32_dev_env/fcc347e5793560632612c814467f8e0accd8c613/imgs/workflow.png -------------------------------------------------------------------------------- /readme.md: -------------------------------------------------------------------------------- 1 | ## 简介 2 | 同济大学SuperPower战队25赛季STM32开发环境 3 | 4 | ## 指南 5 | 1. [安装教程](how_to_install.md) 6 | 2. [使用说明](how_to_use.md) 7 | 3. [原理解释](how_it_works.md) 8 | 9 | ## 参考 10 | - 湖南大学跃鹿战队:https://github.com/HNUYueLuRM/basic_framework 11 | - ST官方VSCode插件:https://www.youtube.com/watch?v=DDVdq47Dd94 --------------------------------------------------------------------------------