msp432p401r用官方的driverlib库实现DMA+ADC14的双通道采集1M采样频率
时间: 2024-04-08 12:29:42 浏览: 205
要实现DMA+ADC14的双通道采集,并达到1M采样频率,您可以使用MSP432P401R微控制器上的官方driverlib库。下面是一个示例代码来实现此功能:
```c
#include <driverlib.h>
#define BUFFER_SIZE 1024
// ADC14 DMA 传输完成标志
volatile bool dmaTransferComplete = false;
// ADC14 双通道采样缓冲区
uint16_t adcBuffer[BUFFER_SIZE];
void main(void)
{
// 初始化系统时钟
MAP_CS_setDCOCenteredFrequency(CS_DCO_FREQUENCY_48);
// 配置ADC14
MAP_ADC14_enableModule();
MAP_ADC14_initModule(ADC_CLOCKSOURCE_SMCLK, ADC_PREDIVIDER_1, ADC_DIVIDER_1, 0);
MAP_ADC14_configureMultiSequenceMode(ADC_MEM0, ADC_MEM1, false);
MAP_ADC14_configureConversionMemory(ADC_MEM0, ADC_VREFPOS_AVCC_VREFNEG_VSS, ADC_INPUT_A0, false);
MAP_ADC14_configureConversionMemory(ADC_MEM1, ADC_VREFPOS_AVCC_VREFNEG_VSS, ADC_INPUT_A1, false);
MAP_ADC14_enableSampleTimer(ADC_MANUAL_ITERATION);
// 配置采样时钟为1M
MAP_ADC14_enableConversion();
MAP_ADC14_setSampleHoldTime(ADC_PULSE_WIDTH_4, ADC_PULSE_WIDTH_4);
MAP_ADC14_setResolution(ADC_14BIT);
MAP_ADC14_setSampleHoldTrigger(ADC_TRIGGER_SOURCE1, false);
// 配置DMA
MAP_DMA_enableModule();
MAP_DMA_setControlBase(MSP_EXP432P401RLP_DMAControlTable);
MAP_DMA_enableChannel(0);
MAP_DMA_setChannelControl(0, UDMA_SIZE_16 | UDMA_SRC_INC_NONE | UDMA_DST_INC_16 | UDMA_ARB_1);
MAP_DMA_setChannelTransfer(0, UDMA_MODE_PINGPONG, (void *)&ADC14->MEM[0], (void *)&adcBuffer[0], BUFFER_SIZE);
MAP_DMA_assignInterrupt(INT_DMA_INT0, 0);
MAP_DMA_clearInterruptFlag(0);
MAP_DMA_enableInterrupt(INT_DMA_INT0);
MAP_Interrupt_enableInterrupt(INT_DMA_INT0);
// 启动DMA传输
MAP_DMA_setChannelTransfer(0, UDMA_MODE_PINGPONG, (void *)&ADC14->MEM[0], (void *)&adcBuffer[0], BUFFER_SIZE);
// 启动ADC14
MAP_ADC14_enableInterrupt(ADC_INT1);
MAP_Interrupt_enableInterrupt(INT_ADC14);
MAP_ADC14_toggleConversionTrigger();
while (1)
{
// 等待DMA传输完成
while (!dmaTransferComplete)
{
// 进入低功耗模式等待DMA传输完成
MAP_PCM_gotoLPM0();
}
// 处理ADC数据
// adcBuffer 中的数据包含了两个通道的采样值,每个采样值占用16位
// 重置DMA传输完成标志
dmaTransferComplete = false;
// 启动下一次DMA传输
MAP_DMA_setChannelTransfer(0, UDMA_MODE_PINGPONG, (void *)&ADC14->MEM[0], (void *)&adcBuffer[0], BUFFER_SIZE);
}
}
void DMA_INT0_IRQHandler(void)
{
uint32_t status = MAP_DMA_getInterruptStatus();
MAP_DMA_clearInterruptFlag(status);
if (status & UDMA_CH0_MASK)
{
// DMA 传输完成
dmaTransferComplete = true;
}
}
void ADC14_IRQHandler(void)
{
uint64_t status = MAP_ADC14_getEnabledInterruptStatus();
MAP_ADC14_clearInterruptFlag(status);
if (status & ADC_INT1)
{
// 处理ADC中断
}
}
```
这段代码使用DMA来实现ADC14的双通道数据采集,并且达到了1M的采样频率。在`main`函数中,我们首先初始化系统时钟,然后配置ADC14模块和DMA。然后,我们启动DMA传输和ADC14转换,并在主循环中等待DMA传输完成。在`DMA_INT0_IRQHandler`中断处理函数中,我们处理DMA传输完成的中断,并设置`dmaTransferComplete`标志位。在`ADC14_IRQHandler`中断处理函数中,我们处理ADC14的中断。
请注意,这只是一个简单的示例代码,您可能需要根据您的具体应用进行修改和优化。另外,确保您已正确配置引脚和电源供应以支持ADC14和DMA功能。
希望这能帮助到您!如果您有任何其他问题,请随时提问。
阅读全文