学习板: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