nanorobot 3 24 декабря, 2021 Опубликовано 24 декабря, 2021 (изменено) · Жалоба Использую DMAC при работе с DAC. Два массива данных для передачи, соответственно два дескриптора ДМА, первичный и вторичный. Все работает, как нужно. Сконфигурированы прерывания по окончании передачи каждого блока. То есть в течение передачи обоих массивов происходит два прерывания. Каким образом программно различить эти прерывания? Суть в том, что пока один массив пересылается в DAC, значения второго требуется обновлять. PS: В качестве возможного решения видится подсчет произошедших прерываний, и выбор четное-нечетное. Но этот метод мне не кажется надежным. Изменено 24 декабря, 2021 пользователем nanorobot Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
nanorobot 3 24 декабря, 2021 Опубликовано 24 декабря, 2021 (изменено) · Жалоба Пришел к выводу, что это невозможно. Решил проблему иначе. Прерывания от DMAC по окончании всей тразакции. По передаче блока - генерация события, и, соответственно, прерывание уже от EVSYS. Изменено 24 декабря, 2021 пользователем nanorobot Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 199 24 декабря, 2021 Опубликовано 24 декабря, 2021 · Жалоба 5 часов назад, nanorobot сказал: PS: В качестве возможного решения видится подсчет произошедших прерываний, и выбор четное-нечетное. Но этот метод мне не кажется надежным. Почему? Почти всегда так и делаю. На всех МК. Никогда не подводило. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
nanorobot 3 24 декабря, 2021 Опубликовано 24 декабря, 2021 (изменено) · Жалоба 21 minutes ago, jcxz said: Почему? Почти всегда так и делаю. На всех МК. Никогда не подводило. На всех МК?.. Далеко не для всех мк есть понятие дескриптора DMA, а без него и подобной проблемы не может возникнуть(?) PS. по крайней той системы какскадирования дескрипторов, какая есть в ATSAML, еще что то похожее я видел у Alwinner V3S Изменено 24 декабря, 2021 пользователем nanorobot Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 199 24 декабря, 2021 Опубликовано 24 декабря, 2021 · Жалоба 38 минут назад, nanorobot сказал: На всех МК?.. Далеко не для всех мк есть понятие дескриптора DMA, а без него и подобной проблемы не может возникнуть(?) Linked Lists (NXP, Infineon), Double Buffer (STM32), Ping-Pong (TI Tiva) или ещё как - называться оно может по-разному и набор возможностей может отличаться. Но суть одна: непрерывный поток, обеспечиваемый двумя или более переключаемыми DMA-буферами. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
TU-104 0 21 февраля, 2022 Опубликовано 21 февраля, 2022 (изменено) · Жалоба // если хочется, то можно передать указатель на свои аргументы XDMAD_SetCallback(&Dma, dmaSSC_RXch, (XdmadTransferCallback)SSC_Rx_Cb, NULL); XDMAD_SetCallback(&Dma, dmaSSC_TXch, (XdmadTransferCallback)SSC_Tx_Cb, NULL); __________________________________________ // без доп аргументов *arg static void SSC_Tx_Cb(uint32_t channel) { //dPIN_OFF(PIN_TEST1); //d0print("SSCDMAcb tx ch:%u dmach:%u\n\r", channel, dmaSSC_TXch); // потом убрать это //NVIC_DisableIRQ(XDMAC_IRQn); XdmacChid * CHID = &(Dma.pXdmacs->XDMAC_CHID[dmaSSC_TXch]); u32 i; if ( (CHID->XDMAC_CNDA) == (u32)&LLIview0_TX[0] ) { pF_bufTX_rdy = &F_bufTX[0]; // в этот момент передаётся вторая часть буфера - по осциллу, и по выводу здесь } else //if ((CHID->XDMAC_CNDA) == (u32)&LLIview0_TX[1]) { pF_bufTX_rdy = &F_bufTX[FBTX_LEN/2]; } Я сделал так, всё работает. (ps. same70) Изменено 21 февраля, 2022 пользователем TU-104 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться