第1章:课程导论与开发环境搭建

各位同学,欢迎来到《单片机传感器驱动与电机控制中断系统联合开发实战》的第一课。

做嵌入式开发这么多年,我见过太多人一上来就急着写代码,结果连芯片选型都搞错了方向。这一章,咱们先把地基打牢。说白了,选对工具、搭好环境,后面才能跑得快。

1.1 为什么选这些器件?

先聊聊选型思路。我个人的习惯是:先定主控,再配外设。主控决定了你能跑多复杂的算法,外设决定了你能感知和控制什么。

主控芯片:STM32F103C8T6

这颗芯片,圈内俗称「F103」或「蓝 pill」。为什么选它?

  • 性价比极高:72MHz主频、64KB Flash、20KB SRAM,淘宝几块钱一片。
  • 生态成熟:Keil、STM32CubeMX、HAL库、标准库,资料多到看不完。
  • 外设够用:TIM、ADC、USART、I2C、SPI,覆盖传感器和电机控制所需。

我在项目中遇到过用F103做四轴飞行器飞控的案例,虽然有点极限,但足以证明它的性能不弱。

温湿度传感器:DHT11

DHT11是入门级温湿度传感器。精度一般(湿度±5%RH,温度±2℃),但胜在便宜、单总线通信、代码简单。

你可能会问:「为什么不用DHT22?」嗯,DHT22精度更高,但价格也贵几倍。咱们课程重点是传感器驱动框架,不是传感器本身。学会了DHT11的驱动写法,换DHT22只是改个时序参数的事。

超声波测距模块:HC-SR04

HC-SR04是经典的超声波测距模块,测距范围2cm~400cm,精度3mm左右。它用两个GPIO引脚(Trig和Echo)配合定时器就能完成测距。

我记得第一次用HC-SR04时,被回波信号的毛刺坑了一整天。后来发现是电源纹波太大,加了个100μF电容就稳了。这些坑,后面我会一一带你们避开。

电机与驱动:直流减速电机 + TB6612

直流减速电机自带减速箱,输出扭矩大,适合做小车底盘。TB6612是东芝产的电机驱动芯片,单路最大驱动1.2A,支持正反转和PWM调速。

为什么不选L298N?TB6612体积更小、内阻更低、发热更小。我做过对比测试:同样驱动两个电机,TB6612的温升比L298N低了将近15℃。

选型总结: 这套组合(F103 + DHT11 + HC-SR04 + 直流减速电机 + TB6612)覆盖了传感器采集、电机控制、中断响应三大核心技能,且成本控制在50元以内。

1.2 开发环境搭建

环境搭建这块,我建议按这个顺序来:先装Keil,再装CubeMX,最后配置工程模板。别跳步,跳步容易出幺蛾子。

Step 1:安装Keil MDK

  1. 去Keil官网下载MDK-Arm版本(建议5.38或更新版)。
  2. 安装时一路默认路径,但注意不要有中文路径。
  3. 安装完成后,用注册机生成License(懂的都懂)。
  4. 打开Keil,在 Pack Installer 中安装 STM32F1xx_DFP 设备包。
小技巧: 安装完Keil后,先重启一次电脑再装CubeMX。我遇到过因为环境变量没刷新导致CubeMX无法识别Keil路径的情况。

Step 2:安装STM32CubeMX

  1. 从ST官网下载STM32CubeMX(需要注册账号,免费)。
  2. 安装后,在 Help → Manage embedded software packages 中安装 STM32F1 的固件包(建议选最新版)。
  3. 配置Java环境(CubeMX基于Java,如果电脑没装JRE,它会自动提示安装)。

Step 3:创建工程模板

我个人习惯用CubeMX生成初始化代码,然后在Keil里写业务逻辑。这样既快又不容易漏配置。

具体步骤:

  1. 打开CubeMX,新建工程,选择 STM32F103C8Tx。
  2. 在 Pinout & Configuration 页面,配置以下外设:
外设 配置项 说明
RCC HSE → Crystal/Ceramic Resonator 使用外部8MHz晶振
Clock Configuration HCLK = 72MHz 配置系统时钟
SYS Debug → Serial Wire 保留SWD调试接口
USART1 PA9(TX), PA10(RX), 115200-8-N-1 串口打印调试信息
TIM2 Channel1 → PWM Generation CH1 电机PWM控制(PA0)
TIM3 Internal Clock, Prescaler 71, Period 65535 超声波回波计时
GPIO PB0(DHT11), PB1(Trig), PB2(Echo), PB3~PB4(电机方向) 传感器与电机IO
  1. 在 Project Manager 页面,设置工程名、路径(不要中文!),Toolchain/IDE 选 MDK-ARM V5。
  2. 点击 GENERATE CODE,生成工程。
  3. 用Keil打开生成的 .uvprojx 文件,编译一次,确认0错误0警告。
注意: 生成代码后,不要手动修改 CubeMX 生成的 .ioc 文件和初始化代码。如果你需要改配置,回 CubeMX 改完再重新生成。我曾经手贱改了 HAL_Init() 里的时钟配置,排查了整整两天才发现问题。

1.3 本章知识体系

下面这张图,是我画的本课程知识体系框架。你可以把它当作整个课程的地图。

课程知识体系框架 课程知识体系框架 单片机传感器驱动与电机控制中断系统联合开发 传感器驱动 电机控制 中断系统 DHT11温湿度驱动 单总线时序 · 数据校验 HC-SR04超声波驱动 回波捕获 · 距离计算 直流减速电机驱动 TB6612 · PWM调速 正反转控制 · 编码器测速 PID速度闭环 外部中断 定时器中断 · PWM中断 中断优先级 · 嵌套 临界区保护 硬件平台:STM32F103 + DHT11 + HC-SR04 + 直流减速电机 + TB6612 开发环境:Keil MDK + STM32CubeMX 说明:本课程从硬件选型 → 传感器驱动 → 电机控制 → 中断系统,层层递进,最终完成联合开发实战

1.4 工程模板验证

环境搭好、模板生成后,我建议你做一次快速验证:

  1. 在 main.c 的 while(1) 里加一句 HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_13); HAL_Delay(500);(板载LED闪烁)。
  2. 编译下载,看LED是否以1秒周期闪烁。
  3. 用串口助手连接USART1,在初始化后加一句 printf("Hello from F103!\r\n");,看是否能收到。

如果这两步都通了,恭喜你,开发环境搭建成功。后面的事,就是往这个模板里填代码了。

我的习惯: 我会在工程模板里提前建好几个文件夹:Drivers(传感器驱动)、Motor(电机控制)、Interrupt(中断处理)、App(主逻辑)。这样后面每写一个模块,直接往对应文件夹里加文件就行,工程结构一目了然。