altos/stmf0: Pull beeper pin low when beeper is off
authorKeith Packard <keithp@keithp.com>
Sat, 22 Apr 2017 06:02:57 +0000 (23:02 -0700)
committerKeith Packard <keithp@keithp.com>
Sat, 22 Apr 2017 06:02:57 +0000 (23:02 -0700)
This avoids having the pin float and pick up noise from any adjacent
signals, like TeleMini's radio.

Signed-off-by: Keith Packard <keithp@keithp.com>
src/stmf0/ao_beep_stm.c

index 84ccd93e9cca27578be67ad13ba4d0b4ef57e345..610f4a31ff72968b407f3c5cc0af1e3bf063f5de 100644 (file)
@@ -55,6 +55,9 @@ disable(void)
        timer.bdtr = 0;
 #endif
        stm_rcc_enr &= ~(1 << STM_RCC_TIMER);
+
+       /* Disconnect the timer from the pin */
+       stm_afr_set(BEEPER_PORT, BEEPER_PIN, STM_AFR_NONE);
 }
 
 void
@@ -361,6 +364,9 @@ ao_beep(uint8_t beep)
 
                /* Update the values */
                timer.egr = (1 << STM_TIM23_EGR_UG);
+
+               /* Hook the timer up to the beeper pin */
+               stm_afr_set(BEEPER_PORT, BEEPER_PIN, STM_AFR_AF2);
 #endif
        }
 }
@@ -376,8 +382,7 @@ ao_beep_for(uint8_t beep, uint16_t ticks) __reentrant
 void
 ao_beep_init(void)
 {
-       ao_enable_port(BEEPER_PORT);
-       stm_afr_set(BEEPER_PORT, BEEPER_PIN, STM_AFR_AF2);
+       ao_enable_output(BEEPER_PORT, BEEPER_PIN, BEEPER, 0);
 
        /* Leave the timer off until requested */
        stm_rcc_enr &= ~(1 << STM_RCC_TIMER);