/** * @Author: 李建 * @Date: 2025/4/22 10:24 * Description: 蜂鸣器模块 * Copyright: Copyright (©) 2025 永续绿建. All rights reserved. */ #include "freertos/FreeRTOS.h" #include #include "beep.h" #include "driver/ledc.h" #include "esp_err.h" #include "esp_timer.h" #include "main.h" #include "extend_io.h" #include "driver/gptimer.h" #include "soc/timer_group_struct.h" #define BEEP_BIT BIT0 #define STOP_BEEP_BIT BIT1 static EventGroupHandle_t beep_event_group; #include esp_timer_handle_t esp_timer_handle1 = 0; //定时器句柄 uint8_t beep_state = 0; // 用户自定义ISR static bool example_timer_on_alarm_cb(gptimer_handle_t timer, const gptimer_alarm_event_data_t *edata, void *user_ctx) { uint32_t index=0; if (beep_state==1) { xEventGroupSetBits(beep_event_group, BEEP_BIT); index++; beep_state=2; }else if (beep_state==2){ xEventGroupSetBits(beep_event_group, STOP_BEEP_BIT); beep_state=1; } if (index>=1000) { // esp_timer_stop(esp_timer_handle1); xEventGroupSetBits(beep_event_group, STOP_BEEP_BIT); gptimer_stop(timer); beep_state=0; } return false; } gptimer_handle_t gptimer = NULL; void timer_init_lx1() { gptimer_config_t timer_config = { .clk_src = GPTIMER_CLK_SRC_DEFAULT, // 选择默认的时钟源 .direction = GPTIMER_COUNT_UP, // 计数方向为向上计数 .resolution_hz = 1 * 1000 * 1000, // 分辨率为 1 MHz,即 1 次滴答为 1 微秒 }; // 创建定时器实例 ESP_ERROR_CHECK(gptimer_new_timer(&timer_config, &gptimer)); gptimer_alarm_config_t alarm_config = { .reload_count = 0, // 当警报事件发生时,定时器会自动重载到 0 .alarm_count = 1600, // 设置实际的警报周期,因为分辨率是 1us,所以 1000000 代表 1s .flags.auto_reload_on_alarm = true, // 使能自动重载功能 }; // 设置定时器的警报动作 ESP_ERROR_CHECK(gptimer_set_alarm_action(gptimer, &alarm_config)); beep_event_group = xEventGroupCreate(); gptimer_event_callbacks_t cbs = { .on_alarm = example_timer_on_alarm_cb, // 当警报事件发生时,调用用户回调函数 }; // 注册定时器事件回调函数,允许携带用户上下文 ESP_ERROR_CHECK(gptimer_register_event_callbacks(gptimer, &cbs, NULL)); // 使能定时器 ESP_ERROR_CHECK(gptimer_enable(gptimer)); // 启动定时器 } void beep() { // if (beep_state==0) { // beep_state=1; // ESP_ERROR_CHECK(gptimer_start(gptimer)); // } } void beep_stop() { // // xEventGroupSetBits(beep_event_group, STOP_BEEP_BIT); // xEventGroupSetBits(beep_event_group, STOP_BEEP_BIT); // gptimer_stop(gptimer); // beep_state=0; } static void set_beep() { } static void set_beep_stop() { // // Stop fading // ESP_ERROR_CHECK(ledc_set_duty(LEDC_MODE, LEDC_CHANNEL, 0)); // // Update duty to apply the new value // ESP_ERROR_CHECK(ledc_update_duty(LEDC_MODE, LEDC_CHANNEL)); } static void beep_task(void * arg) { for(;;) { EventBits_t bits = xEventGroupWaitBits(beep_event_group, BEEP_BIT | STOP_BEEP_BIT, pdTRUE, pdFALSE, portMAX_DELAY); if(bits & BEEP_BIT) { hc595_gpio_write(2,1); } if(bits & STOP_BEEP_BIT) { hc595_gpio_write(2,0); } } } /** * @brief 蜂鸣器模块初始化 */ void beep_init(void) { // timer_init_lx1(); // hc595_gpio_write(2,0); beep_event_group = xEventGroupCreate(); // xTaskCreate(beep_task, "beep_task", 2048, NULL, 5, NULL); }