stm32基础电路分析+蜂鸣器
总流程
1.分析电路图-查看哪些电路是连接的灯
你得知道自己需要配置哪个端口-分析电路图

🔹 1. 浮空输入(Floating Input)
- 端口状态:内部无上拉/下拉电阻,引脚电平由外部电路决定;若悬空,电平不确定(易受干扰)。
- 用途:连接外部已带确定电平(如按键+上拉电阻、传感器输出)的信号源。
- 注意 :严禁悬空使用!否则可能引起功耗异常或误触发。
🔹 2. 上拉输入(Pull-up Input)
- 端口状态:内部接一个约40kΩ上拉电阻到VDD;默认高电平,外部拉低时为低电平。
- 用途:常用于按键检测(按键一端接地,另一端接引脚),无需外接电阻。
- 优点:简化电路,抗干扰能力较好。
🔹 3. 下拉输入(Pull-down Input)
- 端口状态:内部接一个约40kΩ下拉电阻到GND;默认低电平,外部拉高时为高电平。
- 用途:较少用,适用于需要默认低电平的场景(如某些通信协议的空闲态)。
- 注意:部分STM32型号(如F0/F1)不支持内部下拉,需外接。
🔹 4. 模拟输入(Analog Input)
- 端口状态:GPIO数字功能关闭,直接连通到ADC模块;引脚阻抗高,无施密特触发器(Schmitt trigger)。
- 用途:连接模拟信号(如电位器、传感器电压输出),供ADC采样。
- 关键点 :
- 必须配置为模拟输入模式才能被ADC读取;
- 不可用于数字逻辑判断(无数字电平转换);
- 避免高频噪声干扰(建议加RC滤波)。
🔹 5. 通用推挽输出(General-purpose Push-Pull Output)
- 端口状态:内部PMOS + NMOS组成推挽结构;可主动输出高电平(≈VDD)或低电平(≈GND)。
- 驱动能力 :较强(典型mailto:20mA@3.3V),可直接驱动LED、继电器(需限流/续流保护)。
- 用途:通用数字输出(如控制LED、蜂鸣器、使能信号等)。
- 注意 :不能并联多个推挽输出引脚(会短路!)。
🔹 6. 复用推挽输出(Alternate Function Push-Pull Output)
- 端口状态 :同通用推挽,但输出信号来自片内外设功能(如USART TX、SPI MOSI、TIM CHx等)。
- 用途:外设功能引脚(如串口发送、PWM输出、I²C SDA/SCL在特定模式下)。
- 关键点 :
- 需先开启对应外设时钟,并配置AFR寄存器;
- 实际输出由外设控制,不是CPU直接写ODR。
🔹 7. 通用开漏输出(General-purpose Open-Drain Output)
- 端口状态:仅NMOS管导通到GND,高电平靠外部上拉电阻实现;输出"0"时低电平,输出"1"时高阻态。
- 特点 :
- 可实现电平转换(如3.3V MCU驱动5V总线);
- 支持**线与(Wired-AND)**逻辑(多设备共享总线,如I²C);
- 驱动电流较小(受限于上拉电阻)。
- 用途:I²C总线、单总线(1-Wire)、中断信号线等。
🔹 8. 复用开漏输出(Alternate Function Open-Drain Output)
- 端口状态:同通用开漏,但信号来自外设(如I²C SDA/SCL、USART RTS/CTS等)。
- 典型应用 :
- I²C接口必须配置为复用开漏输出(因协议要求线与特性);
- 某些串口硬件流控信号(RTS/CTS)也常用此模式。
- 注意:即使配置为开漏,仍需外接上拉电阻(通常4.7kΩ~10kΩ)。
然后由上可知是
PB5和PE5控制灯
然后分析PE5和PB5的模式
首先外部由3.3v的电源,灯要亮则需要有电势差
那么就需要低电平
那么PE5和PB5端口就需要输出低电平从而让灯有电势差从而亮灯
而且要被MCU控制
那么总结下就是通用推挽模式
LED阳极接 +3.3V,阴极通过限流电阻接 GPIO(PB5/PE5)→ 这是"共阳极"接法
→ 要点亮 LED,需让 GPIO 输出低电平(0),形成电流回路:
+3.3V → LED → 限流电阻 → GPIO(低电平)→ GND(内部NMOS导通)
→ 若 GPIO 输出高电平(1),则阴极≈+3.3V,无压差 → LED 熄灭。
2.时钟就是通电的,告诉 MCU 给我电
."MCU 里每个功能模块(比如 GPIO 端口)默认都是'断电关机'状态。
要想用它,就得先给它'通电开机'------这个'通电开机'的操作,就是通过 RCC 开启它的时钟。
不开时钟,你后面所有配置都是白写,MCU 根本不理你!"
那么这里就要打开时钟
那么要打开时钟就必须知道需要打开哪个时钟


3.分析文档可知要打开对应的时钟控制模块则需要打开APB2从而打开对应的GPIOA和GPIOE

4.那么按照上图只需要打开APB2即可,打开时钟APB2


首先分析时钟需要打开的时钟
IO Port B Enable
(即:GPIO 端口 B 使能)

所以要打开IOPBEN和IPEEN

根据复位值按照32位展开
生成掩码时,完全不碰寄存器(包括复位值)!
掩码是独立计算出来的常量,只用于后续的位操作。

然后没写占用四位,则每个占一位,而且需要让第三位和第六位为1
由于C语言特性只能对整体操作,那么这里就需要左移然后位或

原理:先把1置于你要操作的位数
把1左移6位置,然后变为
然后使用操作位或操作
只要有一个是 1,结果就是 1


左移(<<)和右移(>>)的核心用途之一,就是构造一个"只有某一位是 1(或 0),其余位为 0(或 1)"的掩码(mask),然后与寄存器进行位运算,实现对特定位的设置、清除或检测。然后把这个掩码与寄存器当前值进行位运算得出目标值
1.对时钟先进行清0
即为制作一个全为1的数然后取反即可
RCC->APB2ENR &= ~(0xFFFFFFFF);
1111 1111 1111 1111 1111 1111 1111 1111
取反后
0000 0000 0000 0000 0000 0000 0000 0000
2.然后第6位置1然后位或即可
按照上方的红色颜色的讲解
只要两个操作数的对应位中 有一个为 1,结果位就是 1。
只有当两个对应位 都为 0 时,结果位才是 0。
把 0000 0000 0000 0000 0000 0000 0000 1000
寄存器当前值进行位或操作
0000 0000 0000 0000 0000 0000 0000 0000
即得出结果
0000 0000 0000 0000 0000 0000 0000 1000
然后是操作
即可
上面就是打开时钟的

下面正式的点蜂鸣器,对应PB5直接分析模式然后直接开,按照中文手册的readme即可
#include "beep.h"
/*
* 初始化并打开蜂鸣器
* 配置 PB8 为通用推挽输出(2 MHz),并输出高电平
*/
void beep_open(void) {
// 使能 GPIOB 时钟(APB2ENR 第3位)
RCC->APB2ENR |= (1 << 3);
// 配置 PB8 为通用推挽输出(2MHz)
// PB8 对应 CRH 寄存器的 3:0 位(第 0~3 位)
GPIOB->CRH &= ~(0xF << 0); // 清除 PB8 的配置位
GPIOB->CRH |= (0x2 << 0); // 设置为 2MHz 推挽输出
// 输出高电平,开启蜂鸣器
GPIOB->BSRR = (1 << 8);
}