hal_esp32.c 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  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. if (gpio_output_enable(target) == ESP_OK) {
  19. return CHLCD_SUCCESS;
  20. }
  21. return CHLCD_BAD_ARGUMENT;
  22. }
  23. chlcd_error_t chlcd_pin_write(chlcd_pin_t target, bool state) {
  24. if (gpio_set_level(target, state ? 1 : 0) == ESP_OK) {
  25. return CHLCD_SUCCESS;
  26. }
  27. return CHLCD_BAD_ARGUMENT;
  28. }
  29. chlcd_error_t chlcd_pin_set_pwm(chlcd_pin_t target) {
  30. ledc_timer_config_t timer_config[1] = {0};
  31. timer_config->speed_mode = LEDC_LOW_SPEED_MODE;
  32. timer_config->duty_resolution = LEDC_TIMER_12_BIT;
  33. timer_config->clk_cfg = LEDC_AUTO_CLK;
  34. timer_config->freq_hz = CHLCD_LED_PWM_FREQUENCY;
  35. timer_config->timer_num = CHLCD_LED_PWM_CHANNEL;
  36. if (ledc_timer_config(timer_config) != ESP_OK) {
  37. return CHLCD_BAD_ARGUMENT;
  38. }
  39. ledc_channel_config_t channel_config[1] = {0};
  40. channel_config->speed_mode = LEDC_LOW_SPEED_MODE;
  41. channel_config->channel = CHLCD_LED_PWM_CHANNEL;
  42. channel_config->timer_sel = CHLCD_LED_PWM_TIMER;
  43. channel_config->gpio_num = target;
  44. channel_config->duty = 0;
  45. channel_config->hpoint = 0;
  46. channel_config->sleep_mode = LEDC_SLEEP_MODE_KEEP_ALIVE;
  47. if (ledc_channel_config(channel_config) != ESP_OK) {
  48. return CHLCD_BAD_ARGUMENT;
  49. }
  50. return CHLCD_SUCCESS;
  51. }
  52. chlcd_error_t chlcd_pin_write_pwm(
  53. chlcd_pin_t target,
  54. uint16_t pwm
  55. ) {
  56. return CHLCD_SUCCESS;
  57. }
  58. chlcd_error_t chlcd_sleep_us(uint32_t time) {
  59. if (time < 1000) {
  60. ets_delay_us(time);
  61. return CHLCD_SUCCESS;
  62. }
  63. vTaskDelay(time / 1000 / portTICK_PERIOD_MS);
  64. return CHLCD_SUCCESS;
  65. }
  66. #endif