stm32—蜂鸣器

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);

}