Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
18 changes: 17 additions & 1 deletion radio/src/targets/common/arm/stm32/audio_dac_driver.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -170,12 +170,24 @@ static void dac_close_dma_xfer()
{
LL_DMA_DisableIT_TC(AUDIO_DMA, AUDIO_DMA_Stream);
LL_DMA_DisableIT_HT(AUDIO_DMA, AUDIO_DMA_Stream);
// TODO: reset flags
LL_DMA_DisableStream(AUDIO_DMA, AUDIO_DMA_Stream);

// clear pending flags so they don't carry over to the next transfer
stm32_dma_check_tc_flag(AUDIO_DMA, AUDIO_DMA_Stream);
stm32_dma_check_ht_flag(AUDIO_DMA, AUDIO_DMA_Stream);
}

static void dac_start_dma()
{
// re-arm from the start of the buffer: a mid-transfer stop leaves NDTR and the
// memory address partway, which desyncs the HT/TC half tracking
LL_DMA_DisableStream(AUDIO_DMA, AUDIO_DMA_Stream);
LL_DMA_SetMemoryAddress(AUDIO_DMA, AUDIO_DMA_Stream, (uintptr_t)_dma_buffer);
LL_DMA_SetDataLength(AUDIO_DMA, AUDIO_DMA_Stream, DMA_BUFFER_LEN);

stm32_dma_check_tc_flag(AUDIO_DMA, AUDIO_DMA_Stream);
stm32_dma_check_ht_flag(AUDIO_DMA, AUDIO_DMA_Stream);

// enable DMA stream and transfer complete interrupt
LL_DMA_EnableIT_HT(AUDIO_DMA, AUDIO_DMA_Stream);
LL_DMA_EnableIT_TC(AUDIO_DMA, AUDIO_DMA_Stream);
Expand All @@ -192,6 +204,10 @@ void audioConsumeCurrentBuffer()
{
if (!LL_DMA_IsEnabledStream(AUDIO_DMA, AUDIO_DMA_Stream)) {
if (!audio_update_dma_buffer(0)) {
// prime the second half as well so the first full DMA cycle plays valid
// data and the half tracking starts aligned (ignore the result: if no
// more data is available it is filled with silence)
audio_update_dma_buffer(1);
#if defined(AUDIO_MUTE_GPIO)
audioUnmute();
#endif
Expand Down
Loading