/*******************************************************************************
* @fn BUZ_PRO_FUN
*
* @brief 蜂鸣器提示处理函数
*
* @param beep_num 响次数; beep_per 响周期
*
* @return no
*******************************************************************************/
void BUZ_PRO_FUN(uint8_t beep_num, uint8_t beep_per)
{
static uint8_t Beep_Num, Beep_Per, Beep_CLK, Beep_Flag;//响的次数,周期,时钟,响的标志
if(beep_per != 0xff)//放在定时器下面时,形参就是0xff,只为了用定时器当时钟
Beep_Flag = 1; //收到有效形参,蜂鸣器开始工作
if(Beep_Flag == 1)
{
if(Beep_Num == 0) //上一次已经响完,并且不重复给Beep_Num、Beep_Per赋值
{
Beep_Num = beep_num * 2; // *2 是因为响一声需要翻转,电平变化两次
Beep_Per = beep_per; //存储有效周期
}
if(Beep_CLK++ > Beep_Per)//周期,周期示时钟而定
{
Beep_CLK = 0;
if(Beep_Num--)//次数
HAL_GPIO_TogglePin(BUZZER_GPIO_Port, BUZZER_Pin);
}
if(Beep_Num == 0)//本次提示已经完成并结束,关闭蜂鸣器,下次不再进入
{
HAL_GPIO_WritePin(BUZZER_GPIO_Port, BUZZER_Pin, GPIO_PIN_SET);//关闭蜂鸣器提示
Beep_Flag = 0;
}
}
}
这个函数放到定时器下面起到时钟作用
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
if(htim->Instance == TIM6)
{
BUZ_PRO_FUN(0xff,0xff);//蜂鸣器提示时钟
}
}
使用时:
BUZ_PRO_FUN(2,3);//蜂鸣器提示2次 假如定时器是100ms,则蜂鸣器每隔300ms翻转一次