This thread has been locked.
If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.
您好!
我目前正在努力实现以下目标:
我的实施能够实现这些目标。 但是、 在 DMA 完成一次 ADC 读数传输后、ADC1的存储器超限(由 ADEVINTFLG 指示)。
传输的 ADC 读数正确、DMA 的挂起寄存器显示它没有等待处理。
感谢您的帮助!
抱歉、我想补充的是、DMA 直接从 ADC1的结果存储器读取、而不是从其 FIFO 寄存器读取。
我想再次补充一点、如果 CPU 直接从 ADC1的 RAM 中读取、则会发生相同的问题(存储器溢出)。 但是、如果 DMA/CPU 从 ADC1的 FIFO 寄存器中读取数据、问题就会消失。
得到您的问题、稍后将向您提供我的评论。
如果使用 组块 DMA 传输(EV_BLK_Xfer=1)、当 ADC 将 EV_BLOCK 数量的缓冲器写入事件组存储器时、就会生成 DMA 请求。
在 DMA 数据包配置中、元素大小应等于 EV_BUARTs。 否则、您可能会得到溢出中断。
大家好、QJ Wang
感谢您的关注和回应!
我将帧传输用于 DMA 通道、而(dma_ev_end = 1)用于 ADC。
我是否必须改用块传输(DMA)和 EV_BLK_Xfer?
以下是我的当前设置:
DMA:
dmaChannelAdc1Rx[EventGroup] = DMA_CH26; dmaControlAdc1Rx[EventGroup].SADD = adc1SourceAddresses[EventGroup]; dmaControlAdc1Rx[EventGroup].DADD = (uint32_t)settings->dmaAdc1RxBuffer[EventGroup]; dmaControlAdc1Rx[EventGroup].CHCTRL = 0U; dmaControlAdc1Rx[EventGroup].FRCNT = 1U; dmaControlAdc1Rx[EventGroup].ELCNT = settings->dmaAdc1RxBufferSize[EventGroup]; dmaControlAdc1Rx[EventGroup].ELDOFFSET = 0U; dmaControlAdc1Rx[EventGroup].ELSOFFSET = 0U; dmaControlAdc1Rx[EventGroup].FRDOFFSET = 0U; dmaControlAdc1Rx[EventGroup].FRSOFFSET = 0U; dmaControlAdc1Rx[EventGroup].PORTASGN = PORTB_READ_PORTA_WRITE; dmaControlAdc1Rx[EventGroup].RDSIZE = ACCESS_32_BIT; dmaControlAdc1Rx[EventGroup].WRSIZE = ACCESS_32_BIT; dmaControlAdc1Rx[EventGroup].TTYPE = FRAME_TRANSFER; dmaControlAdc1Rx[EventGroup].ADDMODERD = ADDR_INC1; dmaControlAdc1Rx[EventGroup].ADDMODEWR = ADDR_INC1; dmaControlAdc1Rx[EventGroup].AUTOINIT = AUTOINIT_ON;
ADC:
ADEVDMACR: 0x0000 0008 ADEVMODECR: 0x0000 0000 ADEVSRC: EPWM ADCLOCKCR, ADEVSAMP, and ADEVSAMPDISEN are all set.
我尝试了以下设置。 仍然出现内存溢出问题。
DMA:
dmaChannelAdc1Rx[EventGroup] = DMA_CH26; dmaControlAdc1Rx[EventGroup].SADD = adc1SourceAddresses[EventGroup]; dmaControlAdc1Rx[EventGroup].DADD = (uint32_t)settings->dmaAdc1RxBuffer[EventGroup]; dmaControlAdc1Rx[EventGroup].CHCTRL = 0U; dmaControlAdc1Rx[EventGroup].FRCNT = 1U; dmaControlAdc1Rx[EventGroup].ELCNT = settings->dmaAdc1RxBufferSize[EventGroup]; dmaControlAdc1Rx[EventGroup].ELDOFFSET = 0U; dmaControlAdc1Rx[EventGroup].ELSOFFSET = 0U; dmaControlAdc1Rx[EventGroup].FRDOFFSET = 0U; dmaControlAdc1Rx[EventGroup].FRSOFFSET = 0U; dmaControlAdc1Rx[EventGroup].PORTASGN = PORTB_READ_PORTA_WRITE; dmaControlAdc1Rx[EventGroup].RDSIZE = ACCESS_32_BIT; dmaControlAdc1Rx[EventGroup].WRSIZE = ACCESS_32_BIT; dmaControlAdc1Rx[EventGroup].TTYPE = BLOCK_TRANSFER; dmaControlAdc1Rx[EventGroup].ADDMODERD = ADDR_INC1; dmaControlAdc1Rx[EventGroup].ADDMODEWR = ADDR_INC1; dmaControlAdc1Rx[EventGroup].AUTOINIT = AUTOINIT_ON;
ADC:
ADEVDMACR: 0x0002 0004 ADEVMODECR: 0x0000 0000 ADEVSRC: EPWM ADCLOCKCR, ADEVSAMP, and ADEVSAMPDISEN are all set.
遗憾的是、我无法显示更多代码。 是否有任何寄存器或指示可 供我进一步查找 、以找出根本原因?
如果 EV_BLK_Xfer=0、 如果 EV_DMA_EN 被置位、ADC 模块为每次到事件存储器的写入生成一个 DMA 请求。
如果 EV_BLK_Xfer=1、 ADC 模块在 ADC 已将 EV_BLOCK 数量的缓冲器写入事件存储器中时生成一个 DMA 请求。
DMA 数据包的元素大小应与 EV_BUARTs 相同。
在下一组2次转换完成之前、DMA 控制器应完成读取2个数据(配置中的 EV_BLOCK_2)。
此帖子的状态更新:
我已经尝试 过帖子中推荐的修复程序、 但它们对我不起作用。 (这并不能使这些建议事实上是正确的。)
我们怀疑此问题可能是由触发 ADC 模块的方式引起的。
我们决定不使用带有 DMA 的 ADC、因此这篇文章可能没有分辨率。
编辑:语法