找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2935|回复: 2
收起左侧

MSP432的DMA乒乓模式怎么传输ADC采集的数据

[复制链接]
ID:462718 发表于 2020-10-7 15:40 | 显示全部楼层 |阅读模式
MSP432的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_P1,GPIO_PIN0);
          GPIO_setAsOutputPin(GPIO_PORT_P2,GPIO_PIN1);
          GPIO_setOutputHighOnPin(GPIO_PORT_P1,GPIO_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_ADC14,UDMA_SIZE_16 | UDMA_SRC_INC_NONE | UDMA_DST_INC_16 | UDMA_ARB_1);
            //设置通道控制参数   ADC映射          主数据结构       8位数据大小    源地址增量        目标地址增量      传输数量
          DMA_setChannelTransfer(UDMA_PRI_SELECT | DMA_CH7_ADC14,UDMA_MODE_PINGPONG, (void*) &ADC14->MEM[0],data_array1, DAM_SIZE);       
      //设置通道传输参数             ADC映射        主数据结构         乒乓模式        源数据                  目标数据    传输数量       
          
          DMA_setChannelControl(UDMA_ALT_SELECT | DMA_CH7_ADC14,UDMA_SIZE_16 | UDMA_SRC_INC_NONE | UDMA_DST_INC_16 | UDMA_ARB_1);
            //设置通道控制参数   ADC映射          主数据结构       8位数据大小    源地址增量        目标地址增量      传输数量  
    DMA_setChannelTransfer(UDMA_ALT_SELECT | DMA_CH7_ADC14,UDMA_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_P2,GPIO_PIN1);
       
            //GPIO_toggleOutputOnPin(GPIO_PORT_P2,GPIO_PIN1);
            //delay(100);
            //GPIO_toggleOutputOnPin(GPIO_PORT_P2,GPIO_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_P2,GPIO_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);
    }
       
}


回复

使用道具 举报

ID:621707 发表于 2020-10-9 21:01 | 显示全部楼层
想请教一下楼主msp432的延时函数怎么编写比较好
回复

使用道具 举报

ID:1088516 发表于 2023-7-14 20:14 | 显示全部楼层
可以在while(1)中加入“DMA_requestSoftwareTransfer(7);”让其一直被开启运行转化;
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表