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.

怎样配置MSP432E401Y的ADC的最高采集速度

Other Parts Discussed in Thread: MSP432E401Y

我通过数据手册了解到MSP432E401Y的ADC采集最高速率为2M,但我使用ADC+UDMA+TIM触发的配置时速率始终上不去,提高触发频率时,采样的波形变得很奇怪,如采样正弦波时,显示的波形为一段连续的正常波形后跳变到另一端连续的正常波形,如果我想提高采样频率,我该怎么配置

void ADC_UDMAInit()
{
    MAP_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOE);

    MAP_GPIOPinTypeADC(GPIO_PORTE_BASE, GPIO_PIN_0);

    MAP_SysCtlPeripheralEnable(SYSCTL_PERIPH_ADC0);

    MAP_ADCSequenceStepConfigure(ADC0_BASE, 3, 0, ADC_CTL_CH3 | ADC_CTL_IE | ADC_CTL_END);
    MAP_ADCSequenceConfigure(ADC0_BASE, 3, ADC_TRIGGER_TIMER, 2);

    MAP_ADCIntClearEx(ADC0_BASE, ADC_INT_DMA_SS3);
    MAP_ADCIntEnableEx(ADC0_BASE, ADC_INT_DMA_SS3);

    MAP_ADCSequenceDMAEnable(ADC0_BASE, 3);
    MAP_ADCSequenceEnable(ADC0_BASE, 3);
    MAP_IntEnable(INT_ADC0SS3);

    ADC0->SSTSH0 = 0x0;

    MAP_SysCtlPeripheralEnable(SYSCTL_PERIPH_UDMA);                                                          //使能DMA外设
    MAP_uDMAEnable();

    MAP_uDMAControlBaseSet(pui8ControlTable);
    MAP_uDMAChannelAssign(UDMA_CH17_ADC0_3);                                                                //为DMA分配外围映射

    //UDMA_ATTR_USEBURST失能仅使用突发模式,UDMA_ATTR_ALTSELECT失能选择备用控制结构
    //UDMA_ATTR_HIGH_PRIORITY失能将其通道设为高优先级,UDMA_ATTR_REQMASK失能屏蔽该通道外围设备的硬件请求信号。
    MAP_uDMAChannelAttributeDisable(UDMA_CH17_ADC0_3,
                                    UDMA_ATTR_ALTSELECT | UDMA_ATTR_USEBURST |
                                    UDMA_ATTR_HIGH_PRIORITY |
                                    UDMA_ATTR_REQMASK);
    //UDMA_PRI_SELECT使用主控制结构,
    //数据大小为16,源地址无增量,目标地址增量为16,仲裁数为1
    MAP_uDMAChannelControlSet(UDMA_CH17_ADC0_3 | UDMA_PRI_SELECT,
                              UDMA_SIZE_16 | UDMA_SRC_INC_NONE | UDMA_DST_INC_16 |
                              UDMA_ARB_1);
    //使用基础模式,sizeof(ADC_BUFF)/2为要传输的数据项的数量
    MAP_uDMAChannelTransferSet(UDMA_CH17_ADC0_3 | UDMA_PRI_SELECT,
                               UDMA_MODE_BASIC,
                               (void *)&ADC0->SSFIFO3, (void *)&ADC_BUFF,
                               sizeof(ADC_BUFF)/2);
    MAP_uDMAChannelEnable(UDMA_CH17_ADC0_3);                                                                //通道使能


    MAP_SysCtlPeripheralEnable(SYSCTL_PERIPH_TIMER0);                                                       //使能定时器0外设
    MAP_TimerConfigure(TIMER0_BASE, TIMER_CFG_A_PERIODIC_UP);                                                  //配置定时器为半宽周期定时器
    MAP_TimerLoadSet(TIMER0_BASE, TIMER_A, (120000000/20000));                                               //配置为定时器类型和装载值
    MAP_TimerADCEventSet(TIMER0_BASE, TIMER_ADC_TIMEOUT_A);                                                 //配置定时器作为ADC触发
    MAP_TimerControlTrigger(TIMER0_BASE, TIMER_A, true);                                                    //使能作为ADC触发
    MAP_TimerEnable(TIMER0_BASE, TIMER_A);                                                                  //开启定时器
}