beep.c 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121
  1. /**
  2. * @Author: 李建
  3. * @Date: 2025/4/22 10:24
  4. * Description: 蜂鸣器模块
  5. * Copyright: Copyright (©) 2025 永续绿建. All rights reserved.
  6. */
  7. #include "freertos/FreeRTOS.h"
  8. #include <freertos/event_groups.h>
  9. #include "beep.h"
  10. #include "driver/ledc.h"
  11. #include "esp_err.h"
  12. #include "esp_timer.h"
  13. #include "main.h"
  14. #include "extend_io.h"
  15. #include "driver/gptimer.h"
  16. #include "soc/timer_group_struct.h"
  17. #define BEEP_BIT BIT0
  18. #define STOP_BEEP_BIT BIT1
  19. static EventGroupHandle_t beep_event_group;
  20. #include <driver/timer.h>
  21. esp_timer_handle_t esp_timer_handle1 = 0; //定时器句柄
  22. uint8_t beep_state = 0;
  23. // 用户自定义ISR
  24. static bool example_timer_on_alarm_cb(gptimer_handle_t timer, const gptimer_alarm_event_data_t *edata, void *user_ctx)
  25. {
  26. uint32_t index=0;
  27. if (beep_state==1) {
  28. xEventGroupSetBits(beep_event_group, BEEP_BIT);
  29. index++;
  30. beep_state=2;
  31. }else if (beep_state==2){
  32. xEventGroupSetBits(beep_event_group, STOP_BEEP_BIT);
  33. beep_state=1;
  34. }
  35. if (index>=1000) {
  36. // esp_timer_stop(esp_timer_handle1);
  37. xEventGroupSetBits(beep_event_group, STOP_BEEP_BIT);
  38. gptimer_stop(timer);
  39. beep_state=0;
  40. }
  41. return false;
  42. }
  43. gptimer_handle_t gptimer = NULL;
  44. void timer_init_lx1() {
  45. gptimer_config_t timer_config = {
  46. .clk_src = GPTIMER_CLK_SRC_DEFAULT, // 选择默认的时钟源
  47. .direction = GPTIMER_COUNT_UP, // 计数方向为向上计数
  48. .resolution_hz = 1 * 1000 * 1000, // 分辨率为 1 MHz,即 1 次滴答为 1 微秒
  49. };
  50. // 创建定时器实例
  51. ESP_ERROR_CHECK(gptimer_new_timer(&timer_config, &gptimer));
  52. gptimer_alarm_config_t alarm_config = {
  53. .reload_count = 0, // 当警报事件发生时,定时器会自动重载到 0
  54. .alarm_count = 1600, // 设置实际的警报周期,因为分辨率是 1us,所以 1000000 代表 1s
  55. .flags.auto_reload_on_alarm = true, // 使能自动重载功能
  56. };
  57. // 设置定时器的警报动作
  58. ESP_ERROR_CHECK(gptimer_set_alarm_action(gptimer, &alarm_config));
  59. beep_event_group = xEventGroupCreate();
  60. gptimer_event_callbacks_t cbs = {
  61. .on_alarm = example_timer_on_alarm_cb, // 当警报事件发生时,调用用户回调函数
  62. };
  63. // 注册定时器事件回调函数,允许携带用户上下文
  64. ESP_ERROR_CHECK(gptimer_register_event_callbacks(gptimer, &cbs, NULL));
  65. // 使能定时器
  66. ESP_ERROR_CHECK(gptimer_enable(gptimer));
  67. // 启动定时器
  68. }
  69. void beep() {
  70. // if (beep_state==0) {
  71. // beep_state=1;
  72. // ESP_ERROR_CHECK(gptimer_start(gptimer));
  73. // }
  74. }
  75. void beep_stop() {
  76. // // xEventGroupSetBits(beep_event_group, STOP_BEEP_BIT);
  77. // xEventGroupSetBits(beep_event_group, STOP_BEEP_BIT);
  78. // gptimer_stop(gptimer);
  79. // beep_state=0;
  80. }
  81. static void set_beep() {
  82. }
  83. static void set_beep_stop() {
  84. // // Stop fading
  85. // ESP_ERROR_CHECK(ledc_set_duty(LEDC_MODE, LEDC_CHANNEL, 0));
  86. // // Update duty to apply the new value
  87. // ESP_ERROR_CHECK(ledc_update_duty(LEDC_MODE, LEDC_CHANNEL));
  88. }
  89. static void beep_task(void * arg) {
  90. for(;;) {
  91. EventBits_t bits = xEventGroupWaitBits(beep_event_group, BEEP_BIT | STOP_BEEP_BIT, pdTRUE, pdFALSE, portMAX_DELAY);
  92. if(bits & BEEP_BIT) {
  93. hc595_gpio_write(2,1);
  94. }
  95. if(bits & STOP_BEEP_BIT) {
  96. hc595_gpio_write(2,0);
  97. }
  98. }
  99. }
  100. /**
  101. * @brief 蜂鸣器模块初始化
  102. */
  103. void beep_init(void) {
  104. // timer_init_lx1();
  105. // hc595_gpio_write(2,0);
  106. beep_event_group = xEventGroupCreate();
  107. // xTaskCreate(beep_task, "beep_task", 2048, NULL, 5, NULL);
  108. }