小言_互联网的博客

STM32F103五分钟入门系列(四)蜂鸣器实验(库函数+寄存器)

179人阅读  评论(0)

学习板:STM32F103ZET6

强推系列:
STM32F103五分钟入门系列(一)跑马灯(库函数+寄存器)+加编程模板+GPIO总结

STM32F103五分钟入门系列(二)GPIO的七大寄存器+GPIOx_LCKR作用和配置

STM32F103五分钟入门系列(三)GPIO的常用库函数使用方法总结+一个网络上的误区

前言

GPIO、GPIO的寄存器、GPIO的库函数终于总结完了,接下来进入各种实验总结。之后的博客就不会像前三个博客那样累了(哈哈),不过初期的几个实验总结,我会把能实现实验功能的库函数、寄存器都写一遍,不会局限于只用一个库函数、一个寄存器,虽然比较累,不过总结后会更方便自己和其他朋友查看。多种实现方法在代码中以注释的方式呈现,不要忽略代码的注释部分

一、原理图分析

打开蜂鸣器的原理图:

从原理图中可以得到以下信息:

①蜂鸣器通过三极管连接到芯片PB8引脚

②PB8引脚接三极管的基极,当 PB8输出高电平时三极管基极电流变大,集电极电流也变大,蜂鸣器导通。所以PB8为高电平时蜂鸣器发声。

③PB8输出标准的高低电平就行,所以可以为通用推挽输出模式。

二、蜂鸣器(库函数版)

头文件:beep.h

代码:

//beep.h
#ifndef BEEP_H
#define  BEEP_H

void BEEP_Init();
#endif

头文件固定格式,BEEP_H可以随便起名,只要没有被定义就行,然后就是声明蜂鸣器初始化函数。不再赘述。

beep.c代码:

1 	//beep.c
2 	#include "beep.h"
3 	#include "stm32f10x.h"
4 	#include "sys.h"
5 
6 	void BEEP_Init(void)
7 	{
   
8 		GPIO_InitTypeDef GPIO_InitStruct;
9 		RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);//使能GPIOB时钟
10		
11		GPIO_InitStruct.GPIO_Mode=GPIO_Mode_Out_PP;
12		GPIO_InitStruct.GPIO_Pin=GPIO_Pin_8;
13		GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;//PB8 IO配置
14		GPIO_Init(GPIOB,&GPIO_InitStruct);
15		
16		GPIO_ResetBits(GPIOB,GPIO_Pin_8);     //初始状态置低电平,关闭蜂鸣器
17		//GPIO_WriteBit(GPIOB,GPIO_Pin_8, 0);//初始状态置低电平,关闭蜂鸣器
18		//GPIO_Write(GPIOB,0);          //初始状态置低电平,关闭蜂鸣器 
19		//PBout(8)=0;                         //初始状态置低电平,关闭蜂鸣器
20	}

在beep.c代码中,第9行是配置PB8的时钟,接下来11~ 14行是配置PB8 IO口;第16行让PB8初始状态输出低电平,使蜂鸣器不发声,其中第17、18、19行也同样可以实现将蜂鸣器置低电平。注意:要使用PBout(8)=0,需要包含头文件sys.h

接下来就进入主函数了,主函数中只需控制蜂鸣器发声就行了。

代码:

1 	//main.c
2 	#include "sys.h"
3 	#include "stm32f10x.h"
4 	#include "beep.h"
5 	 int main(void)
6 	 {
   	
7 		BEEP_Init();
8 		 
9 		 while(1)
10		 {
   
11			 GPIO_SetBits(GPIOB,GPIO_Pin_8); 	 //PB8置高电平
12			 //GPIO_WriteBit(GPIOB,GPIO_Pin_8, 1);//PB8置高电平
13			 //GPIO_Write(GPIOB,0x0100);          //PB8置高电平
14			 //PBout(8)=1;     					 //PB8置高电平
15		 }
16		 
17	 } 

同样第11~14行都是控制PB8输出高电平

三、蜂鸣器(寄存器版)

蜂鸣器头文件beep.h:

1	//beep.h
2	#ifndef BEEP_H
3	#define BEEP_H
4	void BEEP_Init(void);
5	#endif

接下来编写beep.c

时钟使能

	RCC->APB2ENR=0x0008;      //使能GPIOB时钟
	//RCC->APB2ENR|=1<<3;	  //使能GPIOB时钟
	//RCC->APB2ENR=1<<3;      //使能GPIOB时钟

PB8 IO口配置:

	GPIOB->CRH&=0XFFFFFFF0;//清零
	GPIOB->CRH|=0x00000003; //配置PB8
	GPIOB->CRH=0x00000003; //配置PB8 (不推荐直接赋值)

注意:一定要清零,否则可能出现异常

然后给蜂鸣器初始置0,不让发声(ODR):

	GPIOB->ODR&=0xfeff;      //ODR寄存器
	//GPIOB->ODR&=0xfffe<<8;	 //ODR寄存器

蜂鸣器初始置0,不让发声(BRR):

	//GPIOB->BRR|=0x0100;       //BRR寄存器
	//GPIOB->BRR=0x0100;        //BRR寄存器
	//GPIOB->BRR|=1<<8;			//BRR寄存器
	//GPIOB->BRR=1<<8;			//BRR寄存器

完整程序:

1 	//beep.c
2 	#include "beep.h"
3 	#include "sys.h"
4 	#include "stm32f10x.h"
5 	void BEEP_Init(void)
6 	{
   
7 		RCC->APB2ENR|=0x0008;      //使能GPIOB时钟
8 		//RCC->APB2ENR|=1<<3;	  //使能GPIOB时钟
9 		//RCC->APB2ENR=1<<3;      //使能GPIOB时钟
10		
11		GPIOB->CRH&=0XFFFFFFF0;
12		GPIOB->CRH|=0x00000003; //配置PB8
13		//GPIOB->CRH=0x00000003; //配置PB8 (不推荐直接赋值)
14
15		GPIOB->ODR&=0xfeff;         //ODR寄存器
16		//GPIOB->ODR&=0xfffe<<8;	//ODR寄存器
17		//GPIOB->BRR|=0x0100;       //BRR寄存器
18		//GPIOB->BRR=0x0100;        //BRR寄存器
19		//GPIOB->BRR|=1<<8;			//BRR寄存器
20		//GPIOB->BRR=1<<8;			//BRR寄存器
21	}
22

接下来在主函数中给PB8置高电平,使蜂鸣器发声:

main.c

ODR寄存器:

		GPIOB->ODR|=0x0100;
		//GPIOB->ODR|=1<<8;

BSRR寄存器:

		//GPIOB->BSRR|=0x00000100;
		//GPIOB->BSRR|=1<<8;	

完整代码:

1 	//main.c
2 	#include "sys.h"
3 	#include "stm32f10x.h"
4 	#include "beep.h"
5 	 int main(void)
6 	 {
   	
7 		 BEEP_Init();
8 		while(1)
9 		{
   
10			GPIOB->ODR|=0x0100;
11			//GPIOB->ODR|=1<<8;
12			//GPIOB->BSRR|=0x00000100;
13			//GPIOB->BSRR|=1<<8;	
14		}
15	 }

转载:https://blog.csdn.net/Curnane0_0/article/details/116399774
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场