123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144 |
- #include "audio.h"
- #include "ch.h"
- #include "hal.h"
- #if !defined(AUDIO_PIN)
- # error "Audio feature enabled, but no pin selected - see docs/feature_audio under the ARM PWM settings"
- #endif
- extern bool playing_note;
- extern bool playing_melody;
- extern uint8_t note_timbre;
- static PWMConfig pwmCFG = {
- .frequency = 100000,
-
- .period = 2,
- .callback = NULL,
- .channels =
- {
- #if AUDIO_PWM_CHANNEL == 4
- {PWM_OUTPUT_DISABLED, NULL},
- {PWM_OUTPUT_DISABLED, NULL},
- {PWM_OUTPUT_DISABLED, NULL},
- {PWM_OUTPUT_ACTIVE_HIGH, NULL}
- #elif AUDIO_PWM_CHANNEL == 3
- {PWM_OUTPUT_DISABLED, NULL},
- {PWM_OUTPUT_DISABLED, NULL},
- {PWM_OUTPUT_ACTIVE_HIGH, NULL},
- {PWM_OUTPUT_DISABLED, NULL}
- #elif AUDIO_PWM_CHANNEL == 2
- {PWM_OUTPUT_DISABLED, NULL},
- {PWM_OUTPUT_ACTIVE_HIGH, NULL},
- {PWM_OUTPUT_DISABLED, NULL},
- {PWM_OUTPUT_DISABLED, NULL}
- #else
- {PWM_OUTPUT_ACTIVE_HIGH, NULL},
- {PWM_OUTPUT_DISABLED, NULL},
- {PWM_OUTPUT_DISABLED, NULL},
- {PWM_OUTPUT_DISABLED, NULL}
- #endif
- },
- };
- static float channel_1_frequency = 0.0f;
- void channel_1_set_frequency(float freq) {
- channel_1_frequency = freq;
- if (freq <= 0.0)
- return;
- pwmcnt_t period = (pwmCFG.frequency / freq);
- pwmChangePeriod(&AUDIO_PWM_DRIVER, period);
- pwmEnableChannel(&AUDIO_PWM_DRIVER, AUDIO_PWM_CHANNEL - 1,
-
- PWM_PERCENTAGE_TO_WIDTH(&AUDIO_PWM_DRIVER, (100 - note_timbre) * 100));
- }
- float channel_1_get_frequency(void) { return channel_1_frequency; }
- void channel_1_start(void) {
- pwmStop(&AUDIO_PWM_DRIVER);
- pwmStart(&AUDIO_PWM_DRIVER, &pwmCFG);
- }
- void channel_1_stop(void) { pwmStop(&AUDIO_PWM_DRIVER); }
- static void gpt_callback(GPTDriver *gptp);
- GPTConfig gptCFG = {
-
- .frequency = 60 * 64,
- .callback = gpt_callback,
- };
- void audio_driver_initialize(void) {
- pwmStart(&AUDIO_PWM_DRIVER, &pwmCFG);
-
- #if defined(USE_GPIOV1)
- palSetLineMode(AUDIO_PIN, PAL_MODE_STM32_ALTERNATE_PUSHPULL);
- #else
- palSetLineMode(AUDIO_PIN, PAL_STM32_MODE_ALTERNATE | PAL_STM32_ALTERNATE(AUDIO_PWM_PAL_MODE));
- #endif
- gptStart(&AUDIO_STATE_TIMER, &gptCFG);
- }
- void audio_driver_start(void) {
- channel_1_stop();
- channel_1_start();
- if (playing_note || playing_melody) {
- gptStartContinuous(&AUDIO_STATE_TIMER, 64);
- }
- }
- void audio_driver_stop(void) {
- channel_1_stop();
- gptStopTimer(&AUDIO_STATE_TIMER);
- }
- static void gpt_callback(GPTDriver *gptp) {
- float freq;
- if (audio_update_state()) {
- freq = audio_get_processed_frequency(0);
- channel_1_set_frequency(freq);
- }
- }
|