3.STM32F407之HAL库——蜂鸣器

本文介绍如何使用STM32CubeMX配置工程并利用MDK-ARM编写代码来实现蜂鸣器的基本控制功能。文章首先概述了蜂鸣器的工作原理,并详细说明了有源与无源蜂鸣器的区别及驱动方法。接着介绍了使用STM32CubeMX进行配置的具体步骤,最后给出了通过GPIO操作蜂鸣器的代码实例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

使用STM32CubeMX配置工程+MDKARM编写代码实现蜂鸣器控制

一、蜂鸣器简介

  蜂鸣器是一种一体化结构的电子讯响器,采用直流电压供电,广泛应用于计算机、打印机、复印机、报警器、电子玩具、汽车电子设备、电话机、定时器等电子产品中作发声器件。蜂鸣器主要分为压电式蜂鸣器和电磁式蜂鸣器两种类型。

  蜂鸣器的发声原理由振动装置和谐振装置组成,而蜂鸣器又分为无源他激型与有源自激型。

  无源他激型蜂鸣器的工作发声原理是:方波信号输入谐振装置转换为声音信号输出。

  有源自激型蜂鸣器的工作发声原理是:直流电源输入经过振荡系统的放大取样电路在谐振装置作用下产生声音信号。

  主要是要区分有源和无源的蜂鸣器,两种蜂鸣器的驱动方式是不一样的。有源蜂鸣器采用点平驱动(电平驱动又分为,高电平触发和低电平触发)、无源蜂鸣器采用PWM波驱动,频率越高音调就越高。而有源蜂鸣器的音调是固定的,因为频率是固定的。
  尤其自己做东西的时候,购买元器件,一定要看清楚是有源的还是无源的蜂鸣器。
  这里用的是高电平触发的有源蜂鸣器,给高电平就能响,低电平就关了。连接的引脚是PF8。

二、STM32CubeMX配置

配置

三、代码实现

  代码实现基本上就和LED灯一样。
  定义宏函数

//BEEP control
#define Beep_On     HAL_GPIO_WritePin(BEEP_GPIO_Port,BEEP_Pin,GPIO_PIN_SET)
#define Beep_Off    HAL_GPIO_WritePin(BEEP_GPIO_Port,BEEP_Pin,GPIO_PIN_RESET)
#define Beep_Toggle HAL_GPIO_TogglePin(BEEP_GPIO_Port,BEEP_Pin)

  在主函数中去写功能,验证蜂鸣器功能

  /* USER CODE BEGIN WHILE */
  while (1)
  {
    /* USER CODE END WHILE */		
    /* USER CODE BEGIN 3 */
		Beep_On;//打开蜂鸣器
		for(int i=0;i<10;i++)
		{
			HAL_Delay(1000);//延时
		}
		Beep_Off;//关闭蜂鸣器
		for(int i=0;i<10;i++)
		{
			HAL_Delay(1000);//延时
		}
  }
  /* USER CODE END 3 */

  注意代码要放在 USER BEIN 和END之间,要不然重新用Cube生成工程的时候就会消失。

  感谢各位的浏览。鄙人水平有限,很多地方写的感觉差强人意,如果有不对的地方欢迎指正。

### 使用 STM32 HAL 控制外部蜂鸣器 为了实现对外部蜂鸣器的有效控制,可以利用STM32的GPIO接口以及定时器产生的PWM波形来调整声音频率。下面是一个具体的实例说明。 #### 创建新项目并配置硬件资源 在CubeIDE环境中创建新的STM32工程时,应按照特定开发板的要求选择相应的微控制器型号[^1]。对于本案例而言,假设采用的是STM32F4 Discovery板作为平台,则需指定对应的MCU类型,并完成必要的初始化设置工作。 #### 配置 GPIO 和 TIM 定时器 为了让蜂鸣器正常发声,需要将其一端接到电源正极VCC上,另一端通过限流电阻连接至选定的I/O口(比如PF6),该引脚被设定为推挽输出模式以便驱动负载设备。与此同时,还需开启一个通用定时器(例如TIM2)用于生成周期性的脉宽调制(PWM)信号,进而改变占空比以影响发出的声音特性[^4]。 ```c // 初始化GPIO和定时器 static void MX_GPIO_Init(void){ __HAL_RCC_GPIOF_CLK_ENABLE(); GPIO_InitStruct.Pin = GPIO_PIN_6; GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; // 推挽输出 GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; HAL_GPIO_Init(GPIOF, &GPIO_InitStruct); } static void MX_TIM2_Init(void){ __HAL_RCC_TIM2_CLK_ENABLE(); htim2.Instance = TIM2; TIM_OC_InitTypeDef sConfigOC; htim2.Init.Prescaler = 8399; htim2.Init.CounterMode = TIM_COUNTERMODE_UP; htim2.Init.Period = 999; htim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; htim2.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE; if (HAL_TIM_PWM_Init(&htim2) != HAL_OK){ Error_Handler(); } sConfigOC.OCMode = TIM_OCMODE_PWM1; sConfigOC.Pulse = 499; sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH; sConfigOC.OCFastMode = TIM_OCFAST_DISABLE; if (HAL_TIM_PWM_ConfigChannel(&htim2, &sConfigOC, TIM_CHANNEL_1) != HAL_OK){ Error_Handler(); } } ``` #### 编写播放函数 接下来定义`Play_Tone()`方法接收两个参数——频率Hz与持续时间ms,内部逻辑会计算出合适的计数初值及预分频系数赋给定时寄存器;随后启动通道输出直至达到预定秒数为止。最后再提供一个简单的歌曲演奏程序片段供参考: ```c void Play_Tone(uint16_t freq_hz,uint32_t duration_ms){ uint32_t period_us=(uint32_t)(1e6/freq_hz); uint32_t prescaler_value=SystemCoreClock/(freq_hz*period_us)-1; /* 设置定时器 */ htim2.Instance->PSC=prescaler_value; htim2.Instance->ARR=period_us/2-1; /* 开启PWM输出 */ HAL_TIM_PWM_Start(&htim2,TIM_CHANNEL_1); HAL_Delay(duration_ms); /* 停止PWM输出 */ HAL_TIM_PWM_Stop(&htim2,TIM_CHANNEL_1); } /* 播放一首简单的小曲子 */ void Play_Song(){ const int notes[]={ NOTE_C4,NOTE_D4,NOTE_E4, NOTE_F4,NOTE_G4,NOTE_A4, NOTE_B4,NOTE_C5}; for(int i=0;i<sizeof(notes)/sizeof(*notes);++i){ Play_Tone(notes[i],500); } } ``` 以上就是使用STM32 HAL配合外接有源蜂鸣器制作简易音乐盒的大致流程[^3]。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值