/** * @brief Callback for the beep timer * @param None * @retval None */ static void prvBuzzerBeepTimerCallback() { /* Only beep if we should beep */ if (prvCurrentSettings.numOfBeeps != 0) { prvCurrentSettings.numOfBeeps--; /* Check if we were beeping last time or not */ if (prvBuzzerIsOn) { prvBuzzerIsOn = false; BUZZER_Off(); } else { prvBuzzerIsOn = true; BUZZER_TIMER->BUZZER_CCR_REGISTER = (uint16_t)(prvCurrentSettings.volume/200.0 * (BUZZER_PERIOD)); } xTimerStart(prvBuzzerBeepTimer, 100); } /* Otherwise turn it off */ else { prvBuzzerIsOn = false; BUZZER_Off(); } }
/** * @brief Callback for the beep timer * @param None * @retval None */ static void prvBuzzerBeepTimerCallback() { /* Only beep if we should beep */ if (prvCurrentSettings.numOfBeeps != 0) { prvCurrentSettings.numOfBeeps--; /* Check if we were beeping last time or not */ if (prvBuzzerIsOn) { prvBuzzerIsOn = false; BUZZER_Off(); } else { prvBuzzerIsOn = true; BUZZER_SetVolume(prvCurrentSettings.volume); } xTimerStart(prvBuzzerBeepTimer, 100); } /* Otherwise turn it off */ else { prvBuzzerIsOn = false; BUZZER_Off(); } }
/** * @brief Initialize the buzzer * @param None * @retval None */ void BUZZER_Init() { /* Create software timers */ if (prvBuzzerBeepTimer == 0) prvBuzzerBeepTimer = xTimerCreate("BuzzerBeep", prvCurrentSettings.delayBetweenBeeps, pdFALSE, 0, prvBuzzerBeepTimerCallback); /* Enable TIMER Clock */ BUZZER_TIMER_CLK_ENABLE; /* Enable GPIO Clock */ BUZZER_GPIO_CLK_ENABLE; /* Configure the GPIO as alternate function */ GPIO_InitTypeDef GPIO_InitStructure; GPIO_InitStructure.Pin = BUZZER_PIN; GPIO_InitStructure.Mode = GPIO_MODE_AF_PP; GPIO_InitStructure.Alternate = BUZZER_AF_GPIO; GPIO_InitStructure.Pull = GPIO_NOPULL; GPIO_InitStructure.Speed = GPIO_SPEED_LOW; HAL_GPIO_Init(BUZZER_PORT, &GPIO_InitStructure); /* Timer init */ prvTimerHandle.Instance = BUZZER_TIMER; prvTimerHandle.Init.Period = BUZZER_PERIOD; prvTimerHandle.Init.Prescaler = prvGetPrescalerForFrequency(prvCurrentSettings.frequency); prvTimerHandle.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; prvTimerHandle.Init.CounterMode = TIM_COUNTERMODE_UP; HAL_TIM_PWM_Init(&prvTimerHandle); /* Output compare init */ TIM_OC_InitTypeDef timerOutputCompare; timerOutputCompare.OCMode = TIM_OCMODE_PWM1; timerOutputCompare.Pulse = BUZZERVolume_Off; timerOutputCompare.OCPolarity = TIM_OCPOLARITY_HIGH; timerOutputCompare.OCNPolarity = TIM_OCNPOLARITY_HIGH; timerOutputCompare.OCFastMode = TIM_OCFAST_DISABLE; timerOutputCompare.OCIdleState = TIM_OCIDLESTATE_SET; timerOutputCompare.OCNIdleState = TIM_OCNIDLESTATE_SET; HAL_TIM_PWM_ConfigChannel(&prvTimerHandle, &timerOutputCompare, BUZZER_TIMER_CHANNEL); /* Start the PWM */ HAL_TIM_PWM_Start(&prvTimerHandle, BUZZER_TIMER_CHANNEL); BUZZER_Off(); }