• 已解决 73482 个问题
  • 已帮助 5993 位优秀工程师

MSP432的DMA乒乓模式怎么使用来连续传输ADC采集数据

40d0dae3c436b31a 2020-10-07 浏览量:3063

就是用MSP432P401R的DMA乒乓模式怎么连续传输ADC采集的数据。

下面是程序,不能实现功能,有些错误,请大神指教。


#include "u_dma.h"
#include <ti/devices/msp432p4xx/driverlib/driverlib.h>
#include "uart_calc.h"
#include "ADC.h"

#define   DAM_SIZE    8000



/@@* DMA Control Table  这一段是必须要有的*/
#if defined(__TI_COMPILER_VERSION__)
#pragma DATA_ALIGN(controlTable 1024)
#elif defined(__IAR_SYSTEMS_ICC__)
#pragma data_alignment=1024
#elif defined(__GNUC__)
__attribute__ ((aligned (1024)))
#elif defined(__CC_ARM)
__align(1024)
#endif
uint8_t controlTable[1024];



volatile int switch_data = 0;
uint32_t k=0;

uint8_t data_array1[DAM_SIZE];

extern void delay(uint16_t z);

void DMA_confing(void)
{
    MAP_WDT_A_holdTimer();       //关闭看门狗

  memset(data_array1 0x11 DAM_SIZE);     //目标数组初始化

// printf("123\n");

  GPIO_setAsOutputPin(GPIO_PORT_P1GPIO_PIN0);
  GPIO_setAsOutputPin(GPIO_PORT_P2GPIO_PIN1);
  GPIO_setOutputHighOnPin(GPIO_PORT_P1GPIO_PIN0);

  DMA_enableModule();              //使能DMA模块
  DMA_setControlbase(controlTable);      //设置控制表基地址

  DMA_disableChannelAttribute(DMA_CH7_ADC14
                                 UDMA_ATTR_ALTSELECT | UDMA_ATTR_USEBURST |
                                 UDMA_ATTR_HIGH_PRIORITY |
                                 UDMA_ATTR_REQMASK);         //禁用通道特征

  DMA_setChannelControl(UDMA_PRI_SELECT | DMA_CH7_ADC14UDMA_SIZE_16 | UDMA_SRC_INC_NONE | UDMA_DST_INC_16 | UDMA_ARB_1);
    //设置通道控制参数   ADC映射          主数据结构       8位数据大小    源地址增量        目标地址增量      传输数量
  DMA_setChannelTransfer(UDMA_PRI_SELECT | DMA_CH7_ADC14UDMA_MODE_PINGPONG (void*) &ADC14->MEM[0]data_array1 DAM_SIZE);
      //设置通道传输参数      ADC映射        主数据结构         乒乓模式        源数据                  目标数据    传输数量
  
  DMA_setChannelControl(UDMA_ALT_SELECT | DMA_CH7_ADC14UDMA_SIZE_16 | UDMA_SRC_INC_NONE | UDMA_DST_INC_16 | UDMA_ARB_1);
    //设置通道控制参数   ADC映射          主数据结构       8位数据大小    源地址增量        目标地址增量      传输数量  
    DMA_setChannelTransfer(UDMA_ALT_SELECT | DMA_CH7_ADC14UDMA_MODE_PINGPONG (void*) &ADC14->MEM[0]data_array1 DAM_SIZE);
    //设置通道传输参数      ADC映射        主数据结构         乒乓模式        源数据                  目标数据    传输数量


DMA_requestChannel(7);      //通道7请求传输
DMA_assignChannel(DMA_CH7_ADC14);    //指定外设映射

DMA_assignInterrupt(DMA_INT1 7);
    Interrupt_enableInterrupt(INT_DMA_INT1);
    DMA_clearInterruptFlag(7);
    Interrupt_enableMaster();

DMA_enableChannel(7);
    ADC14_enableConversion();


}

  
/@@***DMA传输完成中断*****/
void DMA_INT1_IRQHandler(void)
{
  GPIO_setOutputHighOnPin(GPIO_PORT_P2GPIO_PIN1);

    //GPIO_toggleOutputOnPin(GPIO_PORT_P2GPIO_PIN1);
    //delay(100);
    //GPIO_toggleOutputOnPin(GPIO_PORT_P2GPIO_PIN1);

  DMA_requestChannel(7);      //通道7请求传输
DMA_assignChannel(DMA_CH7_ADC14);    //指定外设映射

DMA_assignInterrupt(DMA_INT1 7);
    Interrupt_enableInterrupt(INT_DMA_INT1);
    DMA_clearInterruptFlag(7);
    Interrupt_enableMaster();

DMA_enableChannel(7);
    ADC14_enableConversion();

  printf("%d%d%d\n"data_array1[k++]data_array1[k++]data_array1[k++]);
    //GPIO_setOutputLowOnPin(GPIO_PORT_P2GPIO_PIN1);
    /@@* Switch between primary and alternate bufferes with DMA's PingPong mode */

    if (DMA_getChannelAttribute(7) & UDMA_ATTR_ALTSELECT)
    {
        DMA_setChannelControl(UDMA_PRI_SELECT | DMA_CH7_ADC14
            UDMA_SIZE_16 | UDMA_SRC_INC_NONE | UDMA_DST_INC_16 | UDMA_ARB_1);
        DMA_setChannelTransfer(UDMA_PRI_SELECT | DMA_CH7_ADC14
            UDMA_MODE_PINGPONG (void*) &ADC14->MEM[0]
            data_array1 DAM_SIZE);
        switch_data = 1;
printf("%d%d%d\n"data_array1[k++]data_array1[k++]data_array1[k++]);
DMA_requestSoftwareTransfer(0);
    }
    else
    {
        DMA_setChannelControl(UDMA_ALT_SELECT | DMA_CH7_ADC14
            UDMA_SIZE_16 | UDMA_SRC_INC_NONE | UDMA_DST_INC_16 | UDMA_ARB_1);
        DMA_setChannelTransfer(UDMA_ALT_SELECT | DMA_CH7_ADC14
            UDMA_MODE_PINGPONG (void*) &ADC14->MEM[0]
            data_array1 DAM_SIZE);
        switch_data = 0;
printf("%d%d%d\n"data_array1[k++]data_array1[k++]data_array1[k++]);
DMA_requestSoftwareTransfer(0);
    }

}


0 0 收起

我来回答

上传资料:
选择文件 文件大小不超过15M(格式支持:doc、ppt、xls、pdf、zip、rar、txt)
最佳答案
  • 这个主要是DMA可以自动触发的功能,要设置好DMA结束时的下一个通道的参数,
    • 发布于 2020-10-10
    • 举报
    • 评论 0
    • 0
    • 0

其他答案 数量:0

相关问题

问题达人换一批

MSP432的DMA乒乓模式怎么使用来连续传输ADC采集数据