я поженил DMA и тот пример с приемом ИК сигнала с сайте. Который попроще, без распознавания бренда. Короче схема такая, DMA настроен на считывание всего GPIO порта в буфер и завязан на таймер TIM4, который настроен на 50 мкс. Изначально включено только прерывание на пине ИК датчика по спадающему фронту. Когда прерывание получено - это значит, что сигнал только только начался. В прерывании выключаем собственные прерывания GPIO и запускаем TIM4. С этого момента каждые 50мкс дма будет складывать IDR в буфер. По завершению заполнения буфера в прерывании останавливаем таймер и анализируем, что мы там насэмплировали. Можем отправить в ЮАРТ ну и всё-такое. В конце перезапускаем ДМА и опять запускаем прерывание на пине.
Преимущество в том, что не надо 20000 раз в секунду прыгать в прерывание и проверять, есть сигнал или нет. Недостаток - сигнал с моего самсунговского пульта например длится 75 мс. JVCшный - около 45. Это значит, что размер буфера должен быть хотя бы 3 Кб, с запасом - 4Кб. Это конечно печально.
https://github.com/SgtPepperFTW/IR_remote_receiver_it_dma