/* ============================================================================= * buzzer.c - C 板无源蜂鸣器(TIM4_CH3, PD14) * 说明: 音调表与 legacy 完全一致(ARR 固定 10 分频,改 PSC 变调, * 装载用 HAL_TIM_GenerateEvent 立即生效);buzzer_init 必须在 * CAN_Task 中调用一次启动 PWM 输出,否则所有报警/音效无声 * ========================================================================== */ #include "buzzer.h" #include "tim.h" extern TIM_HandleTypeDef htim4; /* 蜂鸣器音调频率表(ARR 固定 10 分频下的 PSC 值,与 legacy 一致) */ static const uint16_t buzzer_tone_freq[37] = { 0, 32107, 30305, 28604, 26999, 25483, 24053, 22703, 21429, 20226, 19091, 18019, 17008, 16053, 15152, 14302, 13499, 12742, 12026, 11352, 10714, 10113, 9545, 9010, 8504, 8027, 7576, 7151, 6750, 6371, 6013, 5676, 5357, 5056, 4773, 4505, 4252, }; void buzzer_init(void) { /* 与 legacy 相同:ARR=10 分频,CubeMX 的 ARR=65535 改为 9 */ __HAL_TIM_SET_AUTORELOAD(&htim4, 10 - 1); __HAL_TIM_SET_PRESCALER(&htim4, 19091); __HAL_TIM_SET_COMPARE(&htim4, TIM_CHANNEL_3, 0); HAL_TIM_PWM_Start(&htim4, TIM_CHANNEL_3); } void buzzer_on(buzzer_tone_e tone) { if (tone != BUZZER_P) { __HAL_TIM_SET_PRESCALER(&htim4, buzzer_tone_freq[tone]); HAL_TIM_GenerateEvent(&htim4, TIM_EVENTSOURCE_UPDATE); // 立即装载 PSC __HAL_TIM_SET_COMPARE(&htim4, TIM_CHANNEL_3, 5); // 占空比 50% } else __HAL_TIM_SET_COMPARE(&htim4, TIM_CHANNEL_3, 0); } void buzzer_off(void) { __HAL_TIM_SET_COMPARE(&htim4, TIM_CHANNEL_3, 0); }