ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Воскресенье
24 ноября
1031637 Топик полностью
evgeniy1294 (27.08.2020 20:32, просмотров: 504) ответил Kceния на А чего вообще надо делать, если находишься в прерывании по окончании задания, и требуется еще раз это же задание запустить?
"Скажем, SPI на AVR можно легко перезапустить прямо из прерывания" - потому что камень примитивен, как стакан. Чтобы "перезапустить" транзакцию по DMA вам как минимум нужно: 

1) Остановить поток DMA

2) Cбросить регистр NDTR в начальное значение (кол-во транзакций для передачи, не обязательно в байтах)

3) Перезаписать M0AR (я не помню, инкрементируется он или нет)

4) Проверить флаг Busy в регистрах SPI, периферия должна быть свободна.

5) Также нужно помнить о протоколе обмена с внешними устройствами, возможно придется подергать CS
6) Где-то на этом шаге можно перезапускать DMA
DMA->CR |= DMA_SxCR_EN;


Строго говоря, DMA может работать циклически, с автоматическим перезапуском или в режиме double buffer. Т.е код можно сделать таким, что эти действия не понадобятся. Классическим примером в данном случае является опрос ADC по DMA, который циклически повторяется по триггеру (от самого ADC или таймера).