EdigE
← ЛЕНТА
MCU · 10.08.2026

STM32F407 разнёс RX и TX DMA на полбуфера в полнодуплексном I2S

В полнодуплексном аудиотракте на STM32F407 приёмный DMA запускается через половину передающего буфера, разделяя во времени стадии RX, обработки и TX. Тест с кодеком WM8731 прошёл на стереопотоке 48 кГц и 16 бит, однако осциллограмма GPIO-маркеров пока подтверждает только порядок обработчиков — целостность семплов требует отдельной проверки.

На STM32F407 реализована схема полнодуплексного I2S, в которой обслуживание RX и TX DMA разнесено на половину кольцевого буфера. Такая организация даёт процессору отдельный временной интервал для обработки принятого аудиоблока перед его передачей в ЦАП. Исходный проект и готовая демонстрационная сборка опубликованы автором разработки.

Стенд собран на STM32F407 с ядром Cortex-M4 до 168 МГц и стереокодеке WM8731. Аудиопоток имеет формат 48 кГц, 16 бит, два канала. Основной блок I2S2 работает ведущим передатчиком, расширенный I2S2ext — ведомым приёмником. Оба используют общие сигналы SCK и WS, поэтому сдвиг относится к заполнению DMA-буферов и моментам вызова обработчиков. Электрические сигналы приёма и передачи остаются синхронными.

Для передачи задействован DMA1 Stream 4 Channel 0, соответствующий запросу SPI2/I2S2 TX. Приём с I2S2ext направлен в DMA1 Stream 3 Channel 3. Эти маршруты совпадают с таблицей DMA-запросов STM32F407. В стандартной функции HAL_I2SEx_TransmitReceive_DMA при конфигурации master-TX сначала запускается RX DMA расширенного блока, затем TX DMA основного I2S. Пользовательские half-transfer и complete callbacks назначаются RX-потоку, а аналогичные TX callbacks отключены.

В модифицированном варианте порядок изменён. Сначала стартует TX DMA, а запуск RX выполняется из обработчика половины передающего буфера. В результате события обслуживания двух потоков чередуются с интервалом в полбуфера. Принятая половина RX-буфера может обрабатываться, пока DMA передаёт другую половину TX-буфера. Метод подходит для блочных фильтров, эквалайзеров, задержек и других DSP-операций, если их худшее время исполнения укладывается в выделенное окно.

Пятисекундная запись содержит 240 000 отсчётов на канал и 960 000 байт PCM: 48 000 × 5 × 2 канала × 2 байта. Вместе с 44-байтовым WAV-заголовком размер файла составляет 960 044 байта. UART-лог показывает завершение одновременной записи и воспроизведения, а осциллограмма GPIO-маркеров — чередование обработчиков DMA.

Эти данные пока не дают количественной оценки задержки и загрузки Cortex-M4. Также отсутствуют захват I2S с проверкой непрерывности счётчика, поиск потерянных или повторённых семплов и спектральное сравнение входного и записанного сигналов. В диагностическом логе присутствуют LongSaveErrorCnt: 1 и SlowReadError: 2, влияние которых на аудиопоток не раскрыто. Поэтому опубликованный результат подтверждает работоспособность выбранного планирования DMA, а окончательная оценка качества тракта потребует проверки целостности данных и запаса времени для DSP между событиями half-transfer и complete.