Allregia 9 18 апреля Опубликовано 18 апреля · Жалоба Я может раньше не в том разделе спросил, может тут кто подскажет. --------------------------------------------- Рассматриваю тут исходники одного девайса, и есть вопросы. Чип - STM32L151, используется два входа АЦП, преобразование складыват результаты в две переменные в прерывании СисТика. В начале, в main, запускается преобразование: vu16 ADCRes[2]; // ADC Results from DMA ......... MX_DMA_Init(); MX_ADC_Init(); HAL_ADC_Start_DMA(&hadc, (uint32_t *)ADCRes, 2); Затем в систике значения с АЦП накапливаются в двух переменных и когда-то потом используются: u32 ADC1Res=0, ADC2Res=0; // ADC integrators ... void HAL_SYSTICK_Callback(void){ ADC1Res +=ADCRes[0]; ADC2Res +=ADCRes[1]; HAL_ADC_Start(&hadc); // next convertion <<<<<<<<<<<<< (1) Иициализация DMA НЕ циклическая! hadc.Instance = ADC1; hadc.Init.ClockPrescaler = ADC_CLOCK_ASYNC_DIV4; hadc.Init.Resolution = ADC_RESOLUTION_12B; hadc.Init.DataAlign = ADC_DATAALIGN_RIGHT; hadc.Init.ScanConvMode = ADC_SCAN_ENABLE; hadc.Init.EOCSelection = ADC_EOC_SEQ_CONV; hadc.Init.LowPowerAutoWait = ADC_AUTOWAIT_DISABLE; hadc.Init.LowPowerAutoPowerOff = ADC_AUTOPOWEROFF_DISABLE; hadc.Init.ChannelsBank = ADC_CHANNELS_BANK_A; hadc.Init.ContinuousConvMode = DISABLE; // <<<<<<<<<<<<<<<<<<<<<<< (2) hadc.Init.NbrOfConversion = 2; hadc.Init.DiscontinuousConvMode = ENABLE; hadc.Init.NbrOfDiscConversion = 2; hadc.Init.ExternalTrigConv = ADC_SOFTWARE_START; hadc.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE; hadc.Init.DMAContinuousRequests = ENABLE; if (HAL_ADC_Init(&hadc) != HAL_OK) Собственно вопрос - "а что, так можно было?!"(с) То есть, почему в (1) стоит HAL_ADC_Start а не HAL_ADC_Start_DMA и как оно при этом работает ?! Почему HAL_ADC_Start запускает DMA? А если оно DMA не запускает, то как результат двух преобразований попадает в ADCRes[] ? --------------------------------------------- P.S. Если я комментирую (1) и в (2) меняю дизейбл на энейбл - все работает в циклическом режиме, но это тривиально. Читали бы в прерывании по концу DMA, перезапуская его там-же, это тоже было бы понятно. Но вот такое как там я что-то не понял. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Sverchok 1 18 апреля Опубликовано 18 апреля · Жалоба 8 часов назад, Allregia сказал: P.S. Если я комментирую (1) и в (2) меняю дизейбл на энейбл - все работает в циклическом режиме, но это тривиально. Вот тут не очень понятно, (2) не влияет на режим работы DMA. Может у вас все таки DMA а циклическом режиме настроен? Покажите настройку самого DMA. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Allregia 9 18 апреля Опубликовано 18 апреля · Жалоба 28 minutes ago, Sverchok said: Может у вас все таки DMA а циклическом режиме настроен? Это не у меня, чужой код. DMA да, он там в цикулическом, но ведь его кто-то дергать должен? А АЦП не в циклическом. Т.е. по идее сделал два преобразования (дергая каждый раз DMA и дальше должен ждать следующего запуска? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Obam 34 18 апреля Опубликовано 18 апреля · Жалоба DMA да, он там в цикулическом, но ведь его кто-то дергать должен? Вот АЦП и будет его "пинать", если ПДП (DMA) настроен на работу с АЦП. ПДП забирает готовые данные: пока их нет он будет "неподвижен". А АЦП не в циклическом. Т.е. по идее сделал два преобразования (дергая каждый раз DMA и дальше должен ждать следующего запуска? Ну да. У АЦП только выходной регистр с полученным результатом, куда оно потом - это АЦП не знает... Отсутствие overrun обеспечивает ПДП. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Allregia 9 19 апреля Опубликовано 19 апреля · Жалоба 13 hours ago, Obam said: Вот АЦП и будет его "пинать", А его самого кто "пинает"? Тут-же не ПДП говорит АЦП: "дай мне данных", а наоборот, это АЦП говорит ПДП: "у меня данные готовы, забери". 13 hours ago, Obam said: Ну да. У АЦП только выходной регистр с полученным результатом, куда оно потом - это АЦП не знает... Ззато он "значет", что надо взвести про бит запуска ПДП после преобращзования. И если АЦП не в циклическом, то после окончания преобразования заданной ему цепочки каналов, он должен остановится. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dimka76 51 19 апреля Опубликовано 19 апреля · Жалоба On 4/19/2024 at 9:24 AM, Allregia said: А его самого кто "пинает"? Вон же у вас в обработчике прерывания SysTick каждый раз запускается АЦП. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Sverchok 1 19 апреля Опубликовано 19 апреля · Жалоба 11 часов назад, Allregia сказал: DMA да, он там в цикулическом, но ведь его кто-то дергать должен? HAL_ADC_Start(&hadc) в функции HAL_SYSTICK_Callback(void) запускает АЦП, а DMA уже и так настроен. В результате после завершения преобразования он скопирует данные из регистров АЦП в память. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Allregia 9 19 апреля Опубликовано 19 апреля · Жалоба 3 hours ago, dimka76 said: Вон же у вас в обработчике прерывания SysTick каждый раз запускается АЦП. Да, но он запускается как HAL_ADC_Start а не как HAL_ADC_Start_DMA. Вот это меня с толку и сбивает. 2 hours ago, Sverchok said: запускает АЦП, а DMA уже и так настроен. Наверное Вы правы - первый раз HAL_ADC_Start_DMA все настроил и запустил, а потом уже достаточно и простого HAL_ADC_Start. Я эти калокубовуские функции не очнь копал, у меня чаще всего один раз при старте все запускается циклически ("выстрелил-забыл"), а я уже когда мне надо, беру резуьлтаты из памяти. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Obam 34 19 апреля Опубликовано 19 апреля · Жалоба Вот АЦП и будет его "пинать", А его самого кто "пинает"? О! Уже ответили... Ззато он "значет", что надо взвести про бит запуска ПДП после преобращзования. Так выставленный EOC и "пинает" ПДП... И если АЦП не в циклическом, то после окончания преобразования заданной ему цепочки каналов, он должен остановится. Он и остановится, разве есть сомнения? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Allregia 9 19 апреля Опубликовано 19 апреля · Жалоба 17 minutes ago, Obam said: Он и остановится, разве есть сомнения? Нет, в этом сомнений небыло 🙂 Сомнения были что HAL_ADC_Start запускает АЦП ВМЕСТЕ с ПДП, но во 1-х товаришь который это писал - совсем не дурак, а во 2-х. и главное - что оно работет. Просто я обычно делал по другому. Ну в общем, вопрос исчерпан. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться