【STM32单片机_(HAL库)】2-3【GPIO】驱动蜂鸣器

1.硬件

2.软件

#include "sys.h"
#include "delay.h"
#include "beep.h"


int main(void)
{
    HAL_Init();                         /* 初始化HAL库 */
    stm32_clock_init(RCC_PLL_MUL9);     /* 设置时钟, 72Mhz */
    beep_init();                         /* 初始化蜂鸣器 */

    while(1)
    { 
        beep_on();
        delay_ms(500);
        beep_off();
        delay_ms(500);
    }
}


  • beep.c程序
#include "beep.h"
#include "sys.h"

//初始化GPIO函数
void beep_init(void)
{
    GPIO_InitTypeDef gpio_initstruct;
    //打开时钟
    __HAL_RCC_GPIOB_CLK_ENABLE();                           // 使能GPIOB时钟
    
    //调用GPIO初始化函数
    gpio_initstruct.Pin = GPIO_PIN_8;                       // 蜂鸣器对应的引脚PB8
    gpio_initstruct.Mode = GPIO_MODE_OUTPUT_PP;             // 推挽输出
    gpio_initstruct.Pull = GPIO_PULLUP;                     // 上拉
    gpio_initstruct.Speed = GPIO_SPEED_FREQ_HIGH;           // 高速
    HAL_GPIO_Init(GPIOB, &gpio_initstruct);
    //关闭蜂鸣器
    beep_off();
}

//打开蜂鸣器的函数
void beep_on(void)
{
    HAL_GPIO_WritePin(GPIOB, GPIO_PIN_8, GPIO_PIN_RESET);   // 拉低蜂鸣器引脚,打开蜂鸣器
}

//关闭蜂鸣器的函数
void beep_off(void)
{
    HAL_GPIO_WritePin(GPIOB, GPIO_PIN_8, GPIO_PIN_SET);     // 拉高蜂鸣器引脚,关闭蜂鸣器
}

  • beep.h程序
#ifndef __BEEP_H__
#define __BEEP_H__

void beep_init(void);
void beep_on(void);
void beep_off(void);

#endif

3.实物效果

  • 硬件模块接线
    蜂鸣器—>单片机
    VCC(3.3V)—>VCC
    GND—>GND
    I/O—>PB8
    ST-Link下载方式
  • 实验现象
    蜂鸣器(有源)间隔500ms响。
    请添加图片描述

驱动蜂鸣器实验keil源文件

### 使用 STM32 HAL 实现蜂鸣器驱动 #### 配置硬件资源 为了使用STM32 HAL驱动蜂鸣器,首先需要配置相应的硬件资源。对于有源蜂鸣器而言,只需将其连接到一个GPIO引脚即可;而对于无源蜂鸣器,则通常会涉及到PWM信号的生成以及可能还需要额外的元件如三极管来进行电流放大[^2]。 #### 初始化定时器用于 PWM 输出 如果计划采用PWM方式控制蜂鸣器发声频率从而改变音调的话,在初始化阶段应该设置好对应的TIMx时钟分频系数、自动重装载值ARR及捕获比较寄存器CCRx等参数以形成所需的占空比波形。例如可以初始化定时器4的通道2为PWM输出模式[^4]: ```c __HAL_RCC_TIM4_CLK_ENABLE(); // 使能 TIM4 时钟 htim4.Instance = TIM4; htim4.Init.Prescaler = 83; // 设置预分频数,假设系统时钟为84MHz则此处可得1kHz的基础频率 htim4.Init.CounterMode = TIM_COUNTERMODE_UP; htim4.Init.Period = 999; // 自动重载值决定最大计数值 htim4.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; if (HAL_TIM_PWM_Init(&htim4) != HAL_OK){ Error_Handler(); } ``` #### 控制 GPIO 或者 PWM 来操作蜂鸣器 针对不同的需求可以择直接操控GPIO高低电平让有源蜂鸣器发出固定声音,也可以通过调整PWM周期和脉宽使得无源蜂鸣器能够产生变化多端的声音效果。下面给出一段简单的例子用来开启/关闭蜂鸣器发声: ```c // 对于有源蜂鸣器可以直接控制IO口 #define BUZZER_PIN GPIO_PIN_12 #define BUZZER_PORT GPIOD void Buzzer_On(void){ HAL_GPIO_WritePin(BUZZER_PORT,BUZZER_PIN,GPIO_PIN_SET); } void Buzzer_Off(void){ HAL_GPIO_WritePin(BUZZER_PORT,BUZZER_PIN_RESET); } ``` 而如果是想要用PWM去调节音高,则可以通过修改`__HAL_TIM_SetCompare()`函数中的第二个参数即CCRx的值来达到目的。比如要设定某个特定频率下的方波输出就可以这样做: ```c uint32_t freq=1000;// 设定目标频率(Hz) float duty_cycle=.5f ;// 占空比范围[0~1] /* 计算 CCR 寄存器应填入的数据 */ uint32_t ccr_value=(freq*duty_cycle*(__HAL_TIM_GET_AUTORELOAD(&htim4)+1))/((SystemCoreClock/(htim4.Init.Prescaler+1))); /* 更新指定通道上的捕获/比较寄存器 */ __HAL_TIM_SetCompare(&htim4,TIM_CHANNEL_2,ccr_value); /* 开启对应通道的PWM输出 */ HAL_TIM_PWM_Start(&htim4,TIM_CHANNEL_2); ``` 上述代码片段展示了如何基于STM32 HAL完成对蜂鸣器的基本控制逻辑设计,具体应用还需根据实际产品特性做适当调整优化[^1][^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值