器件型号:DK-TM4C129X
我已经建立了一个 UDMA 散聚 DMA 任务列表、该任务列表由 GPIO A7上外部 ADC 忙信号的下降沿触发。 任务列表将 四个16位字写入 SSI1发送 FIFO、将0x80写入 GPIO_Porta_AHB_BASE+GPIO_O_O_ICR 以尝试清除 DMA 请求、然后将主 UDMA DMACHCTL 的启动状态复制回该字以循环 DMA。 在添加循环任务之前、 在启动 UDMA 时、SSI 上出现了一个56 (=14*4)脉冲突发、表明 SSI 设置正确且 DMA 传输正常。
但是、当我添加循环任务时、在 GPIO A7的每个下降沿之后、我在 SSI 上获得连续的时钟脉冲流、而不是预期的56脉冲突发。 将 GPIO A7触发脉冲频率降至10KHz 对连续流没有影响。 这向我表明 DMA 请求一直处于"开启"状态。 写入 GPIO_ICR 没有帮助。 如何清除请求以防止连续时钟脉冲?
下面是开始该过程之前通道控制结构表的开始部分:
以下是上面的主条目指向的任务列表:
以下是 GPIO 寄存器内容:
在符号形式中,以下是主通道控制结构体和任务内容,其中一些由类似于 uDMATaskStructEntry()的例程动态初始化:
//! 线圈推杆主 UDMA 条目指向任务列表
const tDMAControlTable adcPusherUdmaPrimary ={
(((char *) adcPusherUdmaTask)+sizeof (adcPusherUdmaTask)-1、
&(uDmaCcs[ni:udmaAlternate:ni:adcBusyCoilUdmaChannel].ui32Spare)、
UDMA_CHCTL_DSTINC_32 | UDMA_CHCTL_DSTSIZE_32 |
UDMA_CHCTL_SRCINC_32 | UDMA_CHCTL_SRCSIZE 32 |
UDMA_CHCTL_ARBSIZE_4 |
((sizeof (adcPusherUdmaTask)/sizeof (uint32_t)-1)<< UDMA_CHCTL_XFERSIZE)|
UDMA_CHCTL_XFERMODE_PER_SG、
0
};
uint32_t adcPusherUdmaPrimaryInit;
//! 用于推送器自循环复制的 uDMA 源
uint32_t adcPusherUdmaRequestClear = ni:adcBusyGpioCoilMask;
//! 用于推送 UDMA 请求清除的 UDMA 源
(笑声)
//将主 ADC 向任务列表推送 UDMA。
uDmaCcs[ni:udmaPrimary][ni:adcBusyCoilUdmaChannel]= adcPusherUdmaPrimary;
//保存循环的重新初始化值。
adcPusherUdmaPrimaryInit = adcPusherUdmaPrimary.ui32Control;
//向 SSI 推送一个突发时钟。
uDMATaskAssign (
adcPusherUdmaTask[0]、
sizeof (adcPhusher)/sizeof (adcPhuse[0])、UDMA_SIZE_16、
UDMA_SRC_INC_16、adcPusher、
UDMA_DST_INC_NONE、(void *)(ni:adcSsi + SSI_O_DR)、
UDMA_ARB_1、UDMA_MODE_MEM_散 射_收集
);
//清除 uDMA 请求。
uDMATaskAssign (
adcPusherUdmaTask[1]、
1、UDMA_SIZE_32、
UDMA_SRC_INC_32、&adcPusherUdmaRequestClear、
UDMA_DST_INC_32、(void *)(ni:adcBusyGpioCoilPort + GPIO_ICR)、
UDMA_ARB_4、UDMA_MODE_MEM_散 射_收集
);
//循环以重复推杆任务。
uDMATaskAssign (
adcPusherUdmaTask[2]、
1、UDMA_SIZE_32、
UDMA_SRC_INC_32、&adcPusherUdmaPrimaryInit、
UDMA_DST_INC_32、
(void *)&(uDmaCcs[ni:udmaPrimary][ni:adcBusyCoilUdmaChannel].ui32Control)、
UDMA_ARB_4、UDMA_MODE_MEM_散 射_收集
);
此致、
Leo Bredehoft