Из-за некоторых требований к дизайну мне нужно изменить дескриптор DMA во время выполнения. Для этого я выполняю следующие шаги:Atmel SAMD21 DMA Abort issue
- Abort DMA channel. Затем аппаратное обеспечение DMA сохранит исполняемый дескриптор на месте записи write_back RAM того же канала DMA.
- Дождитесь завершения Abort
- Измените дескриптор DMA на место записи write_back.
- Включить DMA канал снова
Это фрагмент кода я использую:
//Select DMA channel
DMAC->CHID.reg = DMAC_CHID_ID(cSPIDMAResource0.channel_id);
//Abort Selected DMA channel
DMAC->CHCTRLA.reg &= ~DMA_CHANNEL_ENABLE_BIT_POS;
//Wait until Abort completed
while((DMAC->CHCTRLA.reg & DMA_CHANNEL_ENABLE_BIT_POS) == DMA_CHANNEL_ENABLE_BIT_POS);
/*
Modify Descriptor here
*/
//Enable DMA channel
DMAC->CHCTRLA.reg |= DMA_CHANNEL_ENABLE_BIT_POS;
Вышеуказанные шаги прекрасно работают без каких-либо проблем, но я столкнулся вопрос Descriptor коррупции во время долгосрочной перспективе.
Аппаратное обеспечение DMA хранит в настоящее время исполняемый дескриптор в местоположении записи write_back другого канала DMA (вместо собственного местоположения ОЗУ записи), когда выполняется прерывание DMA.
Если у кого-то есть представление о том, что пошло не так, или у меня есть идея, как я могу полностью избежать проблемы с дескриптором, я бы хотел попробовать.
Я также попытался отключить прерывания во время доступа регистра DMAC, но это не решило проблему – GOKU