Дорогие разработчики, помогите, пожалуйста заблокировать источник ненужных прерываний DMA RISC.
Суть в следующем. Инициализирую SSP-модули, как советовалось в других ветках форума, чтобы не было лишних срабатываний прерываний DMA:
Код:
RST_CLK_PCLKcmd(RST_CLK_PCLK_DMA|RST_CLK_PCLK_SSP1|RST_CLK_PCLK_SSP2|RST_CLK_PCLK_SSP3|RST_CLK_PCLK_SSP4, ENABLE);
MDR_SSP1->DMACR = 0;
MDR_SSP2->DMACR = 0;
MDR_SSP3->DMACR = 0;
MDR_SSP4->DMACR = 0;
DMA_DeInit();
MDR_DMA->CHNL_ENABLE_CLR = 0xFFFFFFFF;
MDR_DMA->CHNL_REQ_MASK_SET = 0xFFFFFFFF;
NVIC_EnableIRQ(DMA_IRQn);
for (;;) {}
При этом, как и положено, никаких DMA прерываний не возникает.
Но если перед for(;;) вставить RST_CLK_DSPCmd(ENABLE); код постоянно влетает в обработчик DMA_IRQHandler.
Причем регистр MDR_DMA->STATUS == 0x101F0000, т.е. работа контроллера запрещена.
Как можно решить эту проблему с возникновением ненужных прерываний?
Добавление:
После вызова RST_CLK_DSPCmd(ENABLE); в регистре DIR (который находится по адресу 0x3000_0078) выставляется флаг DMAIRQ. Может, это из-за него генерятся DMA-прерывания? А как его сбросить? Простой вызов DSP_DSPToRISCInterruptCmd(DSP_CORE_DIR_DMAIRQ, RESET); не срабатывает - флаг все равно выставлен.
Прошу помочь в решении проблемы.