前言
使用STM32CubeIDE实现蜂鸣器实验。
硬件:STM32F103C8T6最小系统板 + 自制扩展板
软件:STM32CubeIDE
一、实验目的
实现扩展板上的蜂鸣器每500ms鸣叫一次,LED1每500ms闪烁一次。
二、学习内容
- 进一步学习GPIO的输出使用
三、实践操作
1.硬件介绍
硬件:STM32F103C8T6最小系统板 + 自制扩展板
自制扩展板中有一个蜂鸣器与LED灯,LED1为蓝灯;蜂鸣器的IO为PA15,LED1的IO为PB3;蜂鸣器为高电平有效,LED1为低电平有效;无外部上拉电阻(最好在硬件上进行上下拉操作),需在软件中进行弱上拉/下拉。
原理图如下图所示(仅介绍蜂鸣器,LED在上一篇文章中有介绍):
由上图可以看出,当PA15为高电平时,三极管导通,5V通过蜂鸣器到GND,形成回路,蜂鸣器鸣叫。
为什么要多加一个蜂鸣器?因为STM32F103C8T6的IO口最大输出电流为25mA,但蜂鸣器的驱动电流为30mA左右*,因此需要三极管增大IO口的驱动能力(扩流)。
实物图如下图所示:
2.软件介绍
首先新建工程并进行初始化配置:
在此不进行赘述,详细步骤可移步至上一篇文章:2.STM32CubeIDE跑马灯实验
与上一篇文章不同的是,需要配置PA15,如下图所示:
由上图可以看到,需要将PA15配置为初始化为低电平;推挽输出模式;配置弱下拉;进行引脚重命名(用户标签)(Buzzer -> PA15)。
接下来进行蜂鸣器实验的代码编程
- 为了使代码更加简洁,同样采用新建文件夹的方式存放beep.h与beep.c文件,并且用宏定义的方式改变蜂鸣器的状态,详细步骤可移步至上一篇文章:2.STM32CubeIDE跑马灯实验。
其中beep.h文件代码如下:
#ifndef BSP_BEEP_BEEP_H_
#define BSP_BEEP_BEEP_H_
#include "main.h"
/* 宏定义 */
/* 三目操作符
* x为1时,执行HAL_GPIO_WritePin(GPIOA, Buzzer_Pin, GPIO_PIN_SET) 高电平,蜂鸣器响
* x为0时,执行HAL_GPIO_WritePin(GPIOA, Buzzer_Pin, GPIO_PIN_RESET) 低电平,蜂鸣器不响
*/
#define BEEP(x) x ? HAL_GPIO_WritePin(GPIOA, Buzzer_Pin, GPIO_PIN_SET) : \
HAL_GPIO_WritePin(GPIOA, Buzzer_Pin, GPIO_PIN_RESET)
#endif /* BSP_BEEP_BEEP_H_ */
- 编写main.c,首先需要包含beep.h头文件,可采用相对路径或绝对路径,具体区别与方法移步至上一篇文章:2.STM32CubeIDE跑马灯实验。
接下来就是编写控制逻辑代码,根据实验目的,具体代码如下:
/* USER CODE BEGIN WHILE */
while (1)
{
LED1(0); /* LED1亮 */
BEEP(0); /* 蜂鸣器不响 */
HAL_Delay(500); /* 延时500ms */
LED1(1); /* LED1灭 */
BEEP(1); /* 蜂鸣器响 */
HAL_Delay(500); /* 延时500ms */
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
}
/* USER CODE END 3 */
具体现象:蜂鸣器响的时候LED1不亮,蜂鸣器不响的时候LED1亮。
由此就可以实现蜂鸣器每500ms鸣叫一次,LED1每500ms闪烁一次的效果啦!
总结
本篇介绍了如何实现一个蜂鸣器实验,分别从硬件方面与软件方面阐述,在硬件方面主要介绍了硬件组成与原理图分析,在软件方面主要介绍了beep.h与main.c文件的代码编写。完美完成本文开篇提到的学习任务与功能!
对于实验复现,可修改LED与蜂鸣器对应的GPIO,无需限制在本文的PB3与PA15,了解原理之后,可以做出更有趣的功能!