
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。那么到底是谁连接过去答案就是AFAlternate Function配置。所以不是 GPIO 自己产生 PWM。而是TIM1 产生 PWM。 ↓ AF把TIM1连接到PA9。 ↓ PA9输出PWM。这是很多初学者容易混淆的地方。个人总结一个GPIO引脚更像一个交通枢纽它不仅只能单纯的输出高低电平和等待输入的高低电平而是连接着功能模块比如定时器、串口、I2C通信。比如PA9到底是哪一个功能模块想连接过去就需要AF配置所以不是GPIO自己产生PWM而是某个定时器产生PWMAF把TIM1连接到PA9然后PA9才输出PWM的AI总结STM32 将不同的功能划分为多个独立的硬件模块每个模块只有在获得时钟后才能工作。一个功能往往不是由某一个模块单独完成而是由多个模块协同完成。例如输出 PWM需要 GPIO 模块负责引脚输出、定时器模块负责产生 PWM 信号两者都必须使能时钟并完成相应配置从这里就可以看到了打开对应模块时钟不仅仅只是针对从GPIOX中做选择了还有许多模块②配置工作模式配置高速输出模式推挽输出模式为什么STM32的一个引脚所承载的功能远比51丰富。例如一个 PA8 可能既可以是GPIOUSARTSPII2CPWM输入捕获MCO…硬件不知道你到底想让它干什么。因此需要你告诉它“今天你就是一个 GPIO 输出。”所以我们就需要单独针对输入和输出来进行一个配置了。假如引脚连接的是LED的负极就需要给LED输入低电平站在单片机的视角上就是单片机控制该引脚输出低电平因此就得配置输出模式在这里还可以选择输出的速度有低速、中速、高速我选择高速。但是事情到这里还没有结束接下来还需要选择具体输出模式有四种推挽输出开漏输出复用推挽输出复用开漏输出先不看复用就从开漏和推挽展开这样去理解推挽就是说1不2输出高电平就是高电平输出低电平就是低电平它的驱动比较稳定。开漏通常会有一个默认输出电平然后通过某个触发开关让它输出电平发生变化关掉这个开关就会恢复默认输出电平。试着反问如果使用开漏会出现一个怎样的情况输出高电平的时候其实并没有真正的输出高电平只是将MOS管断开如果没有外部上拉LED就不会工作。所以我需要的是一个能够主动输出高、低电平而不是要去依赖外部③控制对应引脚输出正确电平为什么LED本质上是二极管只有形成电流回路才能发光。