第十一届蓝桥杯嵌入式组别底层驱动程序②(蜂鸣器)

第十一届蓝桥杯嵌入式组别底层驱动程序②(蜂鸣器)

/*******************************************************************************  
* 文件名称:BEEP
* 日期版本:2019-11-26/V3.0b 
* 作    者:零点工作室(RMLS)
*******************************************************************************/
#include "project.h"
#include "beep.h"
//PB4
int32_t Beep_timer = 0;
void Beep_Init(void)
{
    GPIO_InitTypeDef  GPIO_InitStructure;						//函数还是结构体变量	
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO, ENABLE);		//GPIOB时钟
	//stm32复位后,PB4引脚默认是作为JTAG接口的RST引脚,
	//因此我们再使用蜂鸣器之前要先把PB4复用回我们的普通IO口。需要在时钟中加入复用时钟
	GPIO_PinRemapConfig(GPIO_Remap_SWJ_NoJTRST,ENABLE);
	
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;			//推挽输出 
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
    GPIO_Init(GPIOB, &GPIO_InitStructure);
}

void Beep_Control(uint8_t Beep_Status)
{
    if(Beep_Status == 0)GPIO_ResetBits(GPIOB,GPIO_Pin_4);  //蜂鸣器响    
    else GPIO_SetBits(GPIOB,GPIO_Pin_4); 				   //蜂鸣器关闭
}
//以下两个函数代表:部分题目要求会让按下按键之后蜂鸣器响100ms进行提示,所以添加两个函数
void BeepScan(uint8_t ms)
{
	if(Beep_timer > 0)
	{
		Beep_timer -= ms;

		if(Beep_timer <= 0)	
		{
			BeepOff();
			Beep_timer = 0;
		}
	}
}

void Beep(int32_t timer)	//timer数值表示蜂鸣器响的时间
{
	Beep_timer = timer;
	if(Beep_timer == 0) BeepOff();
	else BeepOpen();
}

#ifndef __BEEP_H__
#define __BEEP_H__

#define BeepOff() 	GPIO_SetBits(GPIOB, GPIO_Pin_4)
#define BeepOpen() 	GPIO_ResetBits(GPIOB, GPIO_Pin_4)

void Beep_Init(void);
void Beep_Control(uint8_t Beep_Status);
void Beep(int32_t timer);
void BeepScan(uint8_t ms);

#endif

注释:蜂鸣器的初始化步骤和LED初始化步骤一样,故不赘述。值得注意的是蜂鸣器占用的PB4引脚和开发板上复位引脚冲突,所以添加了代码GPIO_PinRemapConfig(GPIO_Remap_SWJ_NoJTRST,ENABLE);
代表SWJ 完全失能。取消重定向。这样在再次下载程序的情况下对此引脚和蜂鸣器互不影响。

你可能感兴趣的:(#,嵌入式)