From 98a508629a8d0d444060d7df01818b3470cd84b5 Mon Sep 17 00:00:00 2001 From: Marshal Horn Date: Thu, 16 Jul 2020 21:27:07 -0700 Subject: [PATCH] Moved speaker code to its own driver It appears it will take some work to feed PWM with DMA. --- code/cfg/mcuconf.h | 1 + code/drivers/speaker.c | 53 ++++++++++++++++++++++++++++++++++++++++++ code/drivers/speaker.h | 6 +++++ code/radio/rx.c | 26 +-------------------- code/radio/rx.h | 18 +++++++++----- 5 files changed, 73 insertions(+), 31 deletions(-) create mode 100644 code/drivers/speaker.c create mode 100644 code/drivers/speaker.h diff --git a/code/cfg/mcuconf.h b/code/cfg/mcuconf.h index 6ee4c69..7120675 100644 --- a/code/cfg/mcuconf.h +++ b/code/cfg/mcuconf.h @@ -166,6 +166,7 @@ #define STM32_PWM_TIM1_IRQ_PRIORITY 3 #define STM32_PWM_TIM2_IRQ_PRIORITY 3 #define STM32_PWM_TIM3_IRQ_PRIORITY 3 +#define STM32_PWM_TIM3_DMA_STREAM STM32_DMA_STREAM_ID(1, 4) /* * SERIAL driver system settings. diff --git a/code/drivers/speaker.c b/code/drivers/speaker.c new file mode 100644 index 0000000..01fe3fd --- /dev/null +++ b/code/drivers/speaker.c @@ -0,0 +1,53 @@ +#include "speaker.h" + + +static const DMAConfig spkr_dma = { + .stream = STM32_ICU1_CH1_DMA_STREAM, + .channel = STM32_ICU1_CH1_DMA_CHANNEL, + .dma_priority = STM32_ICU1_CH1_DMA_PRIORITY, + .irq_priority = STM32_ICU1_CH1_DMA_IRQ_PRIORITY, + .periph_addr = &TIM3->DMAR, + .direction = DMA_DIR_P2M, + .psize = 2, + .msize = 2, + .inc_peripheral_addr = false, + .inc_memory_addr = true, + .circular = true, + .error_cb = &error_cb, + .end_cb = &end_cb, + .mburst = 8, + .fifo = 4 +}; + +//DMA channels is STM32_PWM_TIM3_DMA_STREAM + +void speakerUpdate(int16_t data, int len); + +/** Copies audio data to PWM + * + */ +void speaker_callback(PWMDriver * pwmp){ +//FIXME: Copy data into DMA buffer. Or interrupt every period. +} + +static PWMConfig spkr = { + .frequency = 4096000, /* 4MHz PWM clock frequency. */ + .period = 4096, /* Initial PWM period 1ms. */ + .callback = speaker_callback, + .channels = { + {PWM_OUTPUT_ACTIVE_HIGH, NULL}, + {PWM_OUTPUT_DISABLED, NULL}, + {PWM_OUTPUT_DISABLED, NULL}, + {PWM_OUTPUT_DISABLED, NULL} + }, + .cr2 = 0, + .dier = STM32_TIM_DIER_CC1DE, // DMA request on channel 1 compare match +}; + +void speakerStart(void){ + pwmStart(&PWMD3, &spkr); +} + +void speakerStop(void){ + pwmStop(&PWMD3); +} diff --git a/code/drivers/speaker.h b/code/drivers/speaker.h new file mode 100644 index 0000000..1049e0f --- /dev/null +++ b/code/drivers/speaker.h @@ -0,0 +1,6 @@ +#include "hal.h" + + +void speakerStart(void); +void speakerStop(void); +void speakerUpdate(int16_t data, int len); diff --git a/code/radio/rx.c b/code/radio/rx.c index 20ac1c4..b112dfd 100644 --- a/code/radio/rx.c +++ b/code/radio/rx.c @@ -7,6 +7,7 @@ #include "rx.h" #include "ssb.h" +#include "../drivers/speaker.h" /** Mailbox for received data */ mailbox_t new_sample; @@ -116,28 +117,3 @@ void adc_rx_init(void){ adcStartConversion(&ADCD1, &qsd_in, samples, len); } - -/** Copies audio data to PWM - * - */ -void speaker_callback(PWMDriver * pwmp){ -//FIXME: Copy data into DMA buffer. Or interrupt every period. -} - -static PWMConfig spkr = { - 4096000, /* 4MHz PWM clock frequency. */ - 4096, /* Initial PWM period 1ms. */ - speaker_callback, - { - {PWM_OUTPUT_ACTIVE_HIGH, NULL}, - {PWM_OUTPUT_DISABLED, NULL}, - {PWM_OUTPUT_DISABLED, NULL}, - {PWM_OUTPUT_DISABLED, NULL} - }, - 0, - 0 -}; - -void speaker_init(void){ - -} diff --git a/code/radio/rx.h b/code/radio/rx.h index ea2c9ba..2c6431b 100644 --- a/code/radio/rx.h +++ b/code/radio/rx.h @@ -11,12 +11,22 @@ #include "hal.h" #include "ch.h" +/** List of radio modes. + * + * This list will be expanded as more modes are supported + */ +enum radio_mode { + CW, //< Continuous wave, also known as morse code + USB,//< Upper Sideband, for frequencies above 10MHz + LSB,//< Lower sideband, for frequencies below 10MHz +}; + /** Starts radio reception and demodulation * */ -void rxStart(uint8_t mode); +void rxStart(enum radio_mode mode, float frequency); -/* Pauses radio reception and demodulation +/* Stops radio reception and demodulation * */ void rxStop(void); @@ -58,8 +68,4 @@ static void adccallback(ADCDriver *adcp); */ void adc_rx_init(void); -void speaker_init(void); - -void speaker_update(int16_t data, int len); - #endif /* RX_H_ */