1. 硬件基础:GPIO、中断、定时器与蜂鸣器实战解析
搞嵌入式开发这些年,GPIO、中断、定时器这几个外设就像吃饭用的筷子勺子一样,天天都得打交道。最近带新人时发现,很多初学者对这些基础概念一知半解,用起来总是磕磕绊绊。今天我就用STM32和51单片机两个平台为例,把这些年踩过的坑和实战经验做个系统梳理。
先说GPIO,这玩意儿看起来简单,但工作模式选不对能把人折腾死。中断和定时器更是嵌入式系统的灵魂,用好了能让系统跑得飞起,用不好就是灾难现场。最后配上蜂鸣器这个最基础的输出设备,咱们搞个综合实验,把知识点都串起来。本文会涉及寄存器操作和库函数两种开发方式,不管你是寄存器党还是库函数党,都能找到适合自己的操作方式。
2. GPIO深度解析与实战配置
2.1 GPIO的8种工作模式详解
以STM32的GPIO为例,光工作模式就有8种,新手看到直接懵圈。其实拆开看就明白:
-
输入类:
- 浮空输入:信号完全由外部决定,像悬空的电线,抗干扰差但省电
- 上拉输入:内部接上拉电阻,默认高电平
- 下拉输入:内部接下拉电阻,默认低电平
- 模拟输入:ADC采集时专用
-
输出类:
- 开漏输出:只能拉低不能拉高,要接上拉电阻
- 推挽输出:经典输出模式,高低电平都能驱动
- 复用开漏:外设功能时的开漏模式
- 复用推挽:外设功能时的推挽模式
关键经验:按键检测用上拉/下拉输入,LED控制用推挽输出,I2C用开漏,这些都是血的教训总结出来的。
2.2 GPIO初始化实战代码
寄存器配置版(STM32F1为例):
c复制// 配置PB5为推挽输出,速度50MHz
GPIOB->CRL &= ~(0xF << 20); // 先清空配置
GPIOB->CRL |= (0x3 << 20); // 输出模式,最大速度50MHz
GPIOB->CRL |= (0x0 << 22); // 推挽输出
GPIOB->ODR |= (1 << 5); // 初始高电平
HAL库版本:
c复制GPIO_InitTypeDef GPIO_InitStruct = {0};
GPIO_InitStruct.Pin = GPIO_PIN_5;
GPIO_I
