Loading...
Searching...
No Matches
pwm.h
Go to the documentation of this file.
1/*
2 * Copyright (c) 2020 Raspberry Pi (Trading) Ltd.
3 *
4 * SPDX-License-Identifier: BSD-3-Clause
5 */
6
7#ifndef _HARDWARE_PWM_H
8#define _HARDWARE_PWM_H
9
10#include "pico.h"
11#include "hardware/structs/pwm.h"
12#include "hardware/regs/dreq.h"
13#include "hardware/regs/intctrl.h"
14
15#ifdef __cplusplus
16extern "C" {
17#endif
18
19// PICO_CONFIG: PARAM_ASSERTIONS_ENABLED_HARDWARE_PWM, Enable/disable assertions in the hardware_pwm module, type=bool, default=0, group=hardware_pwm
20#ifndef PARAM_ASSERTIONS_ENABLED_HARDWARE_PWM
21#ifdef PARAM_ASSERTIONS_ENABLED_PWM // backwards compatibility with SDK < 2.0.0
22#define PARAM_ASSERTIONS_ENABLED_HARDWARE_PWM PARAM_ASSERTIONS_ENABLED_PWM
23#else
24#define PARAM_ASSERTIONS_ENABLED_HARDWARE_PWM 0
25#endif
26#endif
27
49
61
62enum pwm_chan
63{
64 PWM_CHAN_A = 0,
65 PWM_CHAN_B = 1
66};
67
74typedef struct {
75 uint32_t csr;
76 uint32_t div;
77 uint32_t top;
79
88#ifndef PWM_DREQ_NUM
89static_assert(DREQ_PWM_WRAP1 == DREQ_PWM_WRAP0 + 1, "");
90static_assert(DREQ_PWM_WRAP7 == DREQ_PWM_WRAP0 + 7, "");
91#define PWM_DREQ_NUM(slice_num) (DREQ_PWM_WRAP0 + (slice_num))
92#endif
93
100#ifndef PWM_GPIO_SLICE_NUM
101#define PWM_GPIO_SLICE_NUM(gpio) ({ \
102 uint slice_num; \
103 if ((gpio) < 32) { \
104 slice_num = ((gpio) >> 1u) & 7u; \
105 } else { \
106 slice_num = 8u + (((gpio) >> 1u) & 3u); \
107 } \
108 slice_num; \
109})
110#endif
111
112// PICO_CONFIG: PICO_PWM_CLKDIV_ROUND_NEAREST, True if floating point PWM clock divisors should be rounded to the nearest possible clock divisor rather than rounding down, type=bool, default=PICO_CLKDIV_ROUND_NEAREST, group=hardware_pwm
113#ifndef PICO_PWM_CLKDIV_ROUND_NEAREST
114#define PICO_PWM_CLKDIV_ROUND_NEAREST PICO_CLKDIV_ROUND_NEAREST
115#endif
116
117static inline void check_slice_num_param(__unused uint slice_num) {
118 valid_params_if(HARDWARE_PWM, slice_num < NUM_PWM_SLICES);
119}
120
126static inline uint pwm_gpio_to_slice_num(uint gpio) {
127 valid_params_if(HARDWARE_PWM, gpio < NUM_BANK0_GPIOS);
128 return PWM_GPIO_SLICE_NUM(gpio);
129}
130
138static inline uint pwm_gpio_to_channel(uint gpio) {
139 valid_params_if(HARDWARE_PWM, gpio < NUM_BANK0_GPIOS);
140 return gpio & 1u;
141}
142
152static inline void pwm_config_set_phase_correct(pwm_config *c, bool phase_correct) {
153 c->csr = (c->csr & ~PWM_CH0_CSR_PH_CORRECT_BITS)
154 | (bool_to_bit(phase_correct) << PWM_CH0_CSR_PH_CORRECT_LSB);
155}
156
167static inline void pwm_config_set_clkdiv(pwm_config *c, float div) {
168 valid_params_if(HARDWARE_PWM, div >= 1.f && div < 256.f);
169 const int frac_bit_count = REG_FIELD_WIDTH(PWM_CH0_DIV_FRAC);
170#if PICO_PWM_CLKDIV_ROUND_NEAREST
171 div += 0.5f / (1 << frac_bit_count); // round to the nearest fraction
172#endif
173 c->div = (uint32_t)(div * (float)(1u << frac_bit_count));
174}
175
187static inline void pwm_config_set_clkdiv_int_frac4(pwm_config *c, uint32_t div_int, uint8_t div_frac4) {
188 static_assert(REG_FIELD_WIDTH(PWM_CH0_DIV_INT) == 8, "");
189 valid_params_if(HARDWARE_PWM, div_int >= 1 && div_int < 256);
190 static_assert(REG_FIELD_WIDTH(PWM_CH0_DIV_FRAC) == 4, "");
191 valid_params_if(HARDWARE_PWM, div_frac4 < 16);
192 c->div = (((uint)div_int) << PWM_CH0_DIV_INT_LSB) | (((uint)div_frac4) << PWM_CH0_DIV_FRAC_LSB);
193}
194
195// backwards compatibility
196static inline void pwm_config_set_clkdiv_int_frac(pwm_config *c, uint8_t div_int, uint8_t div_frac4) {
197 pwm_config_set_clkdiv_int_frac4(c, div_int, div_frac4);
198}
199
210static inline void pwm_config_set_clkdiv_int(pwm_config *c, uint32_t div_int) {
211 pwm_config_set_clkdiv_int_frac4(c, div_int, 0);
212}
213
224static inline void pwm_config_set_clkdiv_mode(pwm_config *c, enum pwm_clkdiv_mode mode) {
225 valid_params_if(HARDWARE_PWM, mode == PWM_DIV_FREE_RUNNING ||
226 mode == PWM_DIV_B_RISING ||
227 mode == PWM_DIV_B_HIGH ||
228 mode == PWM_DIV_B_FALLING);
229 c->csr = (c->csr & ~PWM_CH0_CSR_DIVMODE_BITS)
230 | (((uint)mode) << PWM_CH0_CSR_DIVMODE_LSB);
231}
232
240static inline void pwm_config_set_output_polarity(pwm_config *c, bool a, bool b) {
241 c->csr = (c->csr & ~(PWM_CH0_CSR_A_INV_BITS | PWM_CH0_CSR_B_INV_BITS))
242 | ((bool_to_bit(a) << PWM_CH0_CSR_A_INV_LSB) | (bool_to_bit(b) << PWM_CH0_CSR_B_INV_LSB));
243}
244
253static inline void pwm_config_set_wrap(pwm_config *c, uint16_t wrap) {
254 c->top = wrap;
255}
256
268static inline void pwm_init(uint slice_num, pwm_config *c, bool start) {
269 check_slice_num_param(slice_num);
270 pwm_hw->slice[slice_num].csr = 0;
271
272 pwm_hw->slice[slice_num].ctr = PWM_CH0_CTR_RESET;
273 pwm_hw->slice[slice_num].cc = PWM_CH0_CC_RESET;
274 pwm_hw->slice[slice_num].top = c->top;
275 pwm_hw->slice[slice_num].div = c->div;
276 pwm_hw->slice[slice_num].csr = c->csr | (bool_to_bit(start) << PWM_CH0_CSR_EN_LSB);
277}
278
288 pwm_config c = {0, 0, 0};
292 pwm_config_set_output_polarity(&c, false, false);
293 pwm_config_set_wrap(&c, 0xffffu);
294 return c;
295}
296
312static inline void pwm_set_wrap(uint slice_num, uint16_t wrap) {
313 check_slice_num_param(slice_num);
314 pwm_hw->slice[slice_num].top = wrap;
315}
316
332static inline void pwm_set_chan_level(uint slice_num, uint chan, uint16_t level) {
333 check_slice_num_param(slice_num);
335 &pwm_hw->slice[slice_num].cc,
336 ((uint)level) << (chan ? PWM_CH0_CC_B_LSB : PWM_CH0_CC_A_LSB),
337 chan ? PWM_CH0_CC_B_BITS : PWM_CH0_CC_A_BITS
338 );
339}
340
356static inline void pwm_set_both_levels(uint slice_num, uint16_t level_a, uint16_t level_b) {
357 check_slice_num_param(slice_num);
358 pwm_hw->slice[slice_num].cc = (((uint)level_b) << PWM_CH0_CC_B_LSB) | (((uint)level_a) << PWM_CH0_CC_A_LSB);
359}
360
379static inline void pwm_set_gpio_level(uint gpio, uint16_t level) {
380 valid_params_if(HARDWARE_PWM, gpio < NUM_BANK0_GPIOS);
382}
383
392static inline uint16_t pwm_get_counter(uint slice_num) {
393 check_slice_num_param(slice_num);
394 return (uint16_t)(pwm_hw->slice[slice_num].ctr);
395}
396
406static inline void pwm_set_counter(uint slice_num, uint16_t c) {
407 check_slice_num_param(slice_num);
408 pwm_hw->slice[slice_num].ctr = c;
409}
410
420static inline void pwm_advance_count(uint slice_num) {
421 check_slice_num_param(slice_num);
422 hw_set_bits(&pwm_hw->slice[slice_num].csr, PWM_CH0_CSR_PH_ADV_BITS);
423 while (pwm_hw->slice[slice_num].csr & PWM_CH0_CSR_PH_ADV_BITS) {
425 }
426}
427
437static inline void pwm_retard_count(uint slice_num) {
438 check_slice_num_param(slice_num);
439 hw_set_bits(&pwm_hw->slice[slice_num].csr, PWM_CH0_CSR_PH_RET_BITS);
440 while (pwm_hw->slice[slice_num].csr & PWM_CH0_CSR_PH_RET_BITS) {
442 }
443}
444
454static inline void pwm_set_clkdiv_int_frac4(uint slice_num, uint8_t div_int, uint8_t div_frac4) {
455 check_slice_num_param(slice_num);
456 valid_params_if(HARDWARE_PWM, div_int >= 1);
457 static_assert(REG_FIELD_WIDTH(PWM_CH0_DIV_FRAC) == 4, "");
458 valid_params_if(HARDWARE_PWM, div_frac4 < 16);
459 pwm_hw->slice[slice_num].div = (((uint)div_int) << PWM_CH0_DIV_INT_LSB) | (((uint)div_frac4) << PWM_CH0_DIV_FRAC_LSB);
460}
461
462// backwards compatibility
463static inline void pwm_set_clkdiv_int_frac(uint slice_num, uint8_t div_int, uint8_t div_frac4) {
464 pwm_set_clkdiv_int_frac4(slice_num, div_int, div_frac4);
465}
466
475static inline void pwm_set_clkdiv(uint slice_num, float divider) {
476 check_slice_num_param(slice_num);
477 valid_params_if(HARDWARE_PWM, divider >= 1.f && divider < 256.f);
478 uint8_t i = (uint8_t)divider;
479 uint8_t f = (uint8_t)((divider - i) * (0x01 << 4));
480 pwm_set_clkdiv_int_frac4(slice_num, i, f);
481}
482
490static inline void pwm_set_output_polarity(uint slice_num, bool a, bool b) {
491 check_slice_num_param(slice_num);
492 hw_write_masked(&pwm_hw->slice[slice_num].csr, bool_to_bit(a) << PWM_CH0_CSR_A_INV_LSB | bool_to_bit(b) << PWM_CH0_CSR_B_INV_LSB,
493 PWM_CH0_CSR_A_INV_BITS | PWM_CH0_CSR_B_INV_BITS);
494}
495
496
503static inline void pwm_set_clkdiv_mode(uint slice_num, enum pwm_clkdiv_mode mode) {
504 check_slice_num_param(slice_num);
505 valid_params_if(HARDWARE_PWM, mode == PWM_DIV_FREE_RUNNING ||
506 mode == PWM_DIV_B_RISING ||
507 mode == PWM_DIV_B_HIGH ||
508 mode == PWM_DIV_B_FALLING);
509 hw_write_masked(&pwm_hw->slice[slice_num].csr, ((uint)mode) << PWM_CH0_CSR_DIVMODE_LSB, PWM_CH0_CSR_DIVMODE_BITS);
510}
511
521static inline void pwm_set_phase_correct(uint slice_num, bool phase_correct) {
522 check_slice_num_param(slice_num);
523 hw_write_masked(&pwm_hw->slice[slice_num].csr, bool_to_bit(phase_correct) << PWM_CH0_CSR_PH_CORRECT_LSB, PWM_CH0_CSR_PH_CORRECT_BITS);
524}
525
552static inline void pwm_set_enabled(uint slice_num, bool enabled) {
553 check_slice_num_param(slice_num);
554 hw_write_masked(&pwm_hw->slice[slice_num].csr, bool_to_bit(enabled) << PWM_CH0_CSR_EN_LSB, PWM_CH0_CSR_EN_BITS);
555}
556
562static inline void pwm_set_mask_enabled(uint32_t mask) {
563 pwm_hw->en = mask;
564}
565
582#ifndef PWM_DEFAULT_IRQ_NUM
583#if PICO_RP2040
584#define PWM_DEFAULT_IRQ_NUM() PWM_IRQ_WRAP
585#else
586#define PWM_DEFAULT_IRQ_NUM() PWM_IRQ_WRAP_0
587// backwards compatibility with RP2040
588#define PWM_IRQ_WRAP PWM_IRQ_WRAP_0
589#define isr_pwm_wrap isr_pwm_wrap_0
590#endif
591#endif
592
603static inline void pwm_set_irq_enabled(uint slice_num, bool enabled) {
604 check_slice_num_param(slice_num);
605 if (enabled) {
606 hw_set_bits(&pwm_hw->inte, 1u << slice_num);
607 } else {
608 hw_clear_bits(&pwm_hw->inte, 1u << slice_num);
609 }
610}
611
620static inline void pwm_set_irq0_enabled(uint slice_num, bool enabled) {
621 // irq0 always corresponds to the default IRQ
622 pwm_set_irq_enabled(slice_num, enabled);
623}
624
625#if NUM_PWM_IRQS > 1
634static inline void pwm_set_irq1_enabled(uint slice_num, bool enabled) {
635 check_slice_num_param(slice_num);
636 if (enabled) {
637 hw_set_bits(&pwm_hw->inte1, 1u << slice_num);
638 } else {
639 hw_clear_bits(&pwm_hw->inte1, 1u << slice_num);
640 }
641}
642#endif
643
655static inline void pwm_irqn_set_slice_enabled(uint irq_index, uint slice_num, bool enabled) {
656 check_slice_num_param(slice_num);
657 invalid_params_if(HARDWARE_PWM, irq_index >= NUM_PWM_IRQS);
658 check_slice_num_param(slice_num);
659 if (enabled) {
660 hw_set_bits(&pwm_hw->irq_ctrl[irq_index].inte, 1u << slice_num);
661 } else {
662 hw_clear_bits(&pwm_hw->irq_ctrl[irq_index].inte, 1u << slice_num);
663 }
664}
665
676static inline void pwm_set_irq_mask_enabled(uint32_t slice_mask, bool enabled) {
677 valid_params_if(HARDWARE_PWM, slice_mask < 256);
678#if PICO_RP2040
679 if (enabled) {
680 hw_set_bits(&pwm_hw->inte, slice_mask);
681 } else {
682 hw_clear_bits(&pwm_hw->inte, slice_mask);
683 }
684#else
685 static_assert(PWM_IRQ_WRAP_1 == PWM_IRQ_WRAP_0 + 1, "");
686 uint irq_index = PWM_DEFAULT_IRQ_NUM() - PWM_IRQ_WRAP_0;
687 if (enabled) {
688 hw_set_bits(&pwm_hw->irq_ctrl[irq_index].inte, slice_mask);
689 } else {
690 hw_clear_bits(&pwm_hw->irq_ctrl[irq_index].inte, slice_mask);
691 }
692#endif
693}
694
703static inline void pwm_set_irq0_mask_enabled(uint32_t slice_mask, bool enabled) {
704 // default irq is irq0
705 pwm_set_irq_mask_enabled(slice_mask, enabled);
706}
707
708#if NUM_PWM_IRQS > 1
717static inline void pwm_set_irq1_mask_enabled(uint32_t slice_mask, bool enabled) {
718 if (enabled) {
719 hw_set_bits(&pwm_hw->inte1, slice_mask);
720 } else {
721 hw_clear_bits(&pwm_hw->inte1, slice_mask);
722 }
723}
724#endif
725
737static inline void pwm_irqn_set_slice_mask_enabled(uint irq_index, uint slice_mask, bool enabled) {
738 invalid_params_if(HARDWARE_PWM, irq_index >= NUM_PWM_IRQS);
739 if (enabled) {
740 hw_set_bits(&pwm_hw->irq_ctrl[irq_index].inte, slice_mask);
741 } else {
742 hw_clear_bits(&pwm_hw->irq_ctrl[irq_index].inte, slice_mask);
743 }
744}
745
751static inline void pwm_clear_irq(uint slice_num) {
752 pwm_hw->intr = 1u << slice_num;
753}
754
760static inline uint32_t pwm_get_irq_status_mask(void) {
761 return pwm_hw->ints;
762}
763
769static inline uint32_t pwm_get_irq0_status_mask(void) {
771}
772
773#if NUM_PWM_IRQS > 1
779static inline uint32_t pwm_get_irq1_status_mask(void) {
780 return pwm_hw->ints1;
781}
782#endif
783
790static inline uint32_t pwm_irqn_get_status_mask(uint irq_index) {
791 invalid_params_if(HARDWARE_PWM, irq_index >= NUM_PWM_IRQS);
792 return pwm_hw->irq_ctrl[irq_index].ints;
793}
794
800static inline void pwm_force_irq(uint slice_num) {
801 pwm_hw->intf = 1u << slice_num;
802}
803
809static inline void pwm_force_irq0(uint slice_num) {
810 pwm_force_irq(slice_num);
811}
812
813#if NUM_PWM_IRQS > 1
819static inline void pwm_force_irq1(uint slice_num) {
820 pwm_hw->intf1 = 1u << slice_num;
821}
822#endif
823
830static inline void pwm_irqn_force(uint irq_index, uint slice_num) {
831 invalid_params_if(HARDWARE_PWM, irq_index >= NUM_PWM_IRQS);
832 pwm_hw->irq_ctrl[irq_index].intf = 1u << slice_num;
833}
834
840static inline uint pwm_get_dreq(uint slice_num) {
841 check_slice_num_param(slice_num);
842 return PWM_DREQ_NUM(slice_num);
843}
844
845#ifdef __cplusplus
846}
847#endif
848
849#endif
static __force_inline void hw_set_bits(io_rw_32 *addr, uint32_t mask)
Atomically set the specified bits to 1 in a HW register.
Definition address_mapped.h:135
static __force_inline void hw_write_masked(io_rw_32 *addr, uint32_t values, uint32_t write_mask)
Set new values for a sub-set of the bits in a HW register.
Definition address_mapped.h:171
static __force_inline void hw_clear_bits(io_rw_32 *addr, uint32_t mask)
Atomically clear the specified bits to 0 in a HW register.
Definition address_mapped.h:145
@ DREQ_PWM_WRAP1
Select PWM Counter 1's Wrap Value as DREQ.
Definition dreq.h:115
@ DREQ_PWM_WRAP0
Select PWM Counter 0's Wrap Value as DREQ.
Definition dreq.h:114
@ DREQ_PWM_WRAP7
Select PWM Counter 7's Wrap Value as DREQ.
Definition dreq.h:121
@ PWM_IRQ_WRAP_1
Select PWM's WRAP_1 IRQ output.
Definition intctrl.h:83
@ PWM_IRQ_WRAP_0
Select PWM's WRAP_0 IRQ output.
Definition intctrl.h:82
static void pwm_init(uint slice_num, pwm_config *c, bool start)
Initialise a PWM with settings from a configuration object.
Definition pwm.h:268
static void pwm_config_set_phase_correct(pwm_config *c, bool phase_correct)
Set phase correction in a PWM configuration.
Definition pwm.h:152
static void pwm_set_irq_enabled(uint slice_num, bool enabled)
Enable PWM instance interrupt via the default PWM IRQ (PWM_IRQ_WRAP_0 on RP2350).
Definition pwm.h:603
pwm_clkdiv_mode
PWM Divider mode settings.
Definition pwm.h:55
static void pwm_set_clkdiv_int_frac4(uint slice_num, uint8_t div_int, uint8_t div_frac4)
Set PWM clock divider using an 8:4 fractional value.
Definition pwm.h:454
static void pwm_retard_count(uint slice_num)
Retard PWM count.
Definition pwm.h:437
static void pwm_config_set_clkdiv_int(pwm_config *c, uint32_t div_int)
Set PWM clock divider in a PWM configuration.
Definition pwm.h:210
static uint16_t pwm_get_counter(uint slice_num)
Get PWM counter.
Definition pwm.h:392
static void pwm_set_chan_level(uint slice_num, uint chan, uint16_t level)
Set the current PWM counter compare value for one channel.
Definition pwm.h:332
static uint32_t pwm_get_irq0_status_mask(void)
Get PWM interrupt status, raw for the PWM_IRQ_WRAP_0.
Definition pwm.h:769
static void pwm_set_clkdiv_mode(uint slice_num, enum pwm_clkdiv_mode mode)
Set PWM divider mode.
Definition pwm.h:503
static void pwm_set_enabled(uint slice_num, bool enabled)
Enable/Disable PWM.
Definition pwm.h:552
static void pwm_set_mask_enabled(uint32_t mask)
Enable/Disable multiple PWM slices simultaneously.
Definition pwm.h:562
static void pwm_set_gpio_level(uint gpio, uint16_t level)
Helper function to set the PWM level for the slice and channel associated with a GPIO.
Definition pwm.h:379
static void pwm_config_set_clkdiv_mode(pwm_config *c, enum pwm_clkdiv_mode mode)
Set PWM counting mode in a PWM configuration.
Definition pwm.h:224
static void pwm_irqn_set_slice_enabled(uint irq_index, uint slice_num, bool enabled)
Enable PWM instance interrupt via either PWM_IRQ_WRAP_0 or PWM_IRQ_WRAP_1.
Definition pwm.h:655
static uint pwm_get_dreq(uint slice_num)
Return the DREQ to use for pacing transfers to a particular PWM slice.
Definition pwm.h:840
static void pwm_force_irq(uint slice_num)
Force PWM interrupt for the default PWM IRQ (PWM_IRQ_WRAP_0 on RP2350).
Definition pwm.h:800
static void pwm_irqn_force(uint irq_index, uint slice_num)
Force PWM interrupt via PWM_IRQ_WRAP_0 or PWM_IRQ_WRAP_1.
Definition pwm.h:830
static void pwm_set_counter(uint slice_num, uint16_t c)
Set PWM counter.
Definition pwm.h:406
static void pwm_force_irq0(uint slice_num)
Force PWM interrupt via PWM_IRQ_WRAP_0.
Definition pwm.h:809
static uint32_t pwm_get_irq_status_mask(void)
Get PWM interrupt status, raw for the default PWM IRQ (PWM_IRQ_WRAP_0 on RP2350).
Definition pwm.h:760
static void pwm_config_set_clkdiv(pwm_config *c, float div)
Set PWM clock divider in a PWM configuration.
Definition pwm.h:167
static void pwm_irqn_set_slice_mask_enabled(uint irq_index, uint slice_mask, bool enabled)
Enable PWM instance interrupts via either PWM_IRQ_WRAP_0 or PWM_IRQ_WRAP_1.
Definition pwm.h:737
static void pwm_set_wrap(uint slice_num, uint16_t wrap)
Set the current PWM counter wrap value.
Definition pwm.h:312
#define PWM_DEFAULT_IRQ_NUM()
Returns the irq_num_t for the default PWM IRQ.
Definition pwm.h:586
static void pwm_set_irq0_enabled(uint slice_num, bool enabled)
Enable PWM instance interrupt via PWM_IRQ_WRAP_0.
Definition pwm.h:620
static void pwm_config_set_clkdiv_int_frac4(pwm_config *c, uint32_t div_int, uint8_t div_frac4)
Set PWM clock divider in a PWM configuration using an 8:4 fractional value.
Definition pwm.h:187
static uint pwm_gpio_to_slice_num(uint gpio)
Determine the PWM slice that is attached to the specified GPIO.
Definition pwm.h:126
static void pwm_clear_irq(uint slice_num)
Clear a single PWM channel interrupt.
Definition pwm.h:751
static void pwm_set_clkdiv(uint slice_num, float divider)
Set PWM clock divider.
Definition pwm.h:475
static uint pwm_gpio_to_channel(uint gpio)
Determine the PWM channel that is attached to the specified GPIO.
Definition pwm.h:138
static void pwm_advance_count(uint slice_num)
Advance PWM count.
Definition pwm.h:420
static void pwm_set_output_polarity(uint slice_num, bool a, bool b)
Set PWM output polarity.
Definition pwm.h:490
static uint32_t pwm_irqn_get_status_mask(uint irq_index)
Get PWM interrupt status, raw for either PWM_IRQ_WRAP_0 or PWM_IRQ_WRAP_1.
Definition pwm.h:790
#define PWM_DREQ_NUM(slice_num)
Returns the dreq_num_t used for pacing DMA transfers for a given PWM slice.
Definition pwm.h:91
static void pwm_config_set_output_polarity(pwm_config *c, bool a, bool b)
Set output polarity in a PWM configuration.
Definition pwm.h:240
static void pwm_set_irq_mask_enabled(uint32_t slice_mask, bool enabled)
Enable multiple PWM instance interrupts via the default PWM IRQ (PWM_IRQ_WRAP_0 on RP2350).
Definition pwm.h:676
static void pwm_set_phase_correct(uint slice_num, bool phase_correct)
Set PWM phase correct on/off.
Definition pwm.h:521
static void pwm_config_set_wrap(pwm_config *c, uint16_t wrap)
Set PWM counter wrap value in a PWM configuration.
Definition pwm.h:253
static pwm_config pwm_get_default_config(void)
Get a set of default values for PWM configuration.
Definition pwm.h:287
#define PWM_GPIO_SLICE_NUM(gpio)
Returns the PWM slice number for a given GPIO number.
Definition pwm.h:101
static void pwm_set_irq0_mask_enabled(uint32_t slice_mask, bool enabled)
Enable multiple PWM instance interrupts via PWM_IRQ_WRAP_0.
Definition pwm.h:703
static void pwm_set_both_levels(uint slice_num, uint16_t level_a, uint16_t level_b)
Set PWM counter compare values.
Definition pwm.h:356
@ PWM_DIV_B_FALLING
Fractional divider advances with each falling edge of the PWM B pin.
Definition pwm.h:59
@ PWM_DIV_B_HIGH
Fractional divider is gated by the PWM B pin.
Definition pwm.h:57
@ PWM_DIV_FREE_RUNNING
Free-running counting at rate dictated by fractional divider.
Definition pwm.h:56
@ PWM_DIV_B_RISING
Fractional divider advances with each rising edge of the PWM B pin.
Definition pwm.h:58
static __force_inline void tight_loop_contents(void)
No-op function for the body of tight loops.
Definition common.h:79
PWM configuration structure.
Definition pwm.h:74
uint32_t div
Clock divider register value.
Definition pwm.h:76
uint32_t top
Counter wrap (TOP) value.
Definition pwm.h:77
uint32_t csr
Control and status register value.
Definition pwm.h:75