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);
}
}
|