主题中讨论的其他器件: HALCOGEN
你(们)好
希望你们做得好。
我有一个非常奇怪的问题,我无法解决。 如果您能帮助我快速解决这一问题、我将不胜感激、因为这对于该项目而言非常紧迫。
我在 RM44L520上实现了 SPI 从 DMA 中断。
每次主器件发送数据时、都会触发中断、这正是我所期望的。
问题是... 当主器件未发送任何数据时、从器件会停留在以下语句 中、并且从不会从此处退出。 我不明白为什么会发生这种情况。
(*pf_irqFunc)(); /* Execute interrupt routine */
此语句是以下函数的一部分
void irqHandler(uint32_t u32VectorIrqIndex) { t_isrFuncPTR pf_irqFunc = NULL; /* Assign Null address */ /* Check IrqVector Range */ if ((u32VectorIrqIndex > (uint32_t)0U) && (u32VectorIrqIndex <= U32_VIM_CHAN_MAX) /* index is valid */) { pf_irqFunc = vimRAM->ISR[u32VectorIrqIndex]; /* Read IRQ Interrupt Vector */ /* Save VIM REQENASET[0,1,2,3] Registers for later restore */ uint32 u32BckupREQMASKSET0 = vimREG->REQMASKSET0; uint32 u32BckupREQMASKSET1 = vimREG->REQMASKSET1; uint32 u32BckupREQMASKSET2 = vimREG->REQMASKSET2; uint32 u32BckupREQMASKSET3 = vimREG->REQMASKSET3; /* Mask out lower priority IRQs depending on IRQ index */ if(U32_VIM_CHAN3_OFFSET < u32VectorIrqIndex) /* Channel 97-127*/ { vimREG->REQMASKCLR3 = ((U32_REG_CLRMASK << (u32VectorIrqIndex - 97U)) & (~vimREG->FIRQPR3)); /* Readback Mask to ensure that the previous write was finished before enabling interrupts again */ vimREG->REQMASKCLR3 = vimREG->REQMASKCLR3; } else if (U32_VIM_CHAN2_OFFSET < u32VectorIrqIndex) /* Channel 64-96 */ { vimREG->REQMASKCLR2 = ((U32_REG_CLRMASK << (U32_CHAN_REG2_OFFSET(u32VectorIrqIndex))) & (~vimREG->FIRQPR2)); vimREG->REQMASKCLR3 = ( U32_REG_CLRMASK & (~vimREG->FIRQPR3)); /* Readback Mask to ensure that the previous write was finished before enabling interrupts again */ vimREG->REQMASKCLR3 = vimREG->REQMASKCLR3; vimREG->REQMASKCLR2 = vimREG->REQMASKCLR2; } else if (U32_VIM_CHAN1_OFFSET < u32VectorIrqIndex) /* Channel 32-63 */ { vimREG->REQMASKCLR1 = ((U32_REG_CLRMASK << (U32_CHAN_REG1_OFFSET(u32VectorIrqIndex))) & (~vimREG->FIRQPR1)); vimREG->REQMASKCLR2 = ( U32_REG_CLRMASK & (~vimREG->FIRQPR2)); vimREG->REQMASKCLR3 = ( U32_REG_CLRMASK & (~vimREG->FIRQPR3)); /* Readback Mask to ensure that the previous write was finished before enabling interrupts again */ vimREG->REQMASKCLR3 = vimREG->REQMASKCLR3; vimREG->REQMASKCLR2 = vimREG->REQMASKCLR2; } else if (U32_VIM_CHAN0_OFFSET < u32VectorIrqIndex) /* Channel 2-31 */ { vimREG->REQMASKCLR0 = ((U32_REG_CLRMASK << (U32_CHAN_REG0_OFFSET(u32VectorIrqIndex))) & (~vimREG->FIRQPR0)); vimREG->REQMASKCLR1 = ( U32_REG_CLRMASK & (~vimREG->FIRQPR1)); vimREG->REQMASKCLR2 = ( U32_REG_CLRMASK & (~vimREG->FIRQPR2)); vimREG->REQMASKCLR3 = ( U32_REG_CLRMASK & (~vimREG->FIRQPR3)); /* Readback Mask to ensure that the previous write was finished before enabling interrupts again */ vimREG->REQMASKCLR3 = vimREG->REQMASKCLR3; vimREG->REQMASKCLR2 = vimREG->REQMASKCLR2; } else /* FIQ is not executed in this context*/ { ErrHdl_vSetErrCodeDummy; /* Reaction Safe Mode */ } _enable_IRQ(); /* Enable IRQ, to allow preemption of IRQ routine */ (*pf_irqFunc)(); /* Execute interrupt routine */ _disable_IRQ(); /* Disable IRQ, to protect the remainder of the dispatcher from preemption */ /* Restore VIM REQENASET[0,1,2,3] Registers */ vimREG->REQMASKSET0 = u32BckupREQMASKSET0; vimREG->REQMASKSET1 = u32BckupREQMASKSET1; vimREG->REQMASKSET2 = u32BckupREQMASKSET2; vimREG->REQMASKSET3 = u32BckupREQMASKSET3; } else /*index is not valid */ { ErrHdl_vSetErrCodeDummy; /* Reaction Safe Mode */ } }
函数指针本身指向..
/* SourceId : DMA_SourceId_019 */ /* DesignId : DMA_DesignId_016 */ /* Requirements: HL_SR181, HL_SR182 */ void dmaBTCAInterrupt(void) { uint32 offset = dmaREG->BTCAOFFSET; /* USER CODE BEGIN (6) */ /* USER CODE END */ if (offset != 0U) { dmaGroupANotification(BTC, offset - 1U); } /* USER CODE BEGIN (7) */ /* USER CODE END */ }
请告诉我您是否需要有关此方面的任何其他信息。
谢谢、祝您愉快。