Bläddra i källkod

always return audio pin to 0 on ARM (#24503)

David Hoelscher 1 år sedan
förälder
incheckning
8157b37438
2 ändrade filer med 13 tillägg och 10 borttagningar
  1. 11 7
      platforms/chibios/drivers/audio_pwm_hardware.c
  2. 2 3
      quantum/audio/audio.c

+ 11 - 7
platforms/chibios/drivers/audio_pwm_hardware.c

@@ -41,18 +41,19 @@ static float channel_1_frequency = 0.0f;
 
 void channel_1_set_frequency(float freq) {
     channel_1_frequency = freq;
+    pwmcnt_t period;
+    pwmcnt_t width;
 
     if (freq <= 0.0) {
-        // a pause/rest has freq=0
-        return;
+        period = 2;
+        width  = 0;
+    } else {
+        period = (pwmCFG.frequency / freq);
+        width  = (pwmcnt_t)(((period) * (pwmcnt_t)((100 - note_timbre) * 100)) / (pwmcnt_t)(10000));
     }
-
-    pwmcnt_t period = (pwmCFG.frequency / freq);
     chSysLockFromISR();
     pwmChangePeriodI(&AUDIO_PWM_DRIVER, period);
-    pwmEnableChannelI(&AUDIO_PWM_DRIVER, AUDIO_PWM_CHANNEL - 1,
-                      // adjust the duty-cycle so that the output is for 'note_timbre' duration HIGH
-                      PWM_PERCENTAGE_TO_WIDTH(&AUDIO_PWM_DRIVER, (100 - note_timbre) * 100));
+    pwmEnableChannelI(&AUDIO_PWM_DRIVER, AUDIO_PWM_CHANNEL - 1, width);
     chSysUnlockFromISR();
 }
 
@@ -67,6 +68,9 @@ void channel_1_start(void) {
 
 void channel_1_stop(void) {
     pwmStop(&AUDIO_PWM_DRIVER);
+    pwmStart(&AUDIO_PWM_DRIVER, &pwmCFG);
+    pwmEnableChannel(&AUDIO_PWM_DRIVER, AUDIO_PWM_CHANNEL - 1, 0);
+    pwmStop(&AUDIO_PWM_DRIVER);
 }
 
 static virtual_timer_t audio_vt;

+ 2 - 3
quantum/audio/audio.c

@@ -258,11 +258,10 @@ void audio_stop_tone(float pitch) {
         for (int i = AUDIO_TONE_STACKSIZE - 1; i >= 0; i--) {
             found = (tones[i].pitch == pitch);
             if (found) {
-                tones[i] = (musical_tone_t){.time_started = 0, .pitch = -1.0f, .duration = 0};
                 for (int j = i; (j < AUDIO_TONE_STACKSIZE - 1); j++) {
-                    tones[j]     = tones[j + 1];
-                    tones[j + 1] = (musical_tone_t){.time_started = 0, .pitch = -1.0f, .duration = 0};
+                    tones[j] = tones[j + 1];
                 }
+                tones[AUDIO_TONE_STACKSIZE - 1] = (musical_tone_t){.time_started = 0, .pitch = -1.0f, .duration = 0};
                 break;
             }
         }