STM32学习笔记:蜂鸣器实验

STM32学习笔记:蜂鸣器实验

蜂鸣器实现原理和led点亮大同小异,所以就不重新编写了。

一.所使用的函数

1.时钟使能函数
  RCC_APB2PeriphClockCmd(uint32_t RCC_APB2Periph, FunctionalState NewState)
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE); //使能GPIOB的时钟
2.引脚初始化函数
  GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct)
  GPIO_Init(GPIOB,&GPIO_InitStructure); 
3.对IO口置1
  GPIO_SetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)
  GPIO_SetBits(GPIOB,GPIO_Pin_8);
4.对IO口置0
  GPIO_ResetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)
  GPIO_ResetBits(GPIOB,GPIO_Pin_8);

二.硬件部分

蜂鸣器有两种有源蜂鸣器和无源蜂鸣器。有源和无源这里的“源”不是指电源,而是指震荡源。也就是说,有源蜂鸣器内部带震荡源,所以只要一通电就会叫。而无源内部不带震荡源,所以如果用直流信号无法令其鸣叫。必须用2K~5K的方波去驱动它。
a为有源蜂鸣器,b为无源蜂鸣器

三.代码编写过程整理

1.编写beep.h头文件

#ifndef __BEEP_H
#define __BEEP_H
void beep_Iint(void); //函数声明,在.c的文件中定义
#endif //避免头文件内容被重复定义

2.编写beep.c文件

在该文件中引用了beep.h的头文件,先声明了 void beep_Iint(void) 这个函数,然后对该函数进行定义

#include "beep.h"
#include "stm32f10x.h"

void beep_Iint(void)
{
	GPIO_InitTypeDef GPIO_InitStructure; 
	
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE); //使能GPIOB的时钟
	
	GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP; //设置推挽输出
	GPIO_InitStructure.GPIO_Pin=GPIO_Pin_8; //蜂鸣器对应的引脚为PB8
	GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz; //输出速度为50MHz
    GPIO_Init(GPIOB,&GPIO_InitStructure); //GPIOB初始化
    
	GPIO_SetBits(GPIOB,GPIO_Pin_8); //对IO口置1
}

在这部分编写代码的时候,首先运用到的是rcc头文件中的使能时钟的函数,基本上所有的程序在开始都需要使能时钟,然后就是对时钟进行初始化,在go to definition之后,我们发现它的入口第二个条件是一个结构体,我们就定义了一个指针GPIO_InitStructure指向GPIO_InitTypeDef ,GPIO_InitTypeDef是一个结构体变量,该变量在Stm32f10x_gpio.h头文件中被定义,原型如下:

typedef struct
{
  uint16_t GPIO_Pin;             //GPIO_pins_define
  GPIOSpeed_TypeDef GPIO_Speed;  //GPIOSpeed_TypeDef 
  GPIOMode_TypeDef GPIO_Mode;    //GPIOMode_TypeDef 
    
}GPIO_InitTypeDef;

所以我们分别要对这三个结构体成员进行赋值:

首先,第一个变量为GPIO_Pin是一个16为的无符号数(uint),该数只有16位,每一位代表一个引脚,如果想要要配置某一个端口的某一个引脚只需要把相应的位置1就可以了。在STM32的固件库中有如下引脚号定义:

#define GPIO_Pin_0                 ((uint16_t)0x0001)  /*!< Pin 0 selected */
#define GPIO_Pin_1                 ((uint16_t)0x0002)  /*!< Pin 1 selected */
#define GPIO_Pin_2                 ((uint16_t)0x0004)  /*!< Pin 2 selected */
#define GPIO_Pin_3                 ((uint16_t)0x0008)  /*!< Pin 3 selected */
#define GPIO_Pin_4                 ((uint16_t)0x0010)  /*!< Pin 4 selected */
#define GPIO_Pin_5                 ((uint16_t)0x0020)  /*!< Pin 5 selected */
#define GPIO_Pin_6                 ((uint16_t)0x0040)  /*!< Pin 6 selected */
#define GPIO_Pin_7                 ((uint16_t)0x0080)  /*!< Pin 7 selected */
#define GPIO_Pin_8                 ((uint16_t)0x0100)  /*!< Pin 8 selected */
#define GPIO_Pin_9                 ((uint16_t)0x0200)  /*!< Pin 9 selected */
#define GPIO_Pin_10                ((uint16_t)0x0400)  /*!< Pin 10 selected */
#define GPIO_Pin_11                ((uint16_t)0x0800)  /*!< Pin 11 selected */
#define GPIO_Pin_12                ((uint16_t)0x1000)  /*!< Pin 12 selected */
#define GPIO_Pin_13                ((uint16_t)0x2000)  /*!< Pin 13 selected */
#define GPIO_Pin_14                ((uint16_t)0x4000)  /*!< Pin 14 selected */
#define GPIO_Pin_15                ((uint16_t)0x8000)  /*!< Pin 15 selected */
#define GPIO_Pin_All               ((uint16_t)0xFFFF)  /*!< All pins selected */

其次, GPIOSpeed_TypeDef是一个枚举变量,用来存储GPIO的速度,其定义如下:

typedef enum
{ 
  GPIO_Speed_10MHz = 1,
  GPIO_Speed_2MHz, 
  GPIO_Speed_50MHz
}GPIOSpeed_TypeDef;

它有三种取值,也就是说GPIO的速度有三种取值,枚举变量为1时GPIO的速度对应10MHz,枚举变量为2时GPIO的速度对应2MHz,枚举变量为3时GPIO的速度对应50MHz,总结如下图:

GPIO的速度枚举变量的取值
10MHz1
2MHz2
50MHz3

最后, GPIOMode_TypeDef也是一个枚举变量,用来存储GPIO的工作模式,其定义如下:

typedef enum
{ GPIO_Mode_AIN = 0x0, //模拟输入
  GPIO_Mode_IN_FLOATING = 0x04, //浮空输入
  GPIO_Mode_IPD = 0x28, //带下拉输入
  GPIO_Mode_IPU = 0x48, //带上拉输入
  GPIO_Mode_Out_OD = 0x14, //开漏输出
  GPIO_Mode_Out_PP = 0x10, //推挽输出(我们所选用的模式)
  GPIO_Mode_AF_OD = 0x1C, //复用功能的开漏输出
  GPIO_Mode_AF_PP = 0x18 //复用功能的推挽输出
}GPIOMode_TypeDef;

在对结构体赋值完之后,我们对led的IO口进行置1,主要是为了让led保持熄灭的状态,在这里我们用到了GPIO_SetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)这个函数:

GPIO_SetBits(GPIOB,GPIO_Pin_8); //对IO口置1

3.编写main.c文件

#include "stm32f10x.h"
#include "beep.h"
#include "delay.h" //这里的delay的头文件是自己写的一个延迟函数的头文件,自己在主函数中编写也是可以的

int main (void)
{
	beep_Iint(); //我们之前编写的LED初始化函数,对IO口进行配置并且进行初始化
	delay_init(); //自己编写的延迟函数的初始化
	while(1)
	{
		GPIO_SetBits(GPIOB,GPIO_Pin_5); //IO口置0
		delay_ms(300);
		GPIO_ResetBits(GPIOB,GPIO_Pin_5); //IO口置1
		delay_ms(300);
	}
}
  • 3
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ninehuang333

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值