; ; Copyright (c) 2020 Raspberry Pi (Trading) Ltd. ; ; SPDX-License-Identifier: BSD-3-Clause ; ; Side-set pin 0 is used for PWM output .program pwm .side_set 1 opt pull noblock side 0 ; Pull from FIFO to OSR if available, else copy X to OSR. mov x, osr ; Copy most-recently-pulled value back to scratch X mov y, isr ; ISR contains PWM period. Y used as counter. countloop: jmp x!=y noset ; Set pin high if X == Y, keep the two paths length matched jmp skip side 1 noset: nop ; Single dummy cycle to keep the two paths the same length skip: jmp y-- countloop ; Loop until Y hits 0, then pull a fresh PWM value from FIFO % c-sdk { static inline void pwm_program_init(PIO pio, uint sm, uint offset, uint pin) { pio_gpio_init(pio, pin); pio_sm_set_consecutive_pindirs(pio, sm, pin, 1, true); pio_sm_config c = pwm_program_get_default_config(offset); sm_config_set_sideset_pins(&c, pin); pio_sm_init(pio, sm, offset, &c); } %}