/* Includes ----------------------------------------------------------------- */ #include "bsp/buzzer.h" #include #include #include "bsp/delay.h" /* Private define ----------------------------------------------------------- */ /* Private macro ------------------------------------------------------------ */ /* Private typedef ---------------------------------------------------------- */ /* Private variables -------------------------------------------------------- */ /* Private function -------------------------------------------------------- */ /* Exported functions ------------------------------------------------------- */ int8_t BSP_Buzzer_Start(void) { if (HAL_TIM_PWM_Start(&htim12, TIM_CHANNEL_2) == HAL_OK) return BSP_OK; return BSP_ERR; } int8_t BSP_Buzzer_Set(float freq, float duty_cycle) { if (freq <= 0.0f || duty_cycle < 0.0f || duty_cycle > 1.0f) return BSP_ERR; uint32_t timer_clk = HAL_RCC_GetPCLK1Freq(); // 具体时钟频率请根据你的芯片和配置调整 uint32_t prescaler = htim12.Init.Prescaler + 1; uint32_t period = (uint32_t)((float)timer_clk / (prescaler * freq)) - 1; __HAL_TIM_SET_AUTORELOAD(&htim12, period); uint32_t pulse = (uint32_t)(duty_cycle * (float)(period + 1)); __HAL_TIM_SET_COMPARE(&htim12, TIM_CHANNEL_2, pulse); return BSP_OK; } int8_t BSP_Buzzer_Set_Note(BSP_Buzzer_Note_t note, float delay_sec) { if (note <= 0 || delay_sec < 0.0f) return BSP_ERR; uint32_t timer_clk = HAL_RCC_GetPCLK1Freq(); // 具体时钟频率请根据你的芯片和配置调整 uint32_t prescaler = htim12.Init.Prescaler + 1; uint32_t period = (uint32_t)((float)timer_clk / (prescaler * note)) - 1; __HAL_TIM_SET_AUTORELOAD(&htim12, period); uint32_t pulse = (uint32_t)(0.5f * (float)(period + 1)); // 设置50%的占空比 __HAL_TIM_SET_COMPARE(&htim12, TIM_CHANNEL_2, pulse); BSP_Delay((uint32_t)(delay_sec * 1000.0f)); // 延时指定秒数 return BSP_OK; } int8_t BSP_Buzzer_Stop(void) { if (HAL_TIM_PWM_Stop(&htim12, TIM_CHANNEL_2) == HAL_OK) return BSP_OK; return BSP_ERR; }