news 2026/7/6 4:42:33

1.点亮一颗小小的LED

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
1.点亮一颗小小的LED

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本质上是二极管,只有形成电流回路才能发光。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/6 4:42:31

Embedding是什么,为什么文本能变成向量

完整学习LLM(五):Embedding是什么,为什么文本能变成向量好家伙, 先贴一篇好文章 https://developers.openai.com/api/docs/guides/embeddings (openai团队写的,值得信赖)上一篇我们聊了 Token.当时说到一句话:文字进入模型之前,要先变成 token.模型生成答案时,也是一个 token 一…

作者头像 李华
网站建设 2026/7/6 4:36:40

Layout 组件 + Store 模块的双层架构:关注点分离如何在中后台落地

前端架构的终极考题 "关注点分离"这四个字谁都听过,但到了实际项目里,最常见的两个问题: 组件之间怎么通信才能不互相依赖? 状态怎么划分才能不"一个文件 500 行"? 这套经典中后台模板的 Layout 组件 + Store 模块架构,把两个问题一次性回答了。这篇…

作者头像 李华
网站建设 2026/7/6 4:35:59

彻底搞懂RAG技术原理、落地流程与工程优化

彻底搞懂RAG技术原理、落地流程与工程优化 前言 当下大模型落地企业业务最大的三大痛点:知识滞后、AI幻觉、无法接入私有数据。直接调用原生LLM很难满足企业知识库、内部文档、实时业务数据问答需求,而RAG(检索增强生成)是目前工业…

作者头像 李华
网站建设 2026/7/6 4:35:13

从全连接层到Transformer FFN:3种网络结构图的演进与绘制要点

从全连接层到Transformer FFN:3种网络结构图的演进与绘制要点在深度学习的发展历程中,全连接层(Fully Connected Layer)作为最基础的神经网络组件,经历了从单一结构到复杂架构核心模块的演变。本文将带您深入解析基础全…

作者头像 李华