chore(radio): DAC driver cleanup (#6168)

This commit is contained in:
Raphael Coeffic
2025-05-06 13:31:14 +10:00
committed by GitHub
parent 75fb538663
commit 719324e46d
7 changed files with 253 additions and 262 deletions
@@ -29,87 +29,8 @@
#include "edgetx.h"
const AudioBuffer * nextBuffer = nullptr;
#if defined(STM32H5) || defined(STM32H7) || defined(STM32H7RS)
// 16 bit, 1 channels
#define DMA_BUFFER_HALF_LEN AUDIO_BUFFER_SIZE
// 2 buffers
#define DMA_BUFFER_LEN (DMA_BUFFER_HALF_LEN * 2)
static uint16_t _dma_buffer[DMA_BUFFER_LEN] __DMA_NO_CACHE;
static volatile uint32_t _dma_buffer_offset = 0;
static inline uint32_t _calc_offset(uint8_t tc)
{
return tc * DMA_BUFFER_HALF_LEN;
}
// the returned bool is true when there is no more data available
static bool audio_update_dma_buffer(uint8_t tc)
{
_dma_buffer_offset = _calc_offset(tc);
auto buffer = audioQueue.buffersFifo.getNextFilledBuffer();
nextBuffer = buffer;
if (!buffer) {
unsigned idx = 0;
for (; idx < DMA_BUFFER_HALF_LEN; idx++) {
uint32_t offset = _dma_buffer_offset + idx;
_dma_buffer[offset] = AUDIO_DATA_SILENCE;
}
return true;
} else {
unsigned idx = 0;
for (; idx < buffer->size; idx++) {
uint32_t offset = _dma_buffer_offset + idx;
_dma_buffer[offset] = (uint16_t)buffer->data[idx];
}
for (; idx < DMA_BUFFER_HALF_LEN; idx++) {
uint32_t offset = _dma_buffer_offset + idx;
_dma_buffer[offset] = AUDIO_DATA_SILENCE;
}
audioQueue.buffersFifo.freeNextFilledBuffer();
return false;
}
}
#else
#define AUDIO_DAC DAC
#endif
// Init timer that triggers the DAC conversion
// at sampling frequency
static void dac_trigger_init()
{
stm32_timer_enable_clock(AUDIO_TIMER);
// set timer to: 10 uS, 100 kHz
AUDIO_TIMER->PSC = 0;
AUDIO_TIMER->ARR = (PERI1_FREQUENCY * TIMER_MULT_APB1) / 100000 - 1;
// reset counter
AUDIO_TIMER->CNT = 0;
// set expiry to sample period (1 / sample_rate)
AUDIO_TIMER->ARR =
(PERI1_FREQUENCY * TIMER_MULT_APB1) / AUDIO_SAMPLE_RATE - 1;
// Master mode selection
//
// 000: Reset
AUDIO_TIMER->CR2 = 0;
// 010: The update event is selected as trigger output (TRGO)
// (used to trigger DAC conversion)
AUDIO_TIMER->CR2 = TIM_CR2_MMS_1;
// enable timer
AUDIO_TIMER->CR1 |= TIM_CR1_CEN;
}
#if defined(AUDIO_MUTE_GPIO)
static inline void set_mute_pin(bool enabled)
{
#if defined(INVERTED_MUTE_PIN)
@@ -126,91 +47,7 @@ static inline bool get_mute_pin(void)
#endif
return enabled;
}
#endif
// Configure DAC0
// Not sure why PB14 has not be allocated to the DAC, although it is an EXTRA function
// So maybe it is automatically done
void dacInit()
{
#if defined(AUDIO_MUTE_GPIO)
// Mute before init anything
gpio_init(AUDIO_MUTE_GPIO, GPIO_OUT, GPIO_PIN_SPEED_LOW);
set_mute_pin(true);
#endif
dac_trigger_init();
gpio_init_analog(AUDIO_OUTPUT_GPIO);
stm32_dma_enable_clock(AUDIO_DMA);
#if defined(STM32H5) || defined(STM32H7) || defined(STM32H7RS)
LL_DMA_DeInit(AUDIO_DMA, AUDIO_DMA_Stream);
LL_DMA_InitTypeDef dmaInit;
LL_DMA_StructInit(&dmaInit);
#if defined(STM32H7)
dmaInit.Mode = LL_DMA_MODE_CIRCULAR;
dmaInit.PeriphRequest = AUDIO_DMA_Channel;
dmaInit.Direction = LL_DMA_DIRECTION_MEMORY_TO_PERIPH;
dmaInit.Priority = LL_DMA_PRIORITY_VERYHIGH;
dmaInit.PeriphOrM2MSrcAddress = LL_DAC_DMA_GetRegAddr(DAC1, LL_DAC_CHANNEL_1, LL_DAC_DMA_REG_DATA_12BITS_LEFT_ALIGNED);
dmaInit.PeriphOrM2MSrcDataSize = LL_DMA_PDATAALIGN_HALFWORD;
dmaInit.MemoryOrM2MDstIncMode = LL_DMA_MEMORY_INCREMENT;
dmaInit.MemoryOrM2MDstDataSize = LL_DMA_MDATAALIGN_HALFWORD;
#elif defined(STM32H7RS)
#error not implemented
#endif
LL_DMA_Init(AUDIO_DMA, AUDIO_DMA_Stream, &dmaInit);
#else
// Disable DMA stream
AUDIO_DMA_Stream->CR &= ~DMA_SxCR_EN;
// clear DMA stream flags
AUDIO_DMA->HIFCR = DMA_HIFCR_CTCIF5 | DMA_HIFCR_CHTIF5 | DMA_HIFCR_CTEIF5 |
DMA_HIFCR_CDMEIF5 | DMA_HIFCR_CFEIF5;
// Chan 7, 16-bit wide, Medium priority, memory increments
AUDIO_DMA_Stream->CR = DMA_SxCR_CHSEL_0 | DMA_SxCR_CHSEL_1 |
DMA_SxCR_CHSEL_2 | DMA_SxCR_PL_0 | DMA_SxCR_MSIZE_0 |
DMA_SxCR_PSIZE_0 | DMA_SxCR_MINC | DMA_SxCR_DIR_0 |
DMA_SxCR_CIRC;
// write to DAC channel 1 (12 bits, left-aligned)
AUDIO_DMA_Stream->PAR = CONVERT_PTR_UINT(&AUDIO_DAC->DHR12L1);
// disable direct mode and set FIFO threshold to half
AUDIO_DMA_Stream->FCR = DMA_SxFCR_DMDIS | DMA_SxFCR_FTH_0;
#endif
#if defined(LL_APB1_GRP1_PERIPH_DAC12)
LL_APB1_GRP1_EnableClock(LL_APB1_GRP1_PERIPH_DAC12);
#else
LL_APB1_GRP1_EnableClock(LL_APB1_GRP1_PERIPH_DAC1);
#endif
// set data registre to silence
AUDIO_DAC->DHR12L1 = AUDIO_DATA_SILENCE;
#if defined(STM32H5) || defined(STM32H7) || defined(STM32H7RS)
LL_DAC_ClearFlag_DMAUDR1(AUDIO_DAC);
LL_DAC_SetTriggerSource(AUDIO_DAC, LL_DAC_CHANNEL_1, LL_DAC_TRIG_EXT_TIM6_TRGO);
LL_DAC_EnableTrigger(AUDIO_DAC, LL_DAC_CHANNEL_1);
LL_DAC_Enable(AUDIO_DAC, LL_DAC_CHANNEL_1);
#else
// clear underrun flag
AUDIO_DAC->SR = DAC_SR_DMAUDR1;
// use TIM6 TRGO as trigger (TSEL1 = TSEL2 = 000)
// enable DAC & channel 1 trigger
AUDIO_DAC->CR = DAC_CR_TEN1 | DAC_CR_EN1;
#endif
NVIC_EnableIRQ(AUDIO_DMA_Stream_IRQn);
NVIC_SetPriority(AUDIO_DMA_Stream_IRQn, 7);
}
#if defined(AUDIO_MUTE_GPIO)
void audioMute()
{
if (!g_eeGeneral.audioMuteEnable) return;
@@ -252,55 +89,113 @@ void audioUnmute()
}
#endif
#if defined(STM32H5) || defined(STM32H7) || defined(STM32H7RS)
#define DAC_TRIGGER LL_DAC_TRIG_EXT_TIM6_TRGO
// 16 bit, 1 channels
#define DMA_BUFFER_HALF_LEN AUDIO_BUFFER_SIZE
// 2 buffers
#define DMA_BUFFER_LEN (DMA_BUFFER_HALF_LEN * 2)
static uint16_t _dma_buffer[DMA_BUFFER_LEN] __DMA_NO_CACHE;
static volatile uint32_t _dma_buffer_offset = 0;
static inline uint32_t _calc_offset(uint8_t tc)
{
return tc * DMA_BUFFER_HALF_LEN;
}
// return true if no more data available
static bool audio_update_dma_buffer(uint8_t tc)
{
_dma_buffer_offset = _calc_offset(tc);
auto buffer = audioQueue.buffersFifo.getNextFilledBuffer();
if (!buffer) {
unsigned idx = 0;
for (; idx < DMA_BUFFER_HALF_LEN; idx++) {
uint32_t offset = _dma_buffer_offset + idx;
_dma_buffer[offset] = AUDIO_DATA_SILENCE;
}
return true;
} else {
unsigned idx = 0;
for (; idx < buffer->size; idx++) {
uint32_t offset = _dma_buffer_offset + idx;
_dma_buffer[offset] = (uint16_t)buffer->data[idx];
}
for (; idx < DMA_BUFFER_HALF_LEN; idx++) {
uint32_t offset = _dma_buffer_offset + idx;
_dma_buffer[offset] = AUDIO_DATA_SILENCE;
}
audioQueue.buffersFifo.freeNextFilledBuffer();
return false;
}
}
static void dac_dma_init()
{
stm32_dma_enable_clock(AUDIO_DMA);
LL_DMA_DeInit(AUDIO_DMA, AUDIO_DMA_Stream);
LL_DMA_InitTypeDef dmaInit;
LL_DMA_StructInit(&dmaInit);
#if defined(STM32H7)
dmaInit.Mode = LL_DMA_MODE_CIRCULAR;
dmaInit.PeriphRequest = AUDIO_DMA_Channel;
dmaInit.Direction = LL_DMA_DIRECTION_MEMORY_TO_PERIPH;
dmaInit.Priority = LL_DMA_PRIORITY_VERYHIGH;
dmaInit.MemoryOrM2MDstIncMode = LL_DMA_MEMORY_INCREMENT;
dmaInit.MemoryOrM2MDstDataSize = LL_DMA_MDATAALIGN_HALFWORD;
dmaInit.PeriphOrM2MSrcDataSize = LL_DMA_PDATAALIGN_HALFWORD;
dmaInit.PeriphOrM2MSrcAddress = LL_DAC_DMA_GetRegAddr(
DAC1, LL_DAC_CHANNEL_1, LL_DAC_DMA_REG_DATA_12BITS_LEFT_ALIGNED);
dmaInit.MemoryOrM2MDstAddress = (uintptr_t)_dma_buffer;
dmaInit.NbData = DMA_BUFFER_LEN;
#elif defined(STM32H7RS)
#error not implemented
#endif
LL_DMA_Init(AUDIO_DMA, AUDIO_DMA_Stream, &dmaInit);
NVIC_EnableIRQ(AUDIO_DMA_Stream_IRQn);
NVIC_SetPriority(AUDIO_DMA_Stream_IRQn, 7);
}
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);
}
static void dac_start_dma()
{
// 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);
LL_DMA_EnableStream(AUDIO_DMA, AUDIO_DMA_Stream);
// clear underrun flag
LL_DAC_ClearFlag_DMAUDR1(AUDIO_DAC);
// enable DAC
AUDIO_DAC->CR |= DAC_CR_EN1 | DAC_CR_DMAEN1;
}
void audioConsumeCurrentBuffer()
{
#if defined(STM32H5) || defined(STM32H7) || defined(STM32H7RS)
if (!LL_DMA_IsEnabledStream(AUDIO_DMA, AUDIO_DMA_Stream)) {
if (!audio_update_dma_buffer(0)) {
#if defined(AUDIO_MUTE_GPIO)
audioUnmute();
#endif
LL_DMA_DisableStream(AUDIO_DMA, AUDIO_DMA_Stream);
stm32_dma_check_tc_flag(AUDIO_DMA, AUDIO_DMA_Stream);
stm32_dma_check_ht_flag(AUDIO_DMA, AUDIO_DMA_Stream);
LL_DAC_ClearFlag_DMAUDR1(AUDIO_DAC);
LL_DAC_EnableDMAReq(AUDIO_DAC, LL_DAC_CHANNEL_1);
LL_DAC_Enable(AUDIO_DAC, LL_DAC_CHANNEL_1);
LL_DMA_SetMemoryAddress(AUDIO_DMA, AUDIO_DMA_Stream, (intptr_t)_dma_buffer);
LL_DMA_SetDataLength(AUDIO_DMA, AUDIO_DMA_Stream, DMA_BUFFER_LEN);
LL_DMA_EnableStream(AUDIO_DMA, AUDIO_DMA_Stream);
LL_DMA_EnableIT_HT(AUDIO_DMA, AUDIO_DMA_Stream);
LL_DMA_EnableIT_TC(AUDIO_DMA, AUDIO_DMA_Stream);
#else
if (!nextBuffer) {
nextBuffer = audioQueue.buffersFifo.getNextFilledBuffer();
if (nextBuffer) {
#if defined(AUDIO_MUTE_GPIO)
audioUnmute();
#endif
// Disable DMA stream
AUDIO_DMA_Stream->CR &= ~DMA_SxCR_EN;
// reset DMA flags
AUDIO_DMA->HIFCR = DMA_HIFCR_CTCIF5 | DMA_HIFCR_CHTIF5 |
DMA_HIFCR_CTEIF5 | DMA_HIFCR_CDMEIF5 |
DMA_HIFCR_CFEIF5;
// set DMA buffer
AUDIO_DMA_Stream->M0AR = CONVERT_PTR_UINT(nextBuffer->data);
AUDIO_DMA_Stream->NDTR = nextBuffer->size;
// enable DMA stream and transfer complete interrupt
AUDIO_DMA_Stream->CR |= DMA_SxCR_EN | DMA_SxCR_TCIE;
// clear underrun flag
AUDIO_DAC->SR = DAC_SR_DMAUDR1;
// enable DAC
AUDIO_DAC->CR |= DAC_CR_EN1 | DAC_CR_DMAEN1;
#endif
dac_start_dma();
} else {
#if defined(AUDIO_MUTE_GPIO)
audioMute();
@@ -309,25 +204,8 @@ void audioConsumeCurrentBuffer()
}
}
// Sound routines
void audioInit()
{
dacInit();
}
void audioEnd()
{
AUDIO_DAC->CR = 0;
AUDIO_TIMER->CR1 = 0;
// Also need to turn off any possible interrupts
NVIC_DisableIRQ(AUDIO_TIM_IRQn);
NVIC_DisableIRQ(AUDIO_DMA_Stream_IRQn);
}
extern "C" void AUDIO_DMA_Stream_IRQHandler()
{
#if defined(STM32H5) || defined(STM32H7) || defined(STM32H7RS)
bool stopDMA = false;
if(stm32_dma_check_ht_flag(AUDIO_DMA, AUDIO_DMA_Stream)) {
stopDMA = audio_update_dma_buffer(0);
@@ -338,12 +216,45 @@ extern "C" void AUDIO_DMA_Stream_IRQHandler()
}
if(stopDMA) {
LL_DMA_DisableIT_TC(AUDIO_DMA, AUDIO_DMA_Stream);
LL_DMA_DisableIT_HT(AUDIO_DMA, AUDIO_DMA_Stream);
LL_DMA_DisableStream(AUDIO_DMA, AUDIO_DMA_Stream);
dac_close_dma_xfer();
}
}
#else
#else // STM32H5 || STM32H7 || STM32H7RS
#define AUDIO_DAC DAC
#define DAC_TRIGGER 0 // TIM6
const AudioBuffer * nextBuffer = nullptr;
static void dac_dma_init()
{
stm32_dma_enable_clock(AUDIO_DMA);
// Disable DMA stream
AUDIO_DMA_Stream->CR &= ~DMA_SxCR_EN;
// clear DMA stream flags
AUDIO_DMA->HIFCR = DMA_HIFCR_CTCIF5 | DMA_HIFCR_CHTIF5 | DMA_HIFCR_CTEIF5 |
DMA_HIFCR_CDMEIF5 | DMA_HIFCR_CFEIF5;
// Chan 7, 16-bit wide, Medium priority, memory increments
AUDIO_DMA_Stream->CR = DMA_SxCR_CHSEL_0 | DMA_SxCR_CHSEL_1 |
DMA_SxCR_CHSEL_2 | DMA_SxCR_PL_0 | DMA_SxCR_MSIZE_0 |
DMA_SxCR_PSIZE_0 | DMA_SxCR_MINC | DMA_SxCR_DIR_0;
// write to DAC channel 1 (12 bits, left-aligned)
AUDIO_DMA_Stream->PAR = CONVERT_PTR_UINT(&AUDIO_DAC->DHR12L1);
// disable direct mode and set FIFO threshold to half
AUDIO_DMA_Stream->FCR = DMA_SxFCR_DMDIS | DMA_SxFCR_FTH_0;
NVIC_EnableIRQ(AUDIO_DMA_Stream_IRQn);
NVIC_SetPriority(AUDIO_DMA_Stream_IRQn, 7);
}
static void dac_close_dma_xfer()
{
// disable transfer complete interrupt
AUDIO_DMA_Stream->CR &= ~DMA_SxCR_TCIE;
@@ -352,25 +263,127 @@ extern "C" void AUDIO_DMA_Stream_IRQHandler()
DMA_HIFCR_CDMEIF5 | DMA_HIFCR_CFEIF5;
// Disable DMA stream
AUDIO_DMA_Stream->CR &= ~DMA_SxCR_EN;
AUDIO_DMA_Stream->CR &= ~DMA_SxCR_EN;
}
static void dac_start_dma_request(const audio_data_t* data, uint16_t length)
{
// set DMA buffer
AUDIO_DMA_Stream->M0AR = CONVERT_PTR_UINT(data);
AUDIO_DMA_Stream->NDTR = length;
// enable DMA stream and transfer complete interrupt
AUDIO_DMA_Stream->CR |= DMA_SxCR_EN | DMA_SxCR_TCIE;
// clear underrun flag
AUDIO_DAC->SR = DAC_SR_DMAUDR1;
// enable DAC
AUDIO_DAC->CR |= DAC_CR_EN1 | DAC_CR_DMAEN1;
}
void audioConsumeCurrentBuffer()
{
if (!nextBuffer) {
nextBuffer = audioQueue.buffersFifo.getNextFilledBuffer();
if (nextBuffer) {
#if defined(AUDIO_MUTE_GPIO)
audioUnmute();
#endif
dac_close_dma_xfer();
dac_start_dma_request(nextBuffer->data, nextBuffer->size);
} else {
#if defined(AUDIO_MUTE_GPIO)
audioMute();
#endif
}
}
}
extern "C" void AUDIO_DMA_Stream_IRQHandler()
{
dac_close_dma_xfer();
// get next buffer if any
if (nextBuffer) audioQueue.buffersFifo.freeNextFilledBuffer();
nextBuffer = audioQueue.buffersFifo.getNextFilledBuffer();
if (nextBuffer) {
AUDIO_DMA_Stream->M0AR = CONVERT_PTR_UINT(nextBuffer->data);
AUDIO_DMA_Stream->NDTR = nextBuffer->size;
// reset DMA flags (again?)
AUDIO_DMA->HIFCR = DMA_HIFCR_CTCIF5 | DMA_HIFCR_CHTIF5 | DMA_HIFCR_CTEIF5 |
DMA_HIFCR_CDMEIF5 | DMA_HIFCR_CFEIF5;
// enable DMA stream and transfer complete interrupt
AUDIO_DMA_Stream->CR |= DMA_SxCR_EN | DMA_SxCR_TCIE;
// clear underrun flag
AUDIO_DAC->SR = DAC_SR_DMAUDR1;
dac_start_dma_request(nextBuffer->data, nextBuffer->size);
}
}
#endif
// Init timer that triggers the DAC conversion
// at sampling frequency
static void dac_trigger_init()
{
stm32_timer_enable_clock(AUDIO_TIMER);
// set timer to: 10 uS, 100 kHz
AUDIO_TIMER->PSC = 0;
AUDIO_TIMER->ARR = (PERI1_FREQUENCY * TIMER_MULT_APB1) / 100000 - 1;
// reset counter
AUDIO_TIMER->CNT = 0;
// set expiry to sample period (1 / sample_rate)
AUDIO_TIMER->ARR =
(PERI1_FREQUENCY * TIMER_MULT_APB1) / AUDIO_SAMPLE_RATE - 1;
// Master mode selection
//
// 000: Reset
AUDIO_TIMER->CR2 = 0;
// 010: The update event is selected as trigger output (TRGO)
// (used to trigger DAC conversion)
AUDIO_TIMER->CR2 = TIM_CR2_MMS_1;
// enable timer
AUDIO_TIMER->CR1 |= TIM_CR1_CEN;
}
static void dac_periph_init()
{
#if defined(LL_APB1_GRP1_PERIPH_DAC12)
LL_APB1_GRP1_EnableClock(LL_APB1_GRP1_PERIPH_DAC12);
#else
LL_APB1_GRP1_EnableClock(LL_APB1_GRP1_PERIPH_DAC1);
#endif
gpio_init_analog(AUDIO_OUTPUT_GPIO);
// set data registre to silence
AUDIO_DAC->DHR12L1 = AUDIO_DATA_SILENCE;
// clear underrun flag
AUDIO_DAC->SR = DAC_SR_DMAUDR1;
// use TIM6 TRGO as trigger
// enable DAC & channel 1 trigger
AUDIO_DAC->CR = DAC_CR_TEN1 | DAC_CR_EN1 | DAC_TRIGGER;
}
// Configure DAC0
// Not sure why PB14 has not be allocated to the DAC, although it is an EXTRA function
// So maybe it is automatically done
void dacInit()
{
#if defined(AUDIO_MUTE_GPIO)
// Mute before init anything
gpio_init(AUDIO_MUTE_GPIO, GPIO_OUT, GPIO_PIN_SPEED_LOW);
set_mute_pin(true);
#endif
dac_trigger_init();
dac_dma_init();
dac_periph_init();
}
// Sound routines
void audioInit()
{
dacInit();
}
-2
View File
@@ -911,8 +911,6 @@
#define AUDIO_OUTPUT_GPIO GPIO_PIN(GPIOA, 4) // PA.04
#define AUDIO_DMA_Stream DMA1_Stream5
#define AUDIO_DMA_Stream_IRQn DMA1_Stream5_IRQn
#define AUDIO_TIM_IRQn TIM6_DAC_IRQn
#define AUDIO_TIM_IRQHandler TIM6_DAC_IRQHandler
#define AUDIO_DMA_Stream_IRQHandler DMA1_Stream5_IRQHandler
#define AUDIO_TIMER TIM6
#define AUDIO_DMA DMA1
-4
View File
@@ -677,13 +677,9 @@
#define AUDIO_SPI_MISO_GPIO GPIO_PIN(GPIOB, 4) // PB.04
#define AUDIO_SPI_MOSI_GPIO GPIO_PIN(GPIOB, 5) // PB.05
#else
#define AUDIO_RCC_APB1Periph (RCC_APB1Periph_TIM6 | RCC_APB1Periph_DAC)
#define AUDIO_RCC_AHB1Periph (RCC_AHB1Periph_GPIOA | RCC_AHB1Periph_DMA1)
#define AUDIO_OUTPUT_GPIO GPIO_PIN(GPIOA, 4) // PA.04
#define AUDIO_DMA_Stream DMA1_Stream5
#define AUDIO_DMA_Stream_IRQn DMA1_Stream5_IRQn
#define AUDIO_TIM_IRQn TIM6_DAC_IRQn
#define AUDIO_TIM_IRQHandler TIM6_DAC_IRQHandler
#define AUDIO_DMA_Stream_IRQHandler DMA1_Stream5_IRQHandler
#define AUDIO_TIMER TIM6
#define AUDIO_DMA DMA1
-11
View File
@@ -216,17 +216,6 @@
#define SD_SDIO_TRANSFER_CLK_DIV SDMMC_NSPEED_CLK_DIV
// Audio
// #define AUDIO_RCC_APB1Periph (RCC_APB1Periph_TIM6 | RCC_APB1Periph_DAC)
// #define AUDIO_RCC_AHB1Periph (RCC_AHB1Periph_GPIOA | RCC_AHB1Periph_DMA1)
// #define AUDIO_OUTPUT_GPIO GPIO_PIN(GPIOA, 4) // PA.04
// #define AUDIO_DMA_Stream DMA1_Stream5
// #define AUDIO_DMA_Stream_IRQn DMA1_Stream5_IRQn
// #define AUDIO_TIM_IRQn TIM6_DAC_IRQn
// #define AUDIO_TIM_IRQHandler TIM6_DAC_IRQHandler
// #define AUDIO_DMA_Stream_IRQHandler DMA1_Stream5_IRQHandler
// #define AUDIO_TIMER TIM6
// #define AUDIO_DMA DMA1
#define AUDIO_SPI SPI6
// I2C Bus
-1
View File
@@ -108,7 +108,6 @@ uint16_t getSixPosAnalogValue(uint16_t adcValue)
void boardInit()
{
LL_APB1_GRP1_EnableClock(AUDIO_RCC_APB1Periph);
LL_APB2_GRP1_EnableClock(LL_APB2_GRP1_PERIPH_SYSCFG);
#if defined(USB_CHARGE_LED) && !defined(DEBUG)
-1
View File
@@ -224,7 +224,6 @@ void debugPutc(const char c);
// Audio driver
void audioInit();
void audioEnd();
#if defined(PCBXLITES)
#define SHARED_DSC_HEADPHONE_JACK
-3
View File
@@ -2719,11 +2719,8 @@
#define SD_SPI_DMA_CHANNEL LL_DMA_CHANNEL_0
// Audio
#define AUDIO_RCC_APB1Periph LL_APB1_GRP1_PERIPH_DAC1
#define AUDIO_OUTPUT_GPIO GPIO_PIN(GPIOA, 4)
#define AUDIO_DMA DMA1
#define AUDIO_TIM_IRQn TIM6_DAC_IRQn
#define AUDIO_TIM_IRQHandler TIM6_DAC_IRQHandler
#define AUDIO_DMA_Stream DMA1_Stream5
#define AUDIO_DMA_Stream_IRQn DMA1_Stream5_IRQn
#define AUDIO_DMA_Stream_IRQHandler DMA1_Stream5_IRQHandler