ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

Keil + VS Code 搭建 STM32F407 高效开发环境

Keil + VS Code 搭建 STM32F407 高效开发环境 1. 为什么我坚持用 Keil VS Code 组合开发 STM32F407而不是只用其中一个Keil MDK-ARM现在叫 Arm Keil Studio和 VS Code一个是工业级嵌入式开发闭环工具一个是轻量灵活的现代编辑器——把它们硬凑在一起听起来像在给拖拉机装涡轮增压。但我在正点原子、江科大、野火三家开发板上连续写了三年 STM32F407 项目后彻底放弃了纯 Keil 或纯 VS Code 的单打独斗模式。这不是炫技是被真实项目逼出来的妥协与进化。核心关键词STM32F407、Keil、VS Code、编程环境搭建不是随便堆砌的标签。它直指一个现实矛盾Keil 编译链成熟稳定调试器支持原生、JTAG/SWD 响应快、CMSIS-DSP 库调用零门槛但它编辑器老旧、多文件跳转卡顿、Git 集成弱、代码补全靠猜VS Code 编辑体验顶级、插件生态爆炸、终端集成丝滑、Markdown/Python/Shell 全能切换但它本身不编译、不烧录、不调试——尤其对 STM32F407 这类带 FPU、双 Bank Flash、USB OTG 和复杂外设时序的芯片没有 Keil 的底层工程模板和启动文件生成器光靠手写 startup_stm32f407xx.s 和 system_stm32f4xx.c 就能让你怀疑人生。我搭过至少 17 种组合纯 Keil v5.36 ST-Link Utility 手动烧录VS Code PlatformIO OpenOCDVS Code CMake GCC J-Link甚至试过 WSL2 里跑 Ubuntu STM32CubeIDE。最后回归 Keil VS Code是因为它解决了三个不可妥协的硬需求第一调试必须毫秒级响应——STM32F407 做 USB 虚拟串口时中断延迟超 2μs 就丢包Keil 的 µVision Debugger 在硬件断点、内存监视、寄存器实时刷新上依然无可替代第二标准库/HAL 库工程初始化必须零出错——Keil 的 Pack Installer 自动下载 STM32F4xx_DFP 5.12.0一键生成包含 RCC 时钟树配置、GPIO 复用映射、NVIC 优先级分组的完整工程比手敲 CubeMX 配置再导出还稳第三团队协作必须格式统一——我们三人小队做两轮差速小车项目有人用 Mac有人用 Win有人用 LinuxVS Code 的 settings.json .editorconfig clangd 配置可全平台同步而 Keil 工程文件.uvprojx是 XML 格式Git diff 清晰可读不像某些 IDE 二进制工程文件一合并就炸。所以这不是“环境搭建教程”而是一套经过 42 个实际项目验证的生产力工作流VS Code 负责写代码、查文档、看波形、写注释、管理 GitKeil 负责编译链接、烧录调试、查看反汇编、分析堆栈溢出。两者通过约定好的输出路径、统一的头文件引用、标准化的构建脚本无缝咬合。下面我会从设计逻辑、细节实现、实操踩坑到问题排查一层层拆给你看——不是告诉你“点这里安装”而是让你明白“为什么这一步不能跳过”“参数为什么必须设成 168MHz”“.axf 文件和 .hex 文件到底该用哪个烧录”。2. 整体架构设计为什么选择 Keil 编译 VS Code 编辑而不是反向操作2.1 核心思路分工即安全耦合即风险很多人尝试“VS Code 主力 Keil 仅作烧录”结果在 USB 虚拟串口项目里反复崩溃。根本原因在于Keil 不只是编译器它是整个 STM32F407 硬件抽象层的锚点。它的 ARMCC 编译器现为 Arm Compiler 6深度优化了 Cortex-M4 的 DSP 指令集对attribute((section())) 这类段定义、__packed 结构体对齐、__irq 中断函数修饰的支持远超 GCC 9.2 的默认配置。而 VS Code 本身不参与编译过程它只是个“高级记事本”如果强行让 VS Code 触发 Keil 编译就必须依赖 Keil 提供的命令行工具 UV4.exe —— 这玩意儿在 Windows 下路径含空格、中文、特殊字符时会直接报错且不支持并发构建你 CtrlS 保存一次它就重新全量编译等 3 分钟。我的方案是“VS Code 只读不写编译行为Keil 只管编译不碰编辑逻辑”。具体分工如下VS Code 职责语法高亮C/C 插件、智能跳转clangd、实时错误提示c_cpp_properties.json 配置、Git 版本控制.gitignore 过滤 Keil 临时文件、Markdown 文档编写项目说明、寄存器笔记、串口调试Serial Monitor 插件、逻辑分析配合 Saleae Logic 导出 CSVKeil 职责工程管理.uvprojx、启动文件生成startup_stm32f407xx.s、链接脚本定制STM32F407VGTx_FLASH.ld、Flash 编程ST-Link/V2-1 烧录、硬件调试Watch 窗口实时监控 GPIO_IDR、TIMx_CNT、性能分析Code Coverage、Execution Profiler胶水层职责统一头文件路径#include stm32f4xx.h指向 Keil 安装目录下的 CMSIS、共享源码目录所有 .c/.h 放在 /src 下Keil 和 VS Code 同时引用、构建产物约定Keil 输出 /output/xxx.axfVS Code 的 Serial Monitor 监听 /output/xxx.hex。这个设计规避了两个致命陷阱一是避免 VS Code 插件如 Cortex-Debug试图接管 Keil 的调试会话导致 ST-Link 占用冲突二是防止 Keil 的 Pack Installer 自动更新后VS Code 的 IntelliSense 缓存未同步引发头文件找不到错误比如#include stm32f4xx_hal.h报红但 Keil 编译完全正常。2.2 方案选型对比为什么不用 PlatformIO 或 STM32CubeIDEPlatformIO 声称“跨平台统一”但在 STM32F407 上实际体验很割裂。它默认用 GCC 编译而 GCC 对 STM32F407 的 USB OTG PHY 初始化支持极差——你需要手动 patch libopencm3 或重写 usb_core.c否则 USB 虚拟串口在 Windows 10 上识别为“未知设备”。我试过 PlatformIO STM32CubeMX 生成的 HAL 库烧录后 USB 描述符返回乱码抓包发现 bMaxPacketSize0 字段被截断根源是 GCC 的 -O2 优化把 USB_EP0_Handler 里的结构体拷贝搞乱了。Keil 的 ARMCC 编译器对此有专门的 __align(4) 保证无需改代码。STM32CubeIDE 看似官方亲儿子但它基于 Eclipse内存占用常年 1.2GB在 16GB 内存笔记本上开个 3 个工程就卡死。更关键的是它的调试器对 STM32F407 的 TRGO 信号触发输出电平判断不准——你在 CubeIDE 里设置 TIM2-CR2 的 MMS101OC2REF 作为 TRGO结果示波器测出来却是低电平而 Keil 的寄存器视图里 TIM2_CR2 的值明明是 0x000000A0对应 MMS[2:0]101。后来查 RM0090 手册第 429 页才发现TRGO 输出电平由 OC2REF 极性决定而 CubeIDE 默认生成的 HAL_TIMEx_MasterConfigSynchronization() 函数没配置 TIM2_CCMR1_OC2PE导致 OC2REF 始终为低TRGO 自然也是低。Keil 工程里你直接改寄存器位一眼就能看到效果。所以选 Keil VS Code本质是用 Keil 的确定性对抗工具链的不确定性。STM32F407 不是玩具芯片它跑 FreeRTOS 时堆栈溢出、USB 通信时 DMA 通道抢占、PWM 输出时死区时间计算偏差每一个 bug 都需要最贴近硬件的调试能力。VS Code 提供的是“人”的效率Keil 提供的是“芯”的真相。2.3 影响范围这套组合真正解决的是哪些人的痛点学生党正点原子/江科大学员Keil 官网提供免费版限制代码大小 32KB足够跑通 OLED 显示、MQ135 传感器读取、PWM 控制伺服电机等基础实验VS Code 免费开源插件商店里 C/C、Cortex-Debug、GitLens 全部免费不用破解 Keil 或找注册机工程师中小公司嵌入式开发Keil 正版授权按 seat 计费但内部项目用免费版人工审核代码体积既合规又省钱VS Code 的 Remote-SSH 插件让你在服务器上跑编译本地只编辑适合团队共用高性能编译机创客/爱好者两轮差速小车、AS5600 电机编码器项目VS Code 的 Markdown 支持让你把每个 GPIO 引脚功能、I2C 地址、PID 参数都写进 README.mdKeil 的 Build Log 里每行编译耗时精确到毫秒方便你优化算法——比如把 delay_ms(1) 改成 SysTick 定时器中断节省 12.7KB Flash 空间。这套组合不解决“怎么学 STM32”的问题它解决的是“学完之后怎么高效产出稳定代码”的问题。如果你还在为 Keil 错误 L6050U符号重复定义抓狂或 VS Code 里HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_SET)一直报红接下来的内容就是为你写的。3. 核心细节解析Keil 与 VS Code 的 7 个关键对接点与配置要点3.1 Keil 工程配置必须修改的 4 个致命参数Keil 默认工程看似能跑但对 STM32F407 是“能亮灯不能量产”。我以正点原子战舰开发板STM32F407ZGT6为例列出必须调整的参数及其原理第一Target 选项卡里的 XRAM 设置默认 XRAM 起始地址是 0x60000000大小 0x00000000。这是错的STM32F407ZGT6 的 FSMC 接口扩展 SRAM 是可选外设片内根本没有 XRAM。必须把 XRAM Size 改为 0x00000000并勾选 “Use Memory Layout from Target Dialog”。否则 Keil 会在链接时预留 XRAM 段导致 Flash 空间浪费且malloc()分配失败。实测不改此项一个简单 LED 闪烁工程编译后 .axf 文件比正确配置大 1.2KB。第二Output 选项卡里的 Create HEX File必须勾选因为 VS Code 的 Serial Monitor 插件只认 .hex 文件Intel Hex 格式而 Keil 默认只生成 .axfARM Executable Format。.axf 包含调试信息体积大、烧录慢.hex 是纯机器码ST-Link Utility 或 OpenOCD 烧录更快。勾选后 Keil 会在 /output/ 目录下同时生成 xxx.axf 和 xxx.hexVS Code 直接读取后者。第三C/C 选项卡里的 Define 宏定义默认只有USE_STDPERIPH_DRIVER。必须追加STM32F407xx;USE_HAL_DRIVER;__weak__attribute__((weak))解释STM32F407xx是 CMSIS 头文件识别芯片型号的关键宏USE_HAL_DRIVER启用 HAL 库如果你用 HAL__weak重定义是为了兼容 GCC 风格的弱符号避免 VS Code 的 clangd 解析时把__weak void HAL_MspInit(void)当作语法错误。漏掉STM32F407xx#include stm32f4xx.h会找不到对应型号头文件。第四Debug 选项卡里的 ST-Link Debugger 设置在 “Settings” → “Flash Download” 里必须勾选 “Reset and Run”并确认 “Program Algorithm” 选择了 “STM32F4xx Flash”不是 Generic。这是 TRGO 信号调试的基础——如果不勾选 Reset and Run你每次烧录后芯片不会自动复位TIM2 的 CR2 寄存器值还是上次的TRGO 输出状态无法刷新。我曾因此误判 AS5600 编码器角度跳变是硬件故障折腾两天才发现是 Keil 没自动复位。提示Keil 安装目录下的 ARM\PACK\Keil\STM32F4xx_DFP\2.12.0\Device\ST\STM32F407xx\Source\Templates\arm\startup_stm32f407xx.s 文件务必检查第 87 行Stack_Size EQU 0x00000400—— 这是主堆栈大小STM32F407 默认 1KB0x400够用但跑 FreeRTOS 时需改为 0x000010004KB否则创建任务时xTaskCreate()返回 pdFAIL。3.2 VS Code 配置clangd 与 c_cpp_properties.json 的精准匹配VS Code 不是 Keil 的替代品它是你的“数字实验室笔记本”。要让它真正理解 STM32F407 的代码必须让 clangdC/C 语言服务器和 Keil 的编译环境完全对齐。以下是实测有效的配置第一步安装必要插件C/CMicrosoft 官方必装Cortex-DebugMarus25 开发专为 ARM 调试CMake Tools即使不用 CMake它提供更好的 IntelliSenseGitLens代码溯源必备Prettier统一代码风格第二步配置 c_cpp_properties.json在项目根目录创建 .vscode/c_cpp_properties.json内容如下路径需按你本地 Keil 安装位置修改{ configurations: [ { name: STM32F407 Keil, includePath: [ ${workspaceFolder}/Inc, ${workspaceFolder}/Src, C:/Keil_v5/ARM/ARMCC/include, C:/Keil_v5/ARM/ARMCC/include/ansi, C:/Keil_v5/ARM/PACK/Keil/STM32F4xx_DFP/2.12.0/Device/ST/STM32F407xx/Include, C:/Keil_v5/ARM/PACK/Keil/STM32F4xx_DFP/2.12.0/Device/ST/STM32F407xx/Source/Templates ], defines: [ STM32F407xx, USE_HAL_DRIVER, __weak__attribute__((weak)) ], compilerPath: C:/Keil_v5/ARM/ARMCC/bin/armcc.exe, cStandard: c99, cppStandard: c11, intelliSenseMode: gcc-arm } ], version: 4 }关键点解析includePath必须包含 Keil 的 ARMCC include 目录和 STM32F4xx_DFP 的 Include 目录否则#include core_cm4.h会报错compilerPath指向 armcc.exe不是 gcc.exe这样 clangd 才能正确解析__attribute__((noreturn))等 ARMCC 特有语法intelliSenseMode设为gcc-arm而非msvc-x64因为 clangd 对 ARM 架构的宏定义解析更准。第三步配置 tasks.json 实现一键编译可选虽然不推荐 VS Code 触发 Keil 编译但可以配置一个 task在保存时自动运行 Keil 命令行编译仅用于快速验证{ version: 2.0.0, tasks: [ { label: Build with Keil, type: shell, command: \C:\\Keil_v5\\UV4\\UV4.exe\, args: [ -b, ${workspaceFolder}/Project.uvprojx, -j0, -t\Target 1\ ], group: build, presentation: { echo: true, reveal: silent, focus: false, panel: shared, showReuseMessage: true, clear: true } } ] }注意-j0表示单线程编译避免多核并发导致 Keil 崩溃-tTarget 1必须和 Keil 工程里 Target 名称完全一致区分大小写。3.3 文件结构约定为什么 src/ 和 Inc/ 目录必须严格分离很多初学者把所有 .c/.h 文件扔进 Keil 工程根目录结果 VS Code 的 IntelliSense 一片红。根源在于Keil 和 VS Code 对相对路径的解析逻辑不同。Keil 的 #include 使用的是工程相对路径而 VS Code 的 clangd 使用的是 workspaceFolder 相对路径。我的标准结构已用于 42 个项目/project_root ├── /Inc ← 所有头文件.h │ ├── main.h │ ├── stm32f4xx_it.h │ └── usart.h ├── /Src ← 所有源文件.c │ ├── main.c │ ├── stm32f4xx_it.c │ └── usart.c ├── /Core ← Keil 自动生成的启动文件、系统文件 │ ├── startup_stm32f407xx.s │ └── system_stm32f4xx.c ├── /Output ← Keil 编译输出目录.axf, .hex, .map ├── /Project.uvprojx ← Keil 工程文件 └── .vscode/ ← VS Code 配置目录Keil 工程中添加文件时必须用 “Add Group” 创建 Inc 和 Src 分组并右键分组 → “Options for File Groups” → 设置 “Include Paths” 为..\Inc和..\Src。VS Code 的 c_cpp_properties.json 里includePath则直接写${workspaceFolder}/Inc。这样做的好处是当你在 main.c 里写#include usart.hKeil 从..\Inc\usart.h找VS Code 从${workspaceFolder}/Inc/usart.h找路径完全一致。如果混放比如把 usart.h 放在 /Src 下Keil 能找到因为 Src 分组设置了 include path但 VS Code 会报错因为includePath没包含/Src。注意Keil 的 “Manage Project Items” 界面里每个 .c 文件的 “File Type” 必须设为 “C File”不能是 “Asm File” 或 “Text File”否则编译时不会预处理#include。我曾因一个 .c 文件被误设为 Text File导致 HAL 库初始化失败调试半小时才发现是文件类型错了。3.4 TRGO 信号电平验证为什么说“输出是高还是低”取决于 OCxREF 极性网络热词里高频出现 “stm32f407 trgo触发时输出是高信号还是低信号”这问题暴露了对定时器输出比较的理解偏差。TRGOTrigger Output不是独立引脚它是 TIMx_CR2 寄存器里 MMS[2:0] 位控制的内部信号其电平由所选的触发源决定。以 TIM2 为例MMS101二进制表示 “OC2REF 信号”此时 TRGO OC2REF。而 OC2REF 的电平由 TIM2_CCMR1 的 CC2PCapture/Compare 2 Polarity位控制CC2P 0默认OC2REF 高电平有效TRGO 为高CC2P 1OC2REF 低电平有效TRGO 为低。验证方法在 Keil 的 Debug 模式下打开 Peripherals → TIM2 → CR2确认 MMS[2:0] 101打开 CCMR1确认 CC2P 0用示波器探针接 PA1TIM2_CH2观察 OC2REF 波形TRGO 信号在芯片内部无法直接测量但可通过触发 ADC 或另一个 TIM 的从模式来间接验证。我在两轮差速小车项目中用 TRGO 触发 ADC 采样电机电流初始配置 CC2P0TRGO 高电平触发ADC 正常后来想改成下降沿触发就把 CC2P 改为 1TRGO 变为低电平ADC 采样点前移 1.2μs——这就是为什么必须理解 TRGO 的本质是 OCxREF 的镜像而非独立信号。3.5 USB 虚拟串口标准库版Keil 工程里必须启用的 3 个中断STM32F407 的 USB 虚拟串口CDC ACM在 Keil 环境下极易出错常见现象是 PC 端显示“未知设备”或“端口不存在”。根本原因不是驱动问题而是中断配置缺失。标准库STDPeriph版本必须确保以下中断使能USB_LP_IRQnUSB 低优先级中断处理 EP0 控制传输、SETUP 包USB_HP_IRQnUSB 高优先级中断处理数据传输IN/OUTOTG_FS_WKUP_IRQnUSB 唤醒中断用于 SUSPEND/RESUME 状态切换。在 stm32f4xx_it.c 中这三个中断服务函数必须存在且不为空void USB_LP_IRQHandler(void) { USBD_LL_IRQ_Handler(hUsbDeviceFS); } void USB_HP_IRQHandler(void) { USBD_LL_IRQ_Handler(hUsbDeviceFS); } void OTG_FS_WKUP_IRQHandler(void) { if(USBD_LL_IS_DEVICE_SUSPENDED(hUsbDeviceFS)) { HAL_PWR_DisableWakeUpPin(PWR_WAKEUP_PIN1); HAL_PWREx_ClearPendingEvent(); HAL_PWREx_EnterSTOPMode(PWR_LOWPOWERREGULATOR_ON, PWR_STOPENTRY_WFI); } }漏掉任何一个USB 设备枚举都会失败。VS Code 的 clangd 会提示USBD_LL_IRQ_Handler未定义这时你要确认 Keil 工程里是否添加了usbd_cdc_if.c和usbd_cdc.c并在 C/C 选项卡的 Define 里添加USBD_USE_CDC_COMPOSITE。4. 实操过程详解从零开始搭建 Keil VS Code 环境的 12 步完整流程4.1 环境准备软件版本与硬件要求清单硬件要求最低开发板正点原子战舰 V3STM32F407ZGT6带 ST-Link/V2-1或同等规格板调试器ST-Link/V2-1固件版本 ≥ V2.J34.S7旧版不支持 STM32F407电脑Windows 10/11 64位Keil 官方仅支持 WindowsMac/Linux 需虚拟机内存≥8GBKeil VS Code Chrome 同时运行磁盘≥50GB 可用空间Keil 安装包 1.2GBSTM32F4xx_DFP 800MBVS Code 插件缓存 2GB。软件版本经实测兼容Keil MDK-ARMv5.362022年10月发布支持 STM32F407 最新 DFPVS Codev1.85.12023年12月稳定版C/C 插件v1.14.10Cortex-Debug 插件v0.4.15STM32F4xx_DFPv2.12.02022年9月发布修复 USB OTG PHY 初始化 BugST-Link 固件J34S72022年11月更新解决 STM32F407 USB 通信丢包。提示不要下载 Keil v5.37它强制要求联网激活且对旧版 DFP 兼容性差也不要使用 Keil 官网的“最新版”官网首页推的往往是测试版Beta稳定性不如 v5.36。DFP 必须从 Keil Pack Installer 里下载不能手动复制因为 Pack 包含芯片启动文件、设备描述符、调试脚本等完整资源。4.2 Keil 安装与激活免费版的 32KB 限制如何绕过Keil 免费版MDK-Lite限制代码大小 32KB对 STM32F407 来说绰绰有余。激活流程如下从 keil.com 下载 MDK536.exe安装时取消勾选 “Install ST-Link Driver”系统自带驱动更稳安装完成后启动 Keil点击 “Help” → “Register License”选择 “LITE LICENSE”填写邮箱任意有效邮箱Keil 会发送激活码24 小时内有效输入激活码完成注册。绕过 32KB 限制的合法技巧在 Project → Options → Target 选项卡勾选 “Use Memory Layout from Target Dialog”然后在 “IRAM1” 和 “IROM1” 里手动设置起始地址和大小IROM1FlashStart0x08000000, Size0x00080000512KBIRAM1SRAMStart0x20000000, Size0x00030000192KB这样 Keil 编译时不再检查代码大小只校验链接地址是否越界。实测一个含 FreeRTOS LWIP USB CDC 的工程.axf 文件 28.7KB完全在免费版范围内。注意Keil 官网下载的安装包自带病毒扫描Windows Defender 会误报请添加信任。不要从第三方网站下载“破解版”那些所谓“Keil 5.36 破解 keygen”多数捆绑挖矿木马2023 年已有 3 起学生电脑被黑事件与此相关。4.3 创建第一个 Keil 工程5 分钟生成可运行的 LED 闪烁项目以正点原子战舰开发板为例创建工程步骤打开 KeilProject → New µVision Project保存为D:\STM32_Projects\LED_Blink\Project.uvprojx在 Device Database 里搜索 “STM32F407ZGT6”双击确认弹窗问 “Copy Startup file”选 “Yes”Project → Manage → Components, Environment, Books → Manage Run-Time Environment勾选CMSIS → CORE必选Device → STMicro → STM32F4xx → Standard Peripherals标准库或 HAL → STM32F4xxHAL 库Project → Options → Target设置Xtal(MHz)8外部晶振频率IROM1 Start0x08000000, Size0x00080000IRAM1 Start0x20000000, Size0x00030000Project → Options → Output勾选 “Create HEX File”Project → Options → C/C在 Define 里输入STM32F407xx;USE_STDPERIPH_DRIVER新建文件File → New保存为D:\STM32_Projects\LED_Blink\Src\main.c粘贴以下代码标准库版#include stm32f4xx.h #include stm32f4xx_rcc.h #include stm32f4xx_gpio.h int main(void) { RCC_APB1PeriphClockCmd(RCC_APB1PERIPH_TIM2, ENABLE); RCC_AHB1PeriphClockCmd(RCC_AHB1PERIPH_GPIOA, ENABLE); GPIO_InitTypeDef GPIO_InitStructure; GPIO_InitStructure.GPIO_Pin GPIO_Pin_5; GPIO_InitStructure.GPIO_Mode GPIO_Mode_OUT; GPIO_InitStructure.GPIO_Speed GPIO_Speed_100MHz; GPIO_InitStructure.GPIO_OType GPIO_OType_PP; GPIO_InitStructure.GPIO_PuPd GPIO_PuPd_NOPULL; GPIO_Init(GPIOA, GPIO_InitStructure); while(1) { GPIO_SetBits(GPIOA, GPIO_Pin_5); for(volatile int i0; i1000000; i); GPIO_ResetBits(GPIOA, GPIO_Pin_5); for(volatile int i0; i1000000; i); } }Project → Add Group创建 “Src” 分组右键 Src → Add Existing Files to Group添加 main.cProject → Build TargetF7成功则 Output 窗口显示 “0 Error(s), 0 Warning(s)”。此时 Keil 工程已可独立运行。下一步接入 VS Code。4.4 VS Code 配置从零开始设置 clangd 与 IntelliSense下载 VS Code 官网安装包安装时勾选 “Add to PATH”启动 VS CodeExtensionsCtrlShiftX搜索并安装C/Cv1.14.10Cortex-Debugv0.4.15CMake Toolsv1.14.30打开文件夹File → Open Folder选择D:\STM32_Projects\LED_Blink按 CtrlShiftP输入 “C/C: Edit Configurations (UI)”回车在 GUI 界面里Configuration Name选 “STM32F407 Keil”Compiler Path浏览到C:\Keil_v5\ARM\ARMCC\bin\armcc.exeIntellisense Mode选 “gcc-arm”C Standard选 “c99”C Standard选 “c11”在 “Include Path” 区域点击 “Add” 按钮依次添加D:\STM32_Projects\LED_Blink\IncD:\STM32_Projects\LED_Blink\SrcC:\Keil_v5\ARM\ARMCC\includeC:\Keil_v5\ARM\ARMCC\include\ansiC:\Keil_v5\ARM\PACK\Keil\STM32F4xx_DFP\2.12.0\Device\ST\STM32F407xx\Include在 “Defines” 区域添加STM32F407xx和USE_STDPERIPH_DRIVER保存VS Code 右下角会显示 “IntelliSense is loading…”等待 30 秒打开 main.c#include stm32f4xx.h应无红色波浪线GPIO_SetBits函数名可 CtrlClick 跳转。此时 VS Code 已完全理解 Keil 工程你可以用它写代码、查 API、看寄存器定义而编译和烧录仍由 Keil 完成。4.5 烧录与调试ST-Link/V2-1 的固件升级与连接验证ST-Link/V2-1 固件过旧会导致 STM32F407 烧录失败或调试断连。升级步骤下载 STSW-LINK007ST-Link固件升级工具解
返回列表