一、目的
在正点原子精英板上实现蜂鸣器每间隔200ms响一次。
二、硬件电路分析
蜂鸣器外部电路图如下图所示。蜂鸣器电路外接一个三极管对IO口输出电流进行放大驱动蜂鸣器,STM32上电复位后默认是处于浮空状态,此时IO口电平是不确定的。如果没有R38则IO口跳变的电流会经过三极管放大输出到使蜂鸣器发出响声;如果在b级接入R38下拉,则IO输出的跳变小电流会经过这个下拉电阻R38输出到地,不会输入到三极管内。只有当IO口输出的电压电流达到一定级别时,电压电流才会经b级进入三级管放大,从而驱动蜂鸣器工作。
注意:不能将单片机IO口输出直接连接上蜂鸣器,因为STM32单片机IO的电流驱动是有限的,蜂鸣器要想工作,其功耗一定要达到一个级别即说明蜂鸣器两端的电压和电流都要达到一个级别,而单片机IO口输出的电压电流不足以使蜂鸣器工作。
如图所示,蜂鸣器连接在单片机的PB8脚。
三、软件设计
初始化操作:
(1)使能GPIOB时钟。
(2)配置GPIOB.8的模式。
void beep_init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
//初始化端口时钟-GPIOB.8
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
//初始化端口模式
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB,&GPIO_InitStructure);
GPIO_ResetBits(GPIOB,GPIO_Pin_8); //关闭蜂鸣器
}
主函数
int main(void)
{
beep_init();
LED_init();
delay_init();
while(1)
{
BEEP = 0;
delay_ms(200);
BEEP = 1;
delay_ms(200);
}
}