| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121 |
- /**
- * @Author: 李建
- * @Date: 2025/4/22 10:24
- * Description: 蜂鸣器模块
- * Copyright: Copyright (©) 2025 永续绿建. All rights reserved.
- */
- #include "freertos/FreeRTOS.h"
- #include <freertos/event_groups.h>
- #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 <driver/timer.h>
- 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);
- }
|