From 29f8fa35cf7a2cb1630f2afb76dcadd2a5e24e4b Mon Sep 17 00:00:00 2001 From: Drashna Jaelre Date: Thu, 21 Dec 2023 19:38:59 -0800 Subject: [PATCH] [Audio] Enable Complementary output for PWM Hardware driver (#22726) Co-authored-by: Joel Challis --- docs/audio_driver.md | 5 +++++ platforms/chibios/drivers/audio_pwm_hardware.c | 8 +++++++- 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/docs/audio_driver.md b/docs/audio_driver.md index 7bce6c2d9bd..03c0a824dfe 100644 --- a/docs/audio_driver.md +++ b/docs/audio_driver.md @@ -199,6 +199,11 @@ with all this information, the configuration would contain these lines: ChibiOS uses GPIOv1 for the F103, which only knows of one alternate function. On 'larger' STM32s, GPIOv2 or GPIOv3 are used; with them it is also necessary to configure `AUDIO_PWM_PAL_MODE` to the correct alternate function for the selected pin, timer and timer-channel. +You can also use the Complementary output (`TIMx_CHyN`) for PWM on supported controllers. To enable this functionality, you will need to make the following changes: +```c +// config.h: +#define AUDIO_PWM_COMPLEMENTARY_OUTPUT +``` ### PWM software :id=pwm-software diff --git a/platforms/chibios/drivers/audio_pwm_hardware.c b/platforms/chibios/drivers/audio_pwm_hardware.c index 40d891326fd..21b5c6892cd 100644 --- a/platforms/chibios/drivers/audio_pwm_hardware.c +++ b/platforms/chibios/drivers/audio_pwm_hardware.c @@ -22,6 +22,12 @@ # define AUDIO_PWM_COUNTER_FREQUENCY 100000 #endif +#ifndef AUDIO_PWM_COMPLEMENTARY_OUTPUT +# define AUDIO_PWM_OUTPUT_MODE PWM_OUTPUT_ACTIVE_HIGH +#else +# define AUDIO_PWM_OUTPUT_MODE PWM_COMPLEMENTARY_OUTPUT_ACTIVE_HIGH +#endif + extern bool playing_note; extern bool playing_melody; extern uint8_t note_timbre; @@ -29,7 +35,7 @@ extern uint8_t note_timbre; static PWMConfig pwmCFG = {.frequency = AUDIO_PWM_COUNTER_FREQUENCY, /* PWM clock frequency */ .period = 2, .callback = NULL, - .channels = {[(AUDIO_PWM_CHANNEL - 1)] = {.mode = PWM_OUTPUT_ACTIVE_HIGH, .callback = NULL}}}; + .channels = {[(AUDIO_PWM_CHANNEL - 1)] = {.mode = AUDIO_PWM_OUTPUT_MODE, .callback = NULL}}}; static float channel_1_frequency = 0.0f;