主题中讨论的其他器件:SysConfig
您好!
我正在尝试使用 DMA 和早期的中断机制实现某种乒乓缓冲。
但是、我从未得到任何早期 IRQ。
我 SysConfig 为 DMA 通道0生成的初始化代码如下所示:
static const DL_DMA_Config gDMA_CH0Config = {
.transferMode = DL_DMA_FULL_CH_REPEAT_SINGLE_TRANSFER_MODE,
.extendedMode = DL_DMA_NORMAL_MODE,
.destIncrement = DL_DMA_ADDR_UNCHANGED,
.srcIncrement = DL_DMA_ADDR_INCREMENT,
.destWidth = DL_DMA_WIDTH_BYTE,
.srcWidth = DL_DMA_WIDTH_BYTE,
.trigger = DMA_CH0_TRIGGER_SEL_FSUB_0,
.triggerType = DL_DMA_TRIGGER_TYPE_EXTERNAL,
};
SYSCONFIG_WEAK void SYSCFG_DL_DMA_CH0_init(void)
{
DL_DMA_clearInterruptStatus(DMA, DL_DMA_INTERRUPT_CHANNEL0);
DL_DMA_enableInterrupt(DMA, DL_DMA_INTERRUPT_CHANNEL0);
DL_DMA_clearInterruptStatus(DMA, DL_DMA_FULL_CH_INTERRUPT_EARLY_CHANNEL0);
DL_DMA_Full_Ch_setEarlyInterruptThreshold(DMA, DMA_CH0_CHAN_ID, DL_DMA_EARLY_INTERRUPT_THRESHOLD_HALF);
DL_DMA_enableInterrupt(DMA, DL_DMA_FULL_CH_INTERRUPT_EARLY_CHANNEL0);
DL_DMA_setSrcIncrement(DMA, DMA_CH0_CHAN_ID, DL_DMA_ADDR_INCREMENT);
DL_DMA_setTransferSize(DMA, DMA_CH0_CHAN_ID, 48);
DL_DMA_initChannel(DMA, DMA_CH0_CHAN_ID , (DL_DMA_Config *) &gDMA_CH0Config);
}
SYSCONFIG_WEAK void SYSCFG_DL_DMA_init(void){
DL_DMA_setSubscriberChanID(DMA, DL_DMA_SUBSCRIBER_INDEX_0, 1);
SYSCFG_DL_DMA_CH0_init();
}
然后、我按如下所示启用和启动 DMA:
//setting src and dest for dma and then
DL_DMA_enableChannel(DMA, DMA_CH0_CHAN_ID);
NVIC_EnableIRQ(DMA_INT_IRQn);
我的中断例程如下所示:
void DMA_IRQHandler(void){
switch (DL_DMA_getPendingInterrupt(DMA)) {
case DL_DMA_FULL_CH_EVENT_IIDX_EARLY_IRQ_DMACH0: {
DL_GPIO_togglePins(GPIO_LEDS_PORT,
GPIO_LEDS_USER_LED_1_PIN | GPIO_LEDS_USER_TEST_PIN);
} break;
case DL_DMA_EVENT_IIDX_DMACH0:
__NOP();
break;
default:
__NOP();
break;
}
}
使用 FSUB_0触发 DMA 的工作原理很有魅力、但不知何故、我无法获得我希望在
传输的前半部分触发、以便我可以重新填充我的乒乓缓冲器中的前24个字节。
此外,它不适用于任何 DL_DMA_EARLY_INTERRUPT_THRESHOLD_*。
但是、DL_DMA_EVENT_IIDX_DMACH0会触发。
谢谢你,至少带我进入正确的方向。