diff --git a/Core/Src/main.c b/Core/Src/main.c index 6a0728a..1702106 100644 --- a/Core/Src/main.c +++ b/Core/Src/main.c @@ -841,7 +841,7 @@ void MPU_Config(int enable_psram) HAL_MPU_ConfigRegion(&MPU_InitStruct); - /* Configure the MPU as cacheable non executable SRAM */ + /* Configure the MPU as cacheable non executable SRAM (write back, read/write allocate) */ MPU_InitStruct.Enable = MPU_REGION_ENABLE; MPU_InitStruct.BaseAddress = 0x20000000; MPU_InitStruct.Size = MPU_REGION_SIZE_512MB; diff --git a/damc/damc_simple_lib/AudioCApi.cpp b/damc/damc_simple_lib/AudioCApi.cpp index 15d102e..0b38c91 100644 --- a/damc/damc_simple_lib/AudioCApi.cpp +++ b/damc/damc_simple_lib/AudioCApi.cpp @@ -101,7 +101,7 @@ extern "C" void BSP_AUDIO_OUT_TransferComplete_CallBack(void) { BSP_AUDIO_OUT_HalfTransfer_CallBack(); } -__attribute__((used)) CircularBuffer usbBuffers[3]; +__attribute__((used)) CircularBuffer usbBuffers[3]; __attribute__((used)) int32_t diff_usb[3]; __attribute__((used)) int32_t expected_buff[3]; __attribute__((used)) int32_t usb_buff[3]; diff --git a/damc/damc_simple_lib/CircularBuffer.h b/damc/damc_simple_lib/CircularBuffer.h index 3656902..9301412 100644 --- a/damc/damc_simple_lib/CircularBuffer.h +++ b/damc/damc_simple_lib/CircularBuffer.h @@ -11,7 +11,7 @@ #include #include -template class CircularBuffer { +template class CircularBuffer { public: CircularBuffer(); @@ -38,12 +38,12 @@ template class CircularBuffer { size_t in_read_offset; }; -template CircularBuffer::CircularBuffer() { +template CircularBuffer::CircularBuffer() { memset(buffer.data(), 0, buffer.size() * sizeof(buffer[0])); } -template -void CircularBuffer::writeOutBuffer(uint32_t dma_read_offset, const T* data, size_t nframes) { +template +void CircularBuffer::writeOutBuffer(uint32_t dma_read_offset, const T* data, size_t nframes) { uint16_t start = out_write_offset; uint16_t size = nframes; @@ -70,12 +70,17 @@ void CircularBuffer::writeOutBuffer(uint32_t dma_read_offset, const T* dat } assert(end < buffer.size()); - SCB_CleanDCache_by_Addr((uint32_t*) buffer.data(), buffer.size() * sizeof(buffer[0])); + if(do_manage_cache) { + SCB_CleanDCache_by_Addr((uint32_t*) buffer.data(), buffer.size() * sizeof(buffer[0])); + } else { + __DSB(); + } + assert(out_write_offset == start); out_write_offset = end; } -template -size_t CircularBuffer::readInBuffer(uint32_t dma_write_offset, T* data, size_t nframes) { +template +size_t CircularBuffer::readInBuffer(uint32_t dma_write_offset, T* data, size_t nframes) { uint16_t start = in_read_offset; uint16_t end = dma_write_offset; @@ -86,13 +91,15 @@ size_t CircularBuffer::readInBuffer(uint32_t dma_write_offset, T* data, si if(size > nframes) { size = nframes; - end = (in_read_offset + size) % buffer.size(); + end = (start + size) % buffer.size(); } assert(end < buffer.size()); uint16_t total_size = 0; - SCB_InvalidateDCache_by_Addr((uint32_t*) buffer.data(), buffer.size() * sizeof(buffer[0])); + if(do_manage_cache) { + SCB_InvalidateDCache_by_Addr((uint32_t*) buffer.data(), buffer.size() * sizeof(buffer[0])); + } if(end < start) { // Copy between start and end of buffer @@ -118,6 +125,10 @@ size_t CircularBuffer::readInBuffer(uint32_t dma_write_offset, T* data, si data[i] = fill_sample; } + if(!do_manage_cache) { + __DSB(); + } + assert(in_read_offset == start); in_read_offset = end; return size; diff --git a/damc/damc_simple_lib/CodecAudio.h b/damc/damc_simple_lib/CodecAudio.h index a39330d..4173c66 100644 --- a/damc/damc_simple_lib/CodecAudio.h +++ b/damc/damc_simple_lib/CodecAudio.h @@ -30,7 +30,7 @@ class CodecAudio { struct CodecFrame { int16_t headphone[2]; }; - CircularBuffer out_buffer; - CircularBuffer in_buffer; + CircularBuffer out_buffer; + CircularBuffer in_buffer; CodecInit codecInit; };