Провел ряд экспериментов с использованием ST-LINK/v2. 1. Судя по всему сброс
ADC1->SR &= ~ADC_SR_STRT;
- не останавливает ADC, т.к. под отладчиком при пошаговом переходе от строки
DMA2_Stream4->CR |= DMA_SxCR_EN; к строке
ADC1->CR2 |= ADC_CR2_SWSTART;
значение DMA2_Stream4->NDTR уменьшается. Т.е. ADC продолжает выдавать запросы и как только происходит разблокировка DMA, сразу осуществляется пересылка выборки в память. Хотя может быть и сохраняется отложенный запрос и при перезапуске DMA он выполняется?
2. Возникает проблема порядка расположения поканальных данных в памяти. Если невозможно остановить ADC (постоянный последовательный перебор заданных каналов), то как начать складывать данные в память с нужного (в данном случае с 10-го) канала ADC?
3. Попробовал вместо сброса ADC_SR_STRT и ADC_SR_OVR использовать сброс/установку ADC_CR2_ADON (переход в power down mode и обратно). Судя по всему проблема п.п. 2 решается + автоматически сбрасываются флаги ADC_SR_STRT и ADC_SR_OVR. Однако переход в режим низкого потребления и обратно процесс не быстрый, со всеми вытекающими. Если в строке
"//обработка выборок..." (между остановкой и перезапуском ADC и DMA) поставить гигантскую задержку (десятки мс) или точку останова, то все начинает работать.
Не понятно откуда вообще берутся 0? Ведь DMA пересылает данные только по запросу ADC, который в свою очередь выставляет запрос только после преобразования, в результате которого 0 быть не может (в данном случае). И каждый раз NDTR оказывается равным 0, т.е весь необходимый массив данных передается успешно? Так же непонятно почему первый раз (после инициализации) все работает как надо, а дальше все рушится, хотя восстанавливаю все (смотрел под отладчиком) необходимые регистры ADC и DMA?