/*******************************************************************************
* @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翻轉一次