最近初步了解了 新塘的M451系列单片机对ADC 这部分 还是不太了解 有些问题想请教大家 功能如下:
1 定时器触发ADC两个通道连续转换。(本质上是 :定时器0 触发ADC通道1转换 ,ADC通道1转换完成后立马开始转换ADC通道2,这样的功能算是基本上很常见了,基本上每个单片机都有)。
2 每个通道转换完成后数据立马送往DMA缓冲区,并且开启了DMA传输完成中断,我需要每个通道转换65次所以 所以我开辟了130个U16大小的DMA缓冲区。
问题:现在是 DMA目标地址是递增的 (必须这样 否则数据会覆盖),源地址我不确定是否递增(源地址是ADC转换模组数据寄存器:递增不递增 我都尝试过一样不能进入中断 进入中断的时候 ADC 通道1通道2刚好每个转换了65次)。并且 DAC的PDMA功能是正常的 中断也是正常的 。程序如下:
EADC_Open(EADC, EADC_CTL_DIFFEN_SINGLE_END);
EADC_SetInternalSampleTime(EADC, 6);
/* Configure the sample 5 module for analog input channel 1 and enable timer0 trigger source */
EADC_ConfigSampleModule(EADC, 1, EADC_TIMER0_TRIGGER, 1);
/* Configure the sample 6 module for analog input channel 2 and enable ADINT0 trigger source */
EADC_ConfigSampleModule(EADC, 2, EADC_ADINT0_TRIGGER, 2);
/* Clear the A/D ADINT0 interrupt flag for safe */
EADC_CLR_INT_FLAG(EADC, 0x1);
/* Disable the sample module 7 interrupt */
EADC_ENABLE_INT(EADC, 0x2);//Enable sample module A/D ADINT1 interrupt.目前找不到合适的方法去触发下一个通道
/* Open PDMA Channel 0,2 */
PDMA_Open(0x5);
/* transfer width is half word(16 bit) and transfer count is 6 */
PDMA_SetTransferCnt(2, PDMA_WIDTH_16, 130);
/* Set source address as EADC data register(no increment) and destination address as g_i32ConversionData array(increment) */
PDMA_SetTransferAddr(2, (uint32_t)&EADC->DAT[1],PDMA_SAR_INC, (uint32_t)g_i32ConversionData, PDMA_DAR_INC);
/* Select PDMA request source as ADC RX */
PDMA_SetTransferMode(2, PDMA_ADC_RX, FALSE, 0);
/* Set PDMA as single request type for EADC */
PDMA_SetBurstType(2,PDMA_REQ_BURST,PDMA_BURST_2);
PDMA_EnableInt(2, PDMA_INT_TRANS_DONE);
NVIC_EnableIRQ(PDMA_IRQn);
|