提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
——从代码编译到硬件调试,掌握嵌入式开发的“瑞士军刀”
📌 本章目标(STM32F103ZET6专属工具链)
- 精通Keil MDK编译器配置(标准库工程模板)
- 掌握ST-Link调试器的高级用法(下载、断点、寄存器查看)
- 学会使用Proteus仿真器验证电路设计
- 实战:通过工具链调试串口通信与中断程序
一、编译器:将代码转化为机器指令的“翻译官”
1.1 Keil MDK编译器(ARMCC)
1.1.1 工程配置核心
- Target选项:
- 选择CPU:ARM Cortex-M3(STM32F103ZE)
- 晶振频率:8MHz(与硬件一致)
- 勾选“Use MicroLIB”(嵌入式C库)
- C/C++选项:
- 预定义宏:
STM32F10X_HD,USE_STDPERIPH_DRIVER
- 包含路径:
..\Libraries\CMSIS\CM3\CoreSupport
- 优化等级:
-O0
(调试时禁用优化,保留代码可读性)
- 预定义宏:
1.1.2 编译流程解析
.c文件 → 编译器(armcc) → .o目标文件
.s文件 → 汇编器(armasm) → .o目标文件
链接器(armlink) → 合并.o文件 → .axf可执行文件
1.1.3 实战:解决编译错误
-
错误1:
undefined symbol GPIO_Init
- 原因:未添加
stm32f10x_gpio.c
到工程 - 解决:在Keil中右键“Source Group”→“Add Existing Files”
- 原因:未添加
-
错误2:
stack overflow
- 原因:栈空间不足(默认0x400=1KB)
- 解决:修改
startup_stm32f10x_hd.s
中的栈大小:Stack_Size EQU 0x00000800 ; 改为2KB
二、调试器:硬件调试的“透视镜”(ST-Link V2)
2.1 ST-Link硬件连接(STM32F103ZET6)
ST-Link引脚 | STM32F103ZET6引脚 | 说明 |
---|---|---|
SWCLK(TCK) | PA13(SWDCLK) | 调试时钟 |
SWDIO(TDI) | PA14(SWDIO) | 调试数据 |
GND | GND | 共地 |
3.3V | 3.3V | 给目标板供电(可选) |
2.2 Keil MDK调试配置
-
Debug选项:
- 选择“ST-Link Debugger”
- 勾选“Reset and Run”(下载后自动运行)
- 配置Flash下载算法:
STM32F10x_HD_FLASH.axf
(ST官方提供)
-
Utilities选项:
- 勾选“Use Debug Driver”
- 配置Flash擦除(整片擦除或扇区擦除)
2.3 调试技巧(标准库工程)
2.3.1 常用调试命令
快捷键 | 功能 | 应用场景 |
---|---|---|
F5 | 全速运行 | 验证主循环逻辑 |
F10 | 单步执行(跳过函数) | 逐行调试主函数 |
F11 | 单步进入(进入函数) | 调试库函数内部逻辑 |
Ctrl+B | 设置/取消断点 | 在中断服务函数设断点 |
2.3.2 寄存器查看
-
打开“Peripherals”窗口:
- 选择“GPIOA”查看
ODR
寄存器(LED状态) - 选择“USART1”查看
SR
寄存器(串口标志位)
- 选择“GPIOA”查看
-
实时监控变量:
- 在“Watch”窗口添加
key_state
(按键状态变量) - 观察
ms_tick
(SysTick计数器)递增是否正常
- 在“Watch”窗口添加
2.3.3 下载失败排查
-
错误1:
Flash Download failed - Target DLL has been cancelled
- 原因:目标板未供电或SWD连接错误
- 解决:检查ST-Link接线,确保3.3V正常供电
-
错误2:
Connecting to target...Failed
- 原因:SWD引脚被占用(如PA13/PA14用作GPIO)
- 解决:确保PA13/PA14未被初始化,或重新映射SWD到JTAG引脚
三、仿真器:无需硬件的电路验证(Proteus+Keil联调)
3.1 Proteus电路设计(STM32F103ZET6最小系统)
- 关键元件:
- STM32F103ZET6(从Proteus库中搜索“STM32F103ZE”)
- 8MHz晶振、复位电路、LED(PA5)、按键(PA0)
- Virtual Terminal(虚拟串口,模拟电脑串口助手)
3.2 Keil与Proteus联调配置
-
Keil设置:
- 在“Options for Target”→“Debug”选择“Proteus VSM Studio”
- 勾选“Use Remote Debug Monitor”,端口默认8000
-
Proteus设置:
- 启动仿真,打开“Debug”→“Virtual Terminal”设置波特率115200
3.3 仿真实战:串口通信验证
-
代码修改:
// 禁用硬件流控制(Proteus仿真需要) USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
-
仿真现象:
- LED按预期闪烁
- Virtual Terminal显示“STM32F103ZET6仿真成功!”
- 按键按下时,LED翻转且串口输出按键类型(短按/长按)
四、工程管理:标准库项目模板构建
4.1 目录结构(推荐)
STM32_Project/
├── Libraries/ ← 标准库文件(CMSIS+StdPeriph Driver)
├── Project/
│ ├── Obj/ ← 编译生成的.axf、.o文件
│ ├── Src/ ← 用户代码(main.c、usart.c、key.c)
│ ├── Inc/ ← 用户头文件(usart.h、key.h)
│ └── Keil/ ← Keil MDK工程文件(.uvproj、.uvopt)
└── Tools/
├── ST-Link_Upgrade/← 调试器固件升级工具
└── Proteus/ ← 仿真电路图(.pdsprj)
4.2 一键编译脚本(Windows批处理)
@echo off
call "C:\Keil_v5\ARM\ARMCC\bin\armcc.exe" --version
call "C:\Keil_v5\UV4\UV4.exe" -b STM32F103ZET6.uvproj
pause
五、工具链高级应用:调试复杂问题
5.1 内存查看(Memory窗口)
- 查看Flash内容(地址0x08000000):
0x08000000: 0x20000400 0x080001D1 0xE000ED08 0x00000000 ...
- 分析栈溢出:检查栈顶地址(0x20000800)是否被覆盖
5.2 反汇编调试(Disassembly窗口)
- 查看标准库函数汇编代码:
; GPIO_SetBits 反汇编 0x080005D4: LDR R3, [R0, #0x10] 0x080005D6: ORR R3, R3, R1 0x080005D8: STR R3, [R0, #0x10]
5.3 逻辑分析仪(ST-Link Utility)
- 捕获GPIO波形:
// 在代码中添加波形标记 #define TRACE_PIN GPIO_Pin_7 GPIO_SetBits(GPIOA, TRACE_PIN); // 标记事件开始 // 关键代码 GPIO_ResetBits(GPIOA, TRACE_PIN); // 标记事件结束
- 使用ST-Link Utility的“SWV”功能查看时序
六、学习资源:工具链深度教程
-
Keil官方文档:
- Keil MDK User Guide(含编译器选项详解)
-
ST-Link开发指南:
-
Proteus仿真教程:
- Proteus与Keil联调STM32(标准库版)(YouTube视频)
-
开源工具链对比:
- GCC vs Keil编译器性能测试(STM32F103)(含代码尺寸、执行速度对比)
七、总结与下章预告
7.1 本章重点
- 编译器:Keil MDK工程配置(标准库宏定义、优化选项)
- 调试器:ST-Link下载调试(断点、寄存器、反汇编)
- 仿真器:Proteus电路验证(无需硬件的快速迭代)
- 工程管理:目录结构、编译脚本、版本控制(Git)
7.2 下章预告
《低速串行协议:UART基础入门与标准库实战(STM32F103ZET6)》
- UART帧格式解析(标准库寄存器配置)
- 中断+DMA实现高速串口通信
- 实战:自定义协议帧(命令+数据+校验)
💡 工具链心法:
“工欲善其事,必先利其器。掌握调试器的‘单步执行’和‘变量监控’,就像给代码装上CT扫描仪,让每一个比特都无处遁形。”
(本章工具链配置模板:公众号“豆包嵌入式”回复【F103工具链】获取,含Keil工程模板、Proteus仿真文件、ST-Link驱动)
📌 本章适配STM32F103ZET6特色:
✅ 专属配置:针对F103ZET6的SWD引脚(PA13/PA14)、Flash地址(0x08000000-0x0807FFFF)
✅ 标准库深度:解析标准库函数的汇编实现(如GPIO_Init
的寄存器操作)
✅ 硬件实战:包含ST-Link接线图、Proteus仿真电路图(F103ZET6专属外设)
✅ 问题驱动:解决新手常见问题(下载失败、编译错误、仿真配置)
常见问题Q&A:
Q:Keil MDK如何配置多个源文件?
A:在工程中创建分组(如“Core”“User”“Drivers”),将对应.c文件添加到分组。
Q:ST-Link调试时提示“无法识别设备”?
A:检查STM32型号是否选择正确(F103ZE),更新ST-Link固件(使用ST-Link Utility)。
Q:Proteus仿真STM32需要注意什么?
A:确保晶振频率与代码一致,禁用硬件流控制(USART_HardwareFlowControl_None)。