嵌入式开发,简单来说就是在单片机上写程序,让硬件按照我们的意图工作。
小到智能手表,大到汽车电子、工业控制,嵌入式无处不在。
这个系列我会以 STM32F103 为例,从零开始分享嵌入式软件开发的实战经验。
内容覆盖 GPIO、中断、定时器、串口、工程架构等核心知识点。
一、开发环境搭建
工欲善其事,必先利其器。
嵌入式开发的工具链主要包括以下几种。
第一种是 Keil MDK-ARM。
它用于编译、下载和调试,推荐使用 5.38 及以上版本。
第二种是 STM32CubeMX。
它用于图形化配置和生成初始化代码,推荐 6.x 版本。
第三种是 ST-Link Utility。
它用于固件下载与擦除。
第四种是串口助手。
它用于串口调试,可以任意选择。
- Keil MDK 安装
Keil MDK 是 ARM 官方的集成开发环境,支持 Cortex-M 全系列内核。
安装时需要注意以下几点。
第一,安装路径不要有中文和空格。
第二,安装完成后需要激活,可以申请个人免费版。
第三,需要安装 STM32F1 的器件支持包。
- STM32CubeMX 安装
CubeMX 是 ST 官方的图形化配置工具。
它可以可视化配置时钟树和外设引脚,然后自动生成初始化代码。
这样可以大幅减少手写寄存器配置的工作量。
- 驱动安装
使用 ST-Link 下载器需要安装对应驱动。
Windows 10 和 Windows 11 一般会自动识别。
二、STM32 工程结构
一个标准的 Keil 工程通常包含以下几个目录。
第一个目录是 User。
它存放用户代码,比如 main.c。
第二个目录是 System。
它存放系统文件,包括启动文件和系统时钟配置。
第三个目录是 Libraries。
它存放标准外设库或者 HAL 库。
其中 CMSIS 是 Cortex 微控制器软件接口标准。
STM32F10x 是外设驱动源码。
第四个目录是 Output。
它存放编译输出的文件,比如 hex 和 bin。
第五个目录是 Listings。
它存放编译列表文件。
工程中的核心文件有以下几个。
第一个是 startup_stm32f10x_md.s。
它是启动文件,定义中断向量表,初始化栈,然后调用 main 函数。
第二个是 stm32f10x.h。
它是寄存器定义头文件,所有外设寄存器映射都在这里。
第三个是 system_stm32f10x.c。
它负责系统时钟初始化,配置 PLL 倍频到 72MHz。
第四个是 main.c。
它是用户主程序的入口。
三、第一个程序:点亮 LED
点亮 LED 是嵌入式的 Hello World。
假设 LED 接在 PC13 引脚,低电平点亮。
- 开时钟
STM32 所有外设默认时钟关闭,使用前必须开启。
GPIOC 挂在 APB2 总线上,所以需要开启 APB2 的 GPIOC 时钟。
- 配置 GPIO 模式
LED 需要输出高低电平,所以配置为推挽输出模式。
推挽输出可以输出强高低电平,驱动能力强。
- 控制引脚电平
拉低引脚电平,LED 亮。
拉高引脚电平,LED 灭。
在 while 循环中交替拉高拉低,就能实现 LED 闪烁。
中间加入延时函数,控制闪烁速度。
四、编译与下载
- 编译
点击工具栏的 Build 按钮,快捷键是 F7。
编译成功后,Output 目录会生成 hex 文件。
编译输出会显示程序大小,包括以下几个字段。
Code 表示代码占用的 Flash。
RO-data 表示只读数据,也就是常量。
RW-data 表示已初始化的全局变量。
ZI-data 表示未初始化的全局变量,占用 RAM。
- 下载
使用 ST-Link 连接开发板,在 Keil 中按以下步骤操作。
第一步,点击魔术棒,选择 Debug,选择 ST-Link Debugger。
第二步,点击 Settings,选择 Flash Download,勾选 Reset and Run。
第三步,点击 Download,快捷键是 F8,下载程序。
下载成功后 LED 会开始闪烁,说明你的第一个嵌入式程序跑起来了。
五、调试技巧
Keil 提供了强大的在线调试功能,常用快捷键如下。
F5 是开始调试。
F10 是单步执行,不进入函数。
F11 是单步执行,会进入函数。
Ctrl 加 F5 是停止调试。
调试时可以在 Watch 窗口查看变量值。
在 System Viewer 中可以查看外设寄存器的实时状态。
这对排查问题非常有帮助。
六、常见问题
问题一:编译报错找不到 stm32f10x.h
原因是头文件路径未添加。
解决方法是在魔术棒的 C/C++ 选项中,找到 Include Paths,添加 Libraries 头文件路径。
问题二:下载失败提示 No ST-Link detected
原因是驱动未安装或者 USB 线有问题。
解决方法是重新安装 ST-Link 驱动,或者换一根数据线。
需要注意有些线只能充电不能传数据。
问题三:程序下载后没有运行
原因可能是没有勾选 Reset and Run,或者 BOOT 引脚配置错误。
解决方法是在 Flash Download 中勾选 Reset and Run,并确认 BOOT0 接 GND。
小结
本篇我们完成了嵌入式开发的环境搭建,跑通了第一个 LED 闪烁程序。
接下来的系列文章会逐步深入 GPIO 的 8 种模式、中断系统、定时器等核心外设。
如果你觉得有帮助,欢迎点赞收藏,我们下篇见。