目录
本人使用的是朗峰 STM32F103 系列开发板,此笔记基于这款开发板记录。
1 、电路构成及原理图
首先,通过朗峰 F1 开发板原理图看到,蜂鸣器 BEEP 是有源蜂鸣器,这样使用起来就很简单,只要给蜂鸣器接上 3.3-5v 电源,蜂鸣器就会持续的发出声音。Ok,我们看到蜂鸣器的正极端已连接到开发板的 3.3v 电源上了,另一端连接到 STM32F103RCT6 的通用输入输出端口 GPIO 的 PC5 引脚上,也就是说我们只要通过编写代码让PC5 端口输出低电平蜂鸣器就可以发出声音来了.
2、编写实现代码
大家都晓得 C 语言的源文件和头文件也就是.c .h 这种结构。其中源文件.c 主要是函数的实现,头文件.h 则是对应源文件中函数的声明。
main.c
#include "main.h"
/**
* @brief 0经验值动手之GPIO旅---启用蜂鸣器
* @Board 朗峰 STM32 F103RCT6系列开发板
* @author langfeng
*/
int main(void)
{
/*HAL库初始化*/
HAL_Init();
/*初始化系统时钟频率为72MHz及延时函数初始化*/
SystemClock_init(RCC_PLL_MUL9);
/*蜂鸣器IO初始化*/
beep_init();
while (1)
{
beep_H; //蜂鸣器io引脚置高电平 蜂鸣器不发声
delay_ms(500); //延时500毫秒
beep_L; //蜂鸣器io引脚置低电平 蜂鸣器发"哔哔"声
delay_ms(500); //延时500毫秒
}
}
beep.c
/**
* @brief 蜂鸣器驱动代码
* @file beep.c
* @author langfeng
* @date 2021-12-18
* @version V1.1
* @Board 朗峰 STM32 F103RCT6系列开发板
*/
#include "beep.h"
/*蜂鸣器IO初始化*/
/**
* @brief 蜂鸣器初始化函数
* @param none
* @retval none
*/
void beep_init(void)
{
GPIO_InitTypeDef GPIO_Init; //GPIO_Init:GPIO_InitTypeDef结构体类型的变量
//使用GPIO之前必须开启GPIO端口时钟
__HAL_RCC_GPIOC_CLK_ENABLE(); //开启GPIOC时钟
GPIO_Init.Pin=GPIO_PIN_5|GPIO_PIN_13; //BEEP IO引脚PC5 PC13是LCD屏背光
GPIO_Init.Mode=GPIO_MODE_OUTPUT_PP; //输出模式选择推挽输出
GPIO_Init.Pull=GPIO_PULLUP; //激活上拉
GPIO_Init.Speed=GPIO_SPEED_FREQ_HIGH; //IO速度设为高速
HAL_GPIO_Init(GPIOC,&GPIO_Init); //按以上设置初始化IO引脚
HAL_GPIO_WritePin(GPIOC,GPIO_PIN_5,GPIO_PIN_SET); //默认蜂鸣器不蜂鸣
HAL_GPIO_WritePin(GPIOC,GPIO_PIN_13,GPIO_PIN_RESET);//未使用LCD屏关闭背光以节电
}
beep.h
#ifndef __BEEP_H_
#define __BEEP_H_
#include "stm32f1xx_hal.h"
#include "User_Settings.h"
/**
* @brief 蜂鸣器驱动代码
* @file beep.c
* @author langfeng
* @date 2021-12-18
* @version V1.1
* 应用开发板 朗峰 STM32 F103RCT6系列开发板
*/
#define beep_H PCout_1(GPIO_PIN_5) //宏定义蜂鸣器引脚PC5输出高电平
#define beep_L PCout_0(GPIO_PIN_5) //宏定义蜂鸣器引脚PC5输出低电平
void beep_init(void); //蜂鸣器IO初始化
#endif
3、代码讲解
源文件 beep.c 比较简单就是蜂鸣器的初始化函数。
函数的首行是GPIO初始化句柄:GPIO_Initure,至于GPIO_InitTypeDef,也是在 HAL 库文件 stm32f1xx_hal_gpio.h 封装好的结构体。
首先,开启GPIOC时钟,因为我们的蜂鸣器连接在端口C上( PC5)引脚上。这个也是现成的库函数也是初始化必须有的内容,记住。
其次,设定 GPIO 引脚号是 5,至于是 A,B,C….F 哪个端口的引脚5在HAL_GPIO_Init(GPIOC,&GPIO_Initure);这行说明了是端口C。
紧接着设定这个端口的工作模式是推挽输出(因为要驱动蜂鸣器)再下来设定引脚为上拉模式 GPIO_Initure.Pull=GPIO_PULLUP;也是视具体需要设定是上拉还是下拉亦或浮空。
GPIO_Initure.Speed=GPIO_SPEED_FREQ_HIGH; 此行是设置引脚的速度是高速,这个好理解,只要硬件条件允许谁不愿意快速跑啊。右键 GPIO_SPEED_FREQ_HIGH 可以打开看一下,很明了,速度.有低速、中速、高速三个选择.
最 后 , 以 上 初 始 化 内 容 都 设 置 好 后 就 通 过 最 后 一 行
HAL_GPIO_Init(GPIOC,&GPIO_Initure); 按照设置的条件来初始化了。
至此也就完成的蜂鸣器整个初始化的过程,也就是在主 main 函数中执行完 beep_init()蜂鸣器初始化函数后就可以使用蜂鸣器了。
头文件 beep.h 只有两行够简单明了吧,两行还都是宏定义,
第一行宏定义:beep_H 为引脚 PC5 为输出模式并且输出高电平。
第二行宏定义:beep_L 为引脚 PC5 为输出模式并且输出低电平。
4、 烧录到开发板调试、验证代码
方法是:用下载器,连接到开发板的 SWD 插针上注意引脚对应关系,不要插错了。
然后编译一次(按),编译结果显示 0 错误 0 警告就 OK
之后再按 将代码下载到开发板。
5、检验效果
按下电源开关就可以听到蜂鸣器有节奏的响起了。
"BEE,BEE,BEE……"
欢迎大家留言,共同探讨,共同学习,共同进步