蜂鸣器实验——GPIO输出
1.蜂鸣器硬件连接(枭龙)
BEEP 连接STMPD6脚;控制引脚输出高电平时,三极管导通,蜂鸣器鸣叫。配置管脚时,PD6配置成推挽输出即可。
有源蜂鸣器:通直流电就会叫(STM32F103蜂鸣器为有源蜂鸣器)。
无源蜂鸣器:需要用频率2K—5K的方波驱动它才会叫,否则直接通直流电是不会叫的。
**
**
配置HAL库操作IO口的方法
1.初始化HAL库:HAL_Init();
2.初始化系统时钟:SystemClock_Init();
3.使能IO口时钟。
操做寄存器:配置IO口时钟使能寄存器:RCC->APB2ENR
HAL库方法:_HAL_RCC_GPIOC_CLK_ENABLE();
或者_GPIOC_CLK_ENABLE();
4.初始化IO口模式。
HAL库方法:HAL_GPIO_Init();
5.操作IO口,输出高低电平
操作寄存器:配置寄存器GPIOX_ODR或者GPIOx_BSRR.
HAL库方法:HAL_GPIO_WritePin();
寄存器代码
test.h
#include "sys.h"
#include "usart.h"
#include "delay.h"
#include "led.h"
#include "beep.h"
int main()
{
Stm32_Clock_Init(9);
delay_init(72);
LED_Init();
BEEP_Init();
while(1)
{
BEEP = 1 ;
delay_ms(300);
BEEP = 0;
delay_ms(300);
}
}
BEEP.h
#ifndef __BEEP_H
#define __BEEP_H
#include "sys.h"
#define BEEP PDout(6)
//PD6
void BEEP_Init(void);
#endif
BEEP.c
#include "beep.h"
void BEEP_Init(void)
{
RCC->APB2ENR |= 1<<5;//
//GPIOD时钟使能
GPIOD->CRL &= 0xF0FFFFFF;
GPIOD->CRL |= 0x03000000;
//PD6 高速推挽模式输出
//GPIOD->ODR |= 1<<6;
BEEP = 0; //关闭蜂鸣器
}
HAL库代码
main.c
#include "MyIncludes.h"
int main(void)
{
System_Init();
Beep_Init();//蜂鸣器初始化
while(1)
{
Beep_ON();
delay_ms(1000);
Beep_OFF();
delay_ms(1000);
}
}b
beep.h
#ifndef __BEEP_H_
#define __BEEP_H_
#include "stm32f1xx.h"
#include "stm32_types.h"
#include "stm32f1xx_hal.h"
void Beep_Init(void);
void Beep_ON(void);
void Beep_OFF(void);
#endif//初始,开关函数
beep.c
#include "beep.h"
void Beep_Init(void)
{
__GPIOD_CLK_ENABLE();//别忘了使能GPIOD时钟,不报错,但蜂鸣器不会鸣叫。
GPIO_InitTypeDef GPIO_InitStruct;
GPIO_InitStruct.Pin = GPIO_PIN_6;//蜂鸣器的管脚为PD6
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
GPIO_InitStruct.Pull = GPIO_PULLUP;//上拉
HAL_GPIO_Init(GPIOD,&GPIO_InitStruct);
HAL_GPIO_WritePin(GPIOD,GPIO_PIN_6,GPIO_PIN_SET);//高电平使蜂鸣器鸣叫
}
void Beep_ON(void)
{
HAL_GPIO_WritePin(GPIOD,GPIO_PIN_6,GPIO_PIN_SET);
}
void Beep_OFF(void)
{
HAL_GPIO_WritePin(GPIOD,GPIO_PIN_6,GPIO_PIN_RESET);
}