您好!
我目前正在努力实现以下目标:
- 让一些 ADC1通道(在事件组中)由硬件触发。
- 使用 DMA 将 ADC 读数从 ADC1的 RAM 传输到 CPU 的 RAM (SRAM)。
我的实施能够实现这些目标。 但是、 在 DMA 完成一次 ADC 读数传输后、ADC1的存储器超限(由 ADEVINTFLG 指示)。
传输的 ADC 读数正确、DMA 的挂起寄存器显示它没有等待处理。
感谢您的帮助!
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 的挂起寄存器显示它没有等待处理。
感谢您的帮助!
大家好、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)。