通过 STM32CubeMX 建立的 Makefile 工程,应该会有以下结构:
❯ tree test
test
├── Core
│ ├── Inc
│ └── Src
├── Drivers
│ ├── CMSIS
│ │ ├── Device
│ │ │ └── ST
│ │ │ └── STM32F1xx
│ │ │ ├── Include
│ │ │ ├── LICENSE.txt
│ │ │ └── Source
│ │ │ └── Templates
│ │ ├── Include
│ │ └── LICENSE.txt
│ └── STM32F1xx_HAL_Driver
│ ├── Inc
│ │ ├── Legacy
│ ├── LICENSE.txt
│ └── Src
├── Makefile
├── STM32F103C8Tx_FLASH.ld
├── build
├── startup_stm32f103xb.s
└── test.ioc1.配置本机环境
为了能顺利使用通过 STM32CubeMX 建立的 Makefile 工程,你需要先安装完成以下准备:
- 安装
arm-none-eabi-gcc交叉编译链 - 安装
openOCD - 安装
Make
安装 arm-none-eabi-gcc 交叉编译链:
-
windows:
- 链接: https://caiyun.139.com/m/i?145CFu8T4pzZ9
- 提取码:ifpa
-
linux:
- 链接: https://caiyun.139.com/m/i?145CFu8QjVMxO
- 提取码:sXCp
-
macOS:
- 链接: https://caiyun.139.com/m/i?145CFaDB85q9C
- 提取码:OoEr
如果你是个 大佬 ,当然大佬应该是不会看这种教程的,你喜欢自己构建的话,可以用下面的源码:
- 链接: https://caiyun.139.com/m/i?145CGY0p8xYON
- 提取码:t3bC
下载安装好编译链之后,将其放入到环境变量 PATH 中(至于具体步骤,百度一下,你就知道)
2.创建工程并去掉警告(红色波浪线)
vscode 需要提前安装 C/C++ 插件
1.新建一个 STM32CubeMX_projects 目录(以后的工程就统一放置在该目录下,建议不要放置在桌面,放在自己容易记忆的位置),然后使用 vscode 打开该目录,并且将其保存为工作区,将工作区文件保存在希望的位置,以后可以通过双击该文件直接打开 STM32CubeMX_projects 工作区:
2.在 STM32CubeMX 配置好工程,点击左侧选项卡,然后勾选绿色框里的选项选择 Makefile 导出:
3.使用 vscode 打开该工程目录,点开./Core/Src/main.c,你会发现:满是令人高血压的红色波浪线,难以忍受。
解决方法:
动手能力比较强的可以通过 python 安装一个 compiledb ,之后在工程根目录中运行
compiledb -n make命令,这将在工程根目录生成一个compile_commands.json,vscode 会根据该文件自动解析文件关系,小白可以忽略...请看下面:
1.在工作区根目录中按下(macos)cmd+shift+p,(windows)ctrl+shift+p,输入 C/C++ 然后点击Edit Configurrations(JSON)选择
2.接下来 vscode 会在你的工作区根目录下创建一个 .vscode 目录和一个 c_cpp_properties.json ,默认情况下你在 c_cpp_properties.json 会看到以下内容
3.打开工程根目录的Makefile,找到#C defines(也就是宏定义这部分),然后复制绿色框里的内容
4.回到c_cpp_properties.json,将上面复制的内容按 以下格式(一定要注意格式) 粘贴到"defines"的中括号里,就像下面这样:
5.打开工程根目录的Makefile,找到#C includes(也就是头文件搜索这部分),然后复制绿色框里的内容
6.回到c_cpp_properties.json,将上面复制的内容按 以下格式(一定要注意格式) 粘贴到"includePath"的中括号里。自带的第一行不要删除,在后面加上英文的逗号即可。将复制的内容前面的 -D 替换为工程名,这里的工程名是test,将所有内容使用英文引号包裹,每一行后面使用英文逗号结尾,最后一行不使用逗号,就像下面这样:
以后每新增加一个工程都可用一样的方法,区别是替换的
-D的工程名要修改为你希望添加的工程名,如果红色警告仍然存在,可能是重复包含,所以你可以在c_cpp_properties.json中的"includePath"将之前添加的所有 include 路径注释掉,然后只保留你当前聚焦的工程 include 路径即可
在 makefile 的末尾加上(以下二选一):
flash:
st-flash write $(BUILD_DIR)/$(TARGET).bin 0x08000000flash:
openocd -f interface/stlink-v2.cfg -f target/stm32f1x.cfg -c "program $(BUILD_DIR)/$(TARGET).bin verify reset exit 0x08000000"之后即可在命令行通过 make flash 命令下载程序
3.工程调试
3.1使用 openocd + stlink 调试
以stm32f103举例,注意:使用该方法调试需要安装 opencod 以及配置者具备较深的专业知识
1.在终端输入
openocd -f interface/stlink-v2.cfg -f target/stm32f1x.cfg2.保持上面的终端不要退出,然后开启一个新的终端窗口,输入命令「arm-none-eabi-gdb -q path/build/<your_project>.elf」 就可以进入 gdb 调试:
❯ arm-none-eabi-gdb -q path/build/<your_project>.elf
Reading symbols from .../build/<your_project>.elf...
(gdb)接着输入target remote: 3333,看见以下内容就可以开始调试了:
❯ arm-none-eabi-gdb -q path/build/<your_project>.elf
Reading symbols from ./build/test.elf...
(gdb) target remote: 3333
Remote debugging using : 33333.2使用 vscode 的 cortex-debug 插件调试
使用此方法,vscode 需要安装 cortex-debug 插件
先看效果;
实现方法:
在工作区根目录的 .vscode 目录中新建 launch.json 和 tasks.json。
如果根目录没有 .vscode 目录,可以:
- 点击顶部栏
运行->添加配置-> 在弹出的 “选择调试器” 选项里随便选一个点击,这时候.vscode目录和launch.json就会创建好了。 - 点击顶部栏
终端->配置生成默认任务->使用模板创建 tasks.json 文件->Others,tasks.json就创建好了。
打开刚刚创建的 launch.json ,可以看到一些默认配置,把其中 version 这一行到 结尾花括号(不包括结尾花括号) 的所有内容删除,然后把下面的内容复制并粘贴到 version 这一行到 结尾花括号 之间。
launch.json:
"configurations": [
{
"name": "Cortex Debug",
"cwd": "${workspaceRoot}",
"executable": "${workspaceFolder}/${input:projectName}/build/${input:projectName}.elf",//根据自己工程实际生成最终.elf 路径修改
"request": "launch",
"type": "cortex-debug",
"servertype": "openocd",
"configFiles": [ //根据自己开发版以及调试器修改
"interface/stlink-v2.cfg",
"target/stm32f1x.cfg"
],
"armToolchainPath": "/opt/arm-none-eabi/bin",
"preLaunchTask": "stm32 debug",
}
],
"inputs": [
{
"id": "projectName",
"type": "promptString",
"description": "请输入你要调试的工程名",
}
]打开刚刚创建的 tasks.json ,可以看到一些默认配置,把其中 version 这一行到 结尾花括号(不包括结尾花括号) 的所有内容删除,然后把下面的内容复制并粘贴到 version 这一行到 结尾花括号 之间。
tasks.json:
"tasks": [
{
"label": "stm32 debug",
"type": "shell",
"options": {
"cwd": "${workspaceFolder}/${input:projectName}"
},
"command": "make",
"detail": "任务用于构建 STM32 项目"
}
],
"inputs": [
{
"id": "projectName",
"type": "promptString",
"description": "请输入构建的工程名(应与调试的工程名一致)",
}
]然后运行一次 make clean 再重新 make 或者 make DEBUG=1 ,再按下f5或者在 vscode 顶栏依次点击运行->启用调试 即可。
3.3调试遭遇问题
调试一直卡在 HAL_Init 函数里...
解决方法
1.打开「.../<Your_Project>/Core/Src/stm32f1xx_hal_msp.c」,在其中找到HAL_MspInit函数,默认情况下,函数内部是这样的:
void HAL_MspInit(void)
{
__HAL_RCC_AFIO_CLK_ENABLE();
__HAL_RCC_PWR_CLK_ENABLE();
__HAL_AFIO_REMAP_SWJ_NOJTAG();
}2.将HAL_MspInit函数内部的__HAL_RCC_PWR_CLK_ENABLE()和__HAL_AFIO_REMAP_SWJ_NOJTAG()这两个函数注释,就像这样:
void HAL_MspInit(void)
{
__HAL_RCC_AFIO_CLK_ENABLE();
// __HAL_RCC_PWR_CLK_ENABLE();
// __HAL_AFIO_REMAP_SWJ_NOJTAG();
}然后 打开终端把之前的调试任务全部停止 -> 再次 make -> 重新启动调试 。
如需要减少编译优化等级,可以进入makefile,在
if DEBUG判断的编译流程添加-O0,之后重新make DEBUG=1













