
1.1 项目信息功能基于寄存器操作实现 PB2 引脚控制无源蜂鸣器间歇发声芯片型号STM32F10x版权atguigu驱动器件无源蜂鸣器方波驱动直流电平无法发声1.2 实现目标寄存器直接操作 GPIO不调用标准库封装函数输出固定频率方波驱动无源蜂鸣器鸣叫鸣叫一段时间后暂停循环间歇发声提供 SysTick 高精度微秒 / 毫秒 / 秒延时基础函数。2 硬件原理说明2.1 硬件连接控制引脚GPIOB Pin2PB2无源蜂鸣器驱动逻辑 无源蜂鸣器内部无振荡电路必须输入一定频率方波才能发声恒定高 / 低电平仅无声或微弱杂音。电路要求PB2 增加三极管驱动电路GPIO 驱动电流不足无法直接驱动蜂鸣器高电平导通三极管蜂鸣器得电。2.2 时钟与 IO 配置参数系统主频72MHzIO 模式通用推挽输出最大翻转速度 50MHz初始电平低电平蜂鸣器断电静音3 寄存器原理详解3.1 RCC_APB2ENR 外设时钟寄存器c运行RCC-APB2ENR | RCC_APB2ENR_IOPBEN;作用使能 GPIOB 端口外设时钟GPIO 未开时钟时寄存器读写无效。3.2 GPIOB_CRL 端口配置低寄存器PB0~PB7PB2 对应寄存器 bit8~bit11每组 4bit 控制一个引脚清除原有配置GPIOB-CRL ~(0x0F 8)设置模式写入0x03→ 50MHz 通用推挽输出bit0-101 通用输出模式bit2-311 最大速度 50MHz3.3 GPIOB_ODR 输出数据寄存器关闭蜂鸣器GPIOB-ODR ~(1 2)PB2 输出低电平电平翻转生成方波GPIOB-ODR ^ (1 2)异或翻转引脚电平3.4 SysTick 系统滴答定时器延时底层SysTick 挂载内核时钟 72MHzLOAD 装载计数值 72 × 微秒数 倒计时完成后 COUNTFLAG 置 1作为延时判断标志实现高精度微秒延时。4 代码分层功能说明4.1 全局函数声明c运行void Delay_us(uint16_t us); // 微秒级延时 void Delay_ms(uint16_t ms); // 毫秒级延时 void Delay_s(uint16_t s); // 秒级延时 void delay_10us(u16 ten_us); // 10us单位延时封装4.2 main () 主函数流程开启 GPIOB 时钟APB2 总线 IOPB 时钟使能PB2 模式配置CRL 寄存器配置为 50MHz 推挽输出初始静音ODR 置 PB2 低电平主循环逻辑plaintextwhile(1) { 循环2000次翻转PB2电平 1000us延时 → 输出固定频率方波蜂鸣器鸣叫 强制拉低PB2停止方波输出蜂鸣器静音 }方波周期翻转间隔 1000us完整周期 2000us频率 500Hz单次鸣叫时长2000 次翻转持续约 2s无延时间隔鸣叫结束立刻再次启动鸣叫持续间歇滴滴声。4.3 延时函数说明delay_10us1 个单位代表 10 微秒调用底层 Delay_usDelay_usSysTick 硬件精准延时72MHz 专用配置Delay_ms循环调用 1000us 延时实现毫秒延时Delay_s循环调用 1000ms 延时实现秒级延时。5 运行时序与发声参数方波频率500Hz单次电平保持 1000μs高低电平完整周期 2000μs单次鸣叫持续时间 2000 次 × 1000μs 2000000μs 2 秒发声效果持续 2 秒 500Hz 蜂鸣无停顿立刻重复鸣叫连续短促长鸣循环。6 编译与运行说明6.1 开发环境内核Cortex-M3芯片库STM32F10x 标准外设库仅调用寄存器地址无库函数封装编译工具Keil MDK / STM32CubeIDE6.2 编译注意事项系统时钟必须配置为 72MHz否则 Delay_us 延时不准、发声频率偏移无源蜂鸣器必须搭配驱动三极管直接 GPIO 驱动音量极小如需调整音调修改delay_10us(100)参数数值越大延时越长频率越低声音低沉数值越小频率越高声音尖锐如需调整鸣叫时长修改u16 i 2000循环次数数值越大鸣叫时间越长。7 故障排查蜂鸣器完全无声排查GPIOB 时钟是否开启、PB2 输出模式是否配置正确、硬件三极管接线是否颠倒验证屏蔽循环翻转代码手动拉高 PB2测量引脚电平是否变化。蜂鸣器杂音 / 微弱响声原因延时参数错误方波频率偏离蜂鸣器谐振区间或系统时钟不是 72MHz蜂鸣器常鸣不间歇代码逻辑当前鸣叫结束无停顿延时如需停顿需在GPIOB-ODR ~(1 2);后增加Delay_ms(500)等停顿延时。8 扩展修改方案8.1 增加鸣叫停顿鸣叫 2s暂停 0.5s 循环在静音代码后添加毫秒延时c运行GPIOB-ODR ~(1 2); Delay_ms(500); // 暂停500ms8.2 修改音调升高频率将delay_10us(100)改为delay_10us(50)方波周期变短音调变高。8.3 切换 IO 引脚如 PB5修改 CRL 移位偏移量4 * 5ODR 移位1 5即可更换输出引脚。9 详细代码#include stm32f10x.h void Delay_us(uint16_t us); void Delay_ms(uint16_t ms); void Delay_s(uint16_t s); void delay_10us(u16 ten_us); int main(void) { RCC-APB2ENR | RCC_APB2ENR_IOPBEN; GPIOB-CRL ~(0x0F (4 * 2)); GPIOB-CRL | (0x03 (4 * 2)); GPIOB-ODR ~(1 2); while(1) { u16 i 2000; while(i--) { GPIOB-ODR ^ (1 2); delay_10us(100); } GPIOB-ODR ~(1 2); } } void delay_10us(u16 ten_us) { Delay_us(ten_us * 10); } void Delay_us(uint16_t us) { SysTick-LOAD 72 * us; SysTick-CTRL | 0x05; while ((SysTick-CTRL SysTick_CTRL_COUNTFLAG) 0); SysTick-CTRL ~SysTick_CTRL_ENABLE; } void Delay_ms(uint16_t ms) { while (ms--) { Delay_us(1000); } } void Delay_s(uint16_t s) { while (s--) { Delay_ms(1000); } }