hal_esp32.c 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  1. #ifdef CHLCD_ON_ESP
  2. #include <cx/chlcd.h>
  3. #include <driver/gpio.h>
  4. #include <driver/ledc.h>
  5. #include <rom/ets_sys.h>
  6. #include <freertos/FreeRTOS.h>
  7. #include <freertos/task.h>
  8. #ifndef CHLCD_LED_PWM_TIMER
  9. #define CHLCD_LED_PWM_TIMER LEDC_TIMER_MAX
  10. #endif
  11. #ifndef CHLCD_LED_PWM_CHANNEL
  12. #define CHLCD_LED_PWM_CHANNEL LEDC_CHANNEL_MAX
  13. #endif
  14. #ifndef CHLCD_LED_PWM_FREQUENCY
  15. #define CHLCD_LED_PWM_FREQUENCY 20000
  16. #endif
  17. chlcd_error_t chlcd_pin_set_output(chlcd_pin_t target) {
  18. gpio_config_t config[1] = {0};
  19. config->pin_bit_mask = 1UL << target;
  20. config->mode = GPIO_MODE_OUTPUT;
  21. config->pull_up_en = GPIO_PULLUP_DISABLE;
  22. config->pull_down_en = GPIO_PULLDOWN_DISABLE;
  23. config->intr_type = GPIO_INTR_DISABLE;
  24. if (gpio_config(config) == ESP_OK) {
  25. return CHLCD_SUCCESS;
  26. }
  27. return CHLCD_BAD_ARGUMENT;
  28. }
  29. chlcd_error_t chlcd_pin_write(chlcd_pin_t target, bool state) {
  30. if (gpio_set_level(target, state ? 1 : 0) == ESP_OK) {
  31. return CHLCD_SUCCESS;
  32. }
  33. return CHLCD_BAD_ARGUMENT;
  34. }
  35. chlcd_error_t chlcd_pin_set_pwm(chlcd_pin_t target) {
  36. ledc_timer_config_t timer_config[1] = {0};
  37. timer_config->speed_mode = LEDC_LOW_SPEED_MODE;
  38. timer_config->duty_resolution = LEDC_TIMER_12_BIT;
  39. timer_config->clk_cfg = LEDC_AUTO_CLK;
  40. timer_config->freq_hz = CHLCD_LED_PWM_FREQUENCY;
  41. timer_config->timer_num = CHLCD_LED_PWM_CHANNEL;
  42. if (ledc_timer_config(timer_config) != ESP_OK) {
  43. return CHLCD_BAD_ARGUMENT;
  44. }
  45. ledc_channel_config_t channel_config[1] = {0};
  46. channel_config->speed_mode = LEDC_LOW_SPEED_MODE;
  47. channel_config->channel = CHLCD_LED_PWM_CHANNEL;
  48. channel_config->timer_sel = CHLCD_LED_PWM_TIMER;
  49. channel_config->gpio_num = target;
  50. channel_config->duty = 0;
  51. channel_config->hpoint = 0;
  52. channel_config->sleep_mode = LEDC_SLEEP_MODE_KEEP_ALIVE;
  53. if (ledc_channel_config(channel_config) != ESP_OK) {
  54. return CHLCD_BAD_ARGUMENT;
  55. }
  56. return CHLCD_SUCCESS;
  57. }
  58. chlcd_error_t chlcd_pin_write_pwm(
  59. chlcd_pin_t target,
  60. uint16_t pwm
  61. ) {
  62. return CHLCD_SUCCESS;
  63. }
  64. chlcd_error_t chlcd_sleep_us(uint32_t time) {
  65. if (time < 1000) {
  66. ets_delay_us(time);
  67. return CHLCD_SUCCESS;
  68. }
  69. vTaskDelay(time / 1000 / portTICK_PERIOD_MS);
  70. return CHLCD_SUCCESS;
  71. }
  72. #endif