51单片机
51单片机——点亮LED
配置流程
① 确定LED的连接方式
为什么?
因为需要知道LED是接在单片机引脚的正极还是负极。
- LED正极接IO口,负极接地 → 输出高电平点亮。
- LED负极接IO口,正极接电源 → 输出低电平点亮。
所以第一步不是写代码,而是先分析硬件电路。
② 找到对应的IO引脚
为什么?
只有操作连接LED的那个引脚,电平变化才能传递到LED。
③ 输出正确的电平
为什么?
LED本质上是二极管,只有形成电流回路才能发光。
根据连接方式选择输出高电平或低电平,使LED两端形成合适的电压差,电流流过LED,从而点亮。
为什么51如此简单?
因为51单片机的硬件架构比较简单:
- 时钟系统简单。上电后整个单片机使用统一的系统时钟,不需要像 STM32 那样为 GPIO、USART、ADC 等外设分别开启时钟。
- GPIO 功能单一。大多数 IO 上电后即可作为普通数字输入/输出使用,不需要配置工作模式。
- 没有复杂的引脚复用机制。一个引脚通常只有少量功能,不需要配置复用功能(AF)。
因此,点亮 LED 的流程非常直接:
分析硬件 → 找到 IO → 输出正确电平。
stm32
配置流程
①打开对应模块的时钟
- 打开对应引脚对应GPIO时钟即可。
为什么?
打开对应模块时钟以后,该模块才能开始工作
因为 CPU 一直都是工作的。
只是:
GPIO 没有时钟。 ↓ GPIO寄存器不会响应。 ↓ GPIO内部逻辑停止。 ↓ 所以操作GPIO没有效果。STM32 将 CPU、GPIO、USART、TIM、ADC 等划分为多个独立的硬件模块,每个模块都需要时钟才能工作。为了降低功耗、提高资源利用率,这些模块的时钟默认可以独立控制,因此使用某个模块之前,需要先使能它的时钟。
绝大多数引脚都是按照GPIOA~GPIOX来进行分组划分,还有按照其他方式来进行划分。因此要使用哪个模块的引脚就需要去打开哪个模块的时钟,比如你要使用PA1,那就只需要打开GPIOA模块的时钟。这些模块的时钟开关都是单独存在,互不影响。这样做的好处就是:
- 降低功耗,同时避免未使用外设无意义地运行
还有一个问题就是,stm32单片机中的一个引脚通常有大量复用功能,这些功能会针对不同的场景,比如会作为定时器的PWM输出或者是捕获,此时还需要打开这部分模块的时钟。
一个引脚通常有大量复用功能
真正可以这样理解:
GPIO 更像是一块交通枢纽。
例如:
PA9。
可以连接:
GPIO
↓
USART1_TX
↓
TIM1_CH2
↓
I2C
↓
…
这些模块都想使用 PA9。
那么:
到底是谁连接过去?
答案就是:
AF(Alternate Function)配置。
所以:
不是 GPIO 自己产生 PWM。
而是:
TIM1 产生 PWM。 ↓ AF把TIM1连接到PA9。 ↓ PA9输出PWM。这是很多初学者容易混淆的地方。
个人总结:
- 一个GPIO引脚更像一个交通枢纽,它不仅只能单纯的输出高低电平和等待输入的高低电平,而是连接着功能模块,比如定时器、串口、I2C通信。比如PA9,到底是哪一个功能模块想连接过去,就需要AF配置,所以不是GPIO自己产生PWM,而是某个定时器产生PWM,AF把TIM1连接到PA9,然后PA9才输出PWM的
AI总结:
- STM32 将不同的功能划分为多个独立的硬件模块,每个模块只有在获得时钟后才能工作。一个功能往往不是由某一个模块单独完成,而是由多个模块协同完成。例如输出 PWM,需要 GPIO 模块负责引脚输出、定时器模块负责产生 PWM 信号,两者都必须使能时钟并完成相应配置
从这里就可以看到了,打开对应模块时钟不仅仅只是针对从GPIOX中做选择了,还有许多模块
②配置工作模式
- 配置高速输出模式
- 推挽输出模式
为什么?
STM32的一个引脚所承载的功能远比51丰富。
例如一个 PA8 可能既可以是:
- GPIO
- USART
- SPI
- I2C
- PWM
- 输入捕获
- MCO
- …
硬件不知道你到底想让它干什么。
因此需要你告诉它:
“今天你就是一个 GPIO 输出。”
所以,我们就需要单独针对,输入和输出来进行一个配置了。
假如引脚连接的是LED的负极:
就需要给LED输入低电平,站在单片机的视角上,就是单片机控制该引脚输出低电平,因此就得配置输出模式,在这里还可以选择输出的速度,有低速、中速、高速,我选择高速。但是事情到这里还没有结束
接下来还需要选择具体输出模式,有四种:
- 推挽输出
- 开漏输出
- 复用推挽输出
- 复用开漏输出
先不看复用,就从开漏和推挽展开,这样去理解:
推挽,就是说1不2,输出高电平就是高电平,输出低电平就是低电平,它的驱动比较稳定。
开漏,通常会有一个默认输出电平,然后通过某个触发开关,让它输出电平发生变化,关掉这个开关就会恢复默认输出电平。
试着反问:如果使用开漏会出现一个怎样的情况?
- 输出高电平的时候,其实并没有真正的输出高电平
- 只是将MOS管断开
- 如果没有外部上拉,LED就不会工作。
所以我需要的是一个能够主动输出高、低电平,而不是要去依赖外部
③控制对应引脚输出正确电平
为什么?
LED本质上是二极管,只有形成电流回路才能发光。