├── CMakeLists.txt ├── esp32.overlay ├── prj.conf └── src └── main.c /CMakeLists.txt: -------------------------------------------------------------------------------- 1 | cmake_minimum_required(VERSION 3.22) 2 | set(BOARD esp32) 3 | 4 | find_package(Zephyr) 5 | project(hello_world_blinky) 6 | 7 | target_sources(app PRIVATE src/main.c) 8 | -------------------------------------------------------------------------------- /esp32.overlay: -------------------------------------------------------------------------------- 1 | / { 2 | pwmleds { 3 | compatible = "pwm-leds"; 4 | fading_led: fading_led { 5 | pwms = <&ledc0 0 10000 PWM_POLARITY_NORMAL>; 6 | }; 7 | }; 8 | }; 9 | 10 | &pinctrl { 11 | ledc0_default: ledc0_default { 12 | group1 { 13 | pinmux = ; 14 | output-enable; 15 | }; 16 | }; 17 | }; 18 | 19 | &ledc0 { 20 | pinctrl-0 = <&ledc0_default>; 21 | pinctrl-names = "default"; 22 | status = "okay"; 23 | #address-cells = <1>; 24 | #size-cells = <0>; 25 | channel0@0 { 26 | reg = <0x0>; 27 | timer = <0>; 28 | }; 29 | }; -------------------------------------------------------------------------------- /prj.conf: -------------------------------------------------------------------------------- 1 | CONFIG_PWM=y -------------------------------------------------------------------------------- /src/main.c: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | 5 | #define NUM_STEPS 100U 6 | #define SLEEP_DELTA_MSEC 20U 7 | 8 | static const struct pwm_dt_spec fading_led = 9 | PWM_DT_SPEC_GET(DT_NODELABEL(fading_led)); 10 | 11 | static uint32_t pulse_width_nsec = 0U; 12 | static uint32_t pulse_width_delta_nsec = 0U; 13 | static uint32_t steps_taken = 0U; 14 | static bool increasing_intensity = true; 15 | int ret; 16 | 17 | void led_delta_timer_handler(struct k_timer *timer_info) 18 | { 19 | if (increasing_intensity) { 20 | if (steps_taken < NUM_STEPS) { 21 | ret = pwm_set_pulse_dt(&fading_led, pulse_width_nsec); 22 | steps_taken++; 23 | pulse_width_nsec += pulse_width_delta_nsec; 24 | } else { 25 | increasing_intensity = false; 26 | steps_taken--; 27 | pulse_width_nsec -= pulse_width_delta_nsec; 28 | } 29 | } else { 30 | if (steps_taken > 0) { 31 | ret = pwm_set_pulse_dt(&fading_led, pulse_width_nsec); 32 | steps_taken--; 33 | pulse_width_nsec -= pulse_width_delta_nsec; 34 | } else { 35 | increasing_intensity = true; 36 | steps_taken++; 37 | pulse_width_nsec += pulse_width_delta_nsec; 38 | } 39 | } 40 | } 41 | 42 | K_TIMER_DEFINE(led_delta_timer, led_delta_timer_handler, NULL); 43 | 44 | void main(void) 45 | { 46 | if (!device_is_ready(fading_led.dev)) { 47 | printk("Error: PWM device %s is not ready\n", 48 | fading_led.dev->name); 49 | return; 50 | } 51 | 52 | pulse_width_delta_nsec = fading_led.period / NUM_STEPS; 53 | 54 | k_timer_start(&led_delta_timer, K_MSEC(SLEEP_DELTA_MSEC), 55 | K_MSEC(SLEEP_DELTA_MSEC)); 56 | } 57 | --------------------------------------------------------------------------------