#include "BeepAndLed.h" #include "beepAndLed.h" #include "main.h" // 包含BUZZER_ON/OFF, LED等宏定义 // ========== 变量定义 ========== static BeeperCtrl_t g_beeper = { .state = BEEPER_STATE_IDLE, .is_active = 0, .repeat = 0, .repeat_done = 0, .on_ms = 0, .off_ms = 0 }; // 延时计数器(供滴答定时器使用) uint32_t BeepAndLedCollDelay1mSCnt = 0; // ========== 硬件控制函数(根据您的实际宏定义修改)========== static void Beeper_HW_On(void) { BUZZER_ON(); // 请替换为您的实际宏 LED_GREEN_OFF(); // 请替换为您的实际宏 LED_RED_ON(); // 请替换为您的实际宏 } static void Beeper_HW_Off(void) { BUZZER_OFF(); // 请替换为您的实际宏 LED_GREEN_ON(); // 请替换为您的实际宏 LED_RED_OFF(); // 请替换为您的实际宏 } // ========== 实现函数 ========== /** * @brief 蜂鸣器初始化 */ void Beeper_Init(void) { Beeper_Stop(); } /** * @brief 开始鸣响(非阻塞) * @param on_ms 鸣响时间(ms) * @param off_ms 间隔时间(ms) * @param repeat 重复次数(0表示无效) * * @example Beeper_Start(200, 100, 3); // 鸣200ms,停100ms,重复3次 */ void Beeper_Start(uint16_t on_ms, uint16_t off_ms, uint8_t repeat) { if (repeat == 0) return; // 如果已经在鸣响,可以选择停止并重新开始 if (g_beeper.is_active) { Beeper_Stop(); // 停止当前,重新开始新的 // return; // 或者选择忽略新请求 } // 保存参数 g_beeper.on_ms = on_ms; g_beeper.off_ms = off_ms; g_beeper.repeat = repeat; g_beeper.repeat_done = 0; g_beeper.is_active = 1; // 开启蜂鸣器 Beeper_HW_On(); // 设置延时计数器(开启状态延时) BeepAndLedCollDelay1mSCnt = on_ms; g_beeper.state = BEEPER_STATE_ON; } /** * @brief 停止鸣响 */ void Beeper_Stop(void) { // 关闭硬件 Beeper_HW_Off(); // 重置状态机 g_beeper.state = BEEPER_STATE_IDLE; g_beeper.is_active = 0; g_beeper.repeat = 0; g_beeper.repeat_done = 0; BeepAndLedCollDelay1mSCnt = 0; } /** * @brief 蜂鸣器状态机更新(放在main.c的while(1)中循环调用) * @note 必须在滴答定时器更新BeepAndLedCollDelay1mSCnt后才能正确工作 */ void BeeperLoopHandler(void) { if (!g_beeper.is_active) { return; } switch (g_beeper.state) { case BEEPER_STATE_ON: // 蜂鸣器开启状态,等待计数器归零 if (BeepAndLedCollDelay1mSCnt == 0) { // 延时结束,关闭蜂鸣器 Beeper_HW_Off(); g_beeper.repeat_done++; // 检查是否完成所有重复 if (g_beeper.repeat_done >= g_beeper.repeat) { // 全部完成,结束 g_beeper.is_active = 0; g_beeper.state = BEEPER_STATE_IDLE; } else { // 还有下次,进入等待状态 BeepAndLedCollDelay1mSCnt = g_beeper.off_ms; g_beeper.state = BEEPER_STATE_OFF; } } break; case BEEPER_STATE_OFF: // 蜂鸣器关闭等待状态(间隔时间) if (BeepAndLedCollDelay1mSCnt == 0) { // 间隔结束,开启下一次鸣响 Beeper_HW_On(); BeepAndLedCollDelay1mSCnt = g_beeper.on_ms; g_beeper.state = BEEPER_STATE_ON; } break; case BEEPER_STATE_WAIT: case BEEPER_STATE_IDLE: default: break; } } /** * @brief 查询是否正在鸣响 * @return true:正在鸣响, false:空闲 */ bool Beeper_IsPlaying(void) { return g_beeper.is_active; } /** * @brief 手动开启蜂鸣器(不计入状态机) */ void Beeper_On(void) { Beeper_HW_On(); } /** * @brief 手动关闭蜂鸣器(不计入状态机) */ void Beeper_Off(void) { Beeper_HW_Off(); } /** * @brief 清除延时计数器(由滴答定时器调用) * @note 这个函数放在滴答定时器的1ms中断中调用 */ void Beeper_ClearDelay(void) { if (BeepAndLedCollDelay1mSCnt > 0) { BeepAndLedCollDelay1mSCnt--; } }