STM学习- -库函数蜂鸣BEEP器实验
主要内容:
- 蜂鸣器外围电路,驱动管脚确认;
- 软体处理;
重点掌握内容:
- 管脚配置函数;
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8; //LED0-->PB.8 端口配置
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO口速度为50MHz
GPIO_Init(GPIOB, &GPIO_InitStructure); //根据设定参数初始化GPIOB.8
- 管脚输出状态控制函数;
GPIO_Init(GPIOB, &GPIO_InitStructure); //根据设定参数初始化GPIOB.8
作用:设置某个IO口输出为高电平(1)。实际操作BSRR寄存器
GPIO_Init(GPIOB, &GPIO_InitStructure); //根据设定参数初始化GPIOB.8
作用:设置某个IO口输出为低电平(0)。实际操作的BRR寄存器。
- 头文件编写;
Buzzer.h
#ifndef __BUZZER_H
#define __BUZZER_H
#include "sys.h"
#define Buzzer PBout(8) // PB8映射BEEP
void Buzzer_Init(void);
#endif
流程图
LED控制GPIO IO管脚及外围电路:
- GPIO IO控制管脚确认:LED0对应PB5管脚,LED1对应PE5管脚
(PB5、PE5采用推挽输出)
- 有源蜂鸣器是指自带了震荡电路的蜂鸣器,这种蜂鸣器一接上电就会自己震荡发声。而如果是无源蜂鸣器,则需要外加一定频率(2~5Khz)的驱动信号,才会发声。这里我们选择使用有源蜂鸣器,方便大家使用。图中 Q1 是用来扩流,R38 则是一个下拉电阻,避免 MCU 复位的时候,蜂鸣器可能发声的现象。
- BEEP 信号直接连接在 MCU 的 PB8 上面,PB8 可以做 PWM 输出,所以大家如果想玩
高级点(如:控制蜂鸣器“唱歌”),就可以使用 PWM 来控制蜂鸣器。
/
软体处理:
-
库函数加载
-
GPIO 源文件stm32f10x_gpio.c 头文件stm32f10x_gpio.h加载
-
stm32f10x_rcc.h
-
misc.h
- 编写步骤
GPIO管脚初始化函数
void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct);
作用:初始化一个或者多个IO口(同一组)的工作方式和速度。
该函数主要是操作GPIO_CRL(CRH)寄存器,在上拉或者下拉的
时候有设置BSRR或者BRR寄存器
typedef struct
{
uint16_t GPIO_Pin; //指定要初始化的IO口
GPIOSpeed_TypeDef GPIO_Speed; //设置IO口输出速度
GPIOMode_TypeDef GPIO_Mode; //设置工作模式:8种中的一个
}GPIO_InitTypeDef
注释:LED初始化:控制LED管脚GPIO 管脚定义 、输出类型、输出速率、输出初始状态
LED-GPIO_Init函数初始化样例:
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5; //LED0-->PB.5 端口配置
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO口速度为50MHz
GPIO_Init(GPIOB, &GPIO_InitStructure); //根据设定参数初始化GPIOB.5
Buzzer-GPIO_Init函数初始化样例:
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8; //Buzzer-->PB.8 端口配置
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO口速度为50MHz
GPIO_Init(GPIOB, &GPIO_InitStructure); //根据设定参数初始化GPIOB.8
/
- GPIO输出电平函数
void GPIO_SetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
GPIO_SetBits(GPIOE,GPIO_Pin_5);
作用:设置某个IO口输出为高电平(1)。实际操作BSRR寄存器
void GPIO_ResetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
GPIO_ResetBits(GPIOE,GPIO_Pin_5);
作用:设置某个IO口输出为低电平(0)。实际操作的BRR寄存器。
管脚映射:
#define LED0 PBout(5)// PB5
#define LED1 PEout(5)// PE5
------------------------------------------------------------------------------------------------------
#define PAout(n) BIT_ADDR(GPIOA_ODR_Addr,n) //输出
#define PAin(n) BIT_ADDR(GPIOA_IDR_Addr,n) //输入
#define PBout(n) BIT_ADDR(GPIOB_ODR_Addr,n) //输出
#define PBin(n) BIT_ADDR(GPIOB_IDR_Addr,n) //输入
#define PCout(n) BIT_ADDR(GPIOC_ODR_Addr,n) //输出
#define PCin(n) BIT_ADDR(GPIOC_IDR_Addr,n) //输入
#define PDout(n) BIT_ADDR(GPIOD_ODR_Addr,n) //输出
#define PDin(n) BIT_ADDR(GPIOD_IDR_Addr,n) //输入
#define PEout(n) BIT_ADDR(GPIOE_ODR_Addr,n) //输出
#define PEin(n) BIT_ADDR(GPIOE_IDR_Addr,n) //输入
#define PFout(n) BIT_ADDR(GPIOF_ODR_Addr,n) //输出
#define PFin(n) BIT_ADDR(GPIOF_IDR_Addr,n) //输入
#define PGout(n) BIT_ADDR(GPIOG_ODR_Addr,n) //输出
#define PGin(n) BIT_ADDR(GPIOG_IDR_Addr,n) //输入
注释:ODR 是一个端口输出数据寄存器,也只用了低 16 位。 IDR 是一个端口输入数据寄存器,也只用了低 16 位。
软体代码:
--------------------------------------------------------------------------------------------------------
//主函数:
#include "delay.h"
#include "led.h"
#include "buzzer.h"
int main(void)
{
delay_init();
Led_Init();
Buzzer_Init();
while(1)
{
Led0=1;
Led1=1;
Buzzer=0;
delay_ms(300); //延时300ms
Led0=0;
Led1=0;
Buzzer=1;
delay_ms(300); //延时300ms
}
}
----------------------------------------------------------------------------------------------------------
//Led_Init();
#include "led.h"
//初始化PB5和PE5为输出口.并使能这两个口的时钟
//LED IO初始化
void Led_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure; //Type 类型 Structure结构
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOE, ENABLE); //使能PB,PE端口时钟
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5; //LED0-->PB.5 端口配置
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO口速度为50MHz
GPIO_Init(GPIOB, &GPIO_InitStructure); //根据设定参数初始化GPIOB.5
GPIO_SetBits(GPIOB,GPIO_Pin_5); //PB.5 输出高
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5; //LED1-->PE.5 端口配置, 推挽输出
GPIO_Init(GPIOE, &GPIO_InitStructure); //推挽输出 ,IO口速度为50MHz
GPIO_SetBits(GPIOE,GPIO_Pin_5); //PE.5 输出高
}
#ifndef __LED_H
#define __LED_H
#include "sys.h"
#define Led0 PBout(5) // PB5映射LED0
#define Led1 PEout(5) // PB5映射LED0
void Led_Init(void);
#endif
----------------------------------------------------------------------------------------------
// Buzzer_Init();
#include "Buzzer.h"
//初始化PB8为输出口.并使能时钟
//Buzzer IO初始化
void Buzzer_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure; //Type 类型 Structure结构
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); //使能PB,PE端口时钟
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8; //LED0-->PB.5 端口配置
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO口速度为50MHz
GPIO_Init(GPIOB, &GPIO_InitStructure); //根据设定参数初始化GPIOB.5
GPIO_ResetBits(GPIOB,GPIO_Pin_8); //PB.5 输出高
}
Buzzer.h
#ifndef __BUZZER_H
#define __BUZZER_H
#include "sys.h"
#define Buzzer PBout(8) // PB8映射BEEP
void Buzzer_Init(void);
#endif
---------------------------------------------------------------------------