【修订记录】
1、20230207,第一版
2、20230502,表述修正
驱动方法
有多种方法驱动蜂鸣器
1、使用BEEP外设:配置最简单,缺点是输出频率的范围有限。
2、使用定时器的通道输出:配置最复杂,但频率几乎可任意指定、不受中断的干扰。
3、使用定时器中断:配置稍复杂,中断处理中要翻转蜂鸣器端口输出,中断频率应是鸣叫频率的2倍。
底层
我这片开发板的BEEP端口是PD4,刚好还是定时器2的输出通道1,所以将使用这两种外设来分别配置定时器。
/**
******************************************************************************
* @file buz_hal.c
* @author
* @version V1.0.0
* @date DD-MM-YYYY
* @brief
******************************************************************************
*/
/* Includes ------------------------------------------------------------------*/
#include "buz_hal.h"
/* Private typedef -----------------------------------------------------------*/
/* Private define ------------------------------------------------------------*/
/* Private macro -------------------------------------------------------------*/
/* Variables -----------------------------------------------------------------*/
/* Private function prototypes -----------------------------------------------*/
/* Functions -----------------------------------------------------------------*/
/**
* @brief
* @param
* @retval
*/
#if BEEP_METHOD == BEEP_HARDWARE
void BUZ_HAL_BeepInit(BEEP_Frequency_TypeDef BEEP_Frequency)
{
BEEP_DeInit();
BEEP_Init(BEEP_Frequency);
BEEP_Cmd(DISABLE);
}
#elif BEEP_METHOD == BEEP_TIM2_OC1
void BUZ_HAL_BeepInit(uint16_t BEEP_Frequency)
{
TIM2_DeInit();
TIM2_TimeBaseInit(TIM2_PRESCALER_16, 1000000/BEEP_Frequency);
TIM2_OC1Init(TIM2_OCMODE_PWM1,
TIM2_OUTPUTSTATE_ENABLE,
(u16)(1000000/BEEP_Frequency/2),
TIM2_OCPOLARITY_HIGH);
TIM2_OC1PreloadConfig(ENABLE); //Enables the TIM2 Preload Register on CCR1
TIM2_Cmd(DISABLE);
}
#endif
/**
* @brief
* @param
* @retval
*/
void BUZ_HAL_BeepCmd(FunctionalState NewState)
{
#if BEEP_METHOD == BEEP_HARDWARE
BEEP_Cmd(NewState);
#elif BEEP_METHOD == BEEP_TIM2_OC1
TIM2_Cmd(NewState);
#endif
}
/******************************************************************************/
应用层
目前处于系统调试阶段,应用层还未着手。
计划做一个蜂鸣时序表,让声音跟随预设的时序来出现,有点类似于乐谱,这要求必须使用定时器通道输出模式来控制频率。