MAP_DMA_setControlBase(MSP_EXP432P401RLP_DMAControlTable)中MSP_EXP432P401RLP_DMAControlTable具体定义
时间: 2023-08-04 13:09:47 浏览: 146
MSP_EXP432P401RLP_DMAControlTable是一个宏,用于定义DMA控制表的起始地址。在MSP432P401R LaunchPad开发板的驱动代码中,该宏定义在"msp432p401r.h"文件中。
具体的定义如下:
#define MSP_EXP432P401RLP_DMAControlTable ((void *)0x20004c00)
该宏将DMA控制表的起始地址设置为0x20004c00,其中0x20004c00是该开发板中的RAM地址。通过该宏定义,可以方便地操作DMA控制表并配置DMA传输。
相关问题
msp432p401r adc+dma例程
下面是一个基于MSP432P401R微控制器的ADC和DMA的例程,用于将ADC采样的数据传输到内存中:
```c
#include <ti/devices/msp432p4xx/driverlib/driverlib.h>
#define NUM_SAMPLES 100
uint16_t adcData[NUM_SAMPLES];
int main(void)
{
// 初始化系统时钟和外设
MAP_WDT_A_holdTimer();
MAP_Interrupt_disableMaster();
// 配置ADC
MAP_GPIO_setAsPeripheralModuleFunctionInputPin(GPIO_PORT_P5, GPIO_PIN4, GPIO_TERTIARY_MODULE_FUNCTION);
MAP_ADC14_enableModule();
MAP_ADC14_initModule(ADC_CLOCKSOURCE_SMCLK, ADC_PREDIVIDER_1, ADC_DIVIDER_1, 0);
MAP_ADC14_configureSingleSampleMode(ADC_MEM0, true);
MAP_ADC14_setResolution(ADC_14BIT);
MAP_ADC14_setSampleHoldTime(ADC_PULSE_WIDTH_4, ADC_PULSE_WIDTH_4);
MAP_ADC14_enableSampleTimer(ADC_MANUAL_ITERATION);
// 配置DMA
MAP_DMA_enableModule();
MAP_DMA_setControlBase(MSP_EXP432P401RLP_DMAControlTable);
MAP_DMA_enableChannel(0);
MAP_DMA_setChannelControl(UDMA_PRI_SELECT | DMA_CH0_ADC14,
UDMA_SIZE_16 | UDMA_SRC_INC_NONE | UDMA_DST_INC_16 | UDMA_ARB_1024);
MAP_DMA_setChannelTransfer(UDMA_PRI_SELECT | DMA_CH0_ADC14,
UDMA_MODE_PINGPONG, (void*)&ADC14->MEM[0], adcData, NUM_SAMPLES);
// 启动DMA传输
MAP_DMA_enableChannel(0);
// 启动ADC采样
MAP_ADC14_enableConversion();
MAP_ADC14_toggleConversionTrigger();
// 等待DMA传输完成
while (MAP_DMA_getChannelStatus(DMA_CH0_ADC14) != UDMA_TRNMODE_STOP)
{
}
// 停止ADC和DMA
MAP_ADC14_disableConversion();
MAP_DMA_disableChannel(0);
MAP_DMA_disableModule();
// 在这里可以使用adcData数组中的数据
while (1)
{
// 主循环
}
}
```
这个例程配置了ADC14模块以采样P5.4引脚的模拟信号,并使用DMA将采样数据传输到名为adcData的数组中。你可以在代码的注释部分后续添加适合你的应用程序的代码。
请注意,在使用此示例代码之前,你应该确保已经安装了MSP432P4xx驱动库,并将其包含在项目中。此外,还要根据你的硬件连接和需求进行适当的修改。
msp432p401r用官方的driverlib库实现DMA+ADC14的双通道采集1M采样频率
要实现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功能。
希望这能帮助到您!如果您有任何其他问题,请随时提问。
阅读全文
相关推荐









