打印

【转】MSP432 DMA pingpong模式

[复制链接]
1126|18
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
android2|  楼主 | 2017-7-22 17:53 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

这个是官方的pingpong模式 可是一直没有调通  如果有会的  可以帮忙弄一下吗  谢谢  
问题就是  每次在在我停止运行程序之后,再次运行程序两个数组的数据就不再改变

我想知道  我究竟应该怎么做这件事情  谢谢 才能用MSP432pingpong模式实现pingpong缓存


#include "driverlib.h"

/* Standard Includes */
#include <stdint.h>
#include <stdbool.h>





#define TEST_LENGTH_SAMPLES 512
#define SAMPLE_LENGTH 512

/* ------------------------------------------------------------------
* Global variables for FFT Bin Example
* ------------------------------------------------------------------- */
uint32_t fftSize = SAMPLE_LENGTH;
uint32_t ifftFlag = 0;
uint32_t doBitReverse = 1;


#define SMCLK_FREQUENCY     48000000
#define SAMPLE_FREQUENCY    8000


/* DMA Control Table */
#ifdef ewarm
#pragma data_alignment=256
#else
#pragma DATA_ALIGN(controlTable, 256)
#endif
uint8_t controlTable[256];


/* FFT data/processing buffers*/
float hann[SAMPLE_LENGTH];
int16_t data_array1[SAMPLE_LENGTH];
int16_t data_array2[SAMPLE_LENGTH];
int16_t data_array3[SAMPLE_LENGTH];
int16_t data_array4[SAMPLE_LENGTH];

volatile int switch_data = 0;

uint32_t color = 0;

/* Timer_A PWM Configuration Parameter */
Timer_A_PWMConfig pwmConfig =
{
        TIMER_A_CLOCKSOURCE_SMCLK,
        TIMER_A_CLOCKSOURCE_DIVIDER_1,
        (SMCLK_FREQUENCY/SAMPLE_FREQUENCY),
        TIMER_A_CAPTURECOMPARE_REGISTER_1,
        TIMER_A_OUTPUTMODE_SET_RESET,
        (SMCLK_FREQUENCY/SAMPLE_FREQUENCY)/2
};

void main(void)
{
    /* Halting WDT and disabling master interrupts */
    MAP_WDT_A_holdTimer();
    MAP_Interrupt_disableMaster();
    switch_data = 0;
    /* Set the core voltage level to VCORE1 */
    MAP_PCM_setCoreVoltageLevel(PCM_VCORE1);

    /* Set 2 flash wait states for Flash bank 0 and 1*/
    MAP_FlashCtl_setWaitState(FLASH_BANK0, 2);
    MAP_FlashCtl_setWaitState(FLASH_BANK1, 2);

    /* Initializes Clock System */
    MAP_CS_setDCOCenteredFrequency(CS_DCO_FREQUENCY_48);
    MAP_CS_initClockSignal(CS_MCLK, CS_DCOCLK_SELECT, CS_CLOCK_DIVIDER_1 );
    MAP_CS_initClockSignal(CS_HSMCLK, CS_DCOCLK_SELECT, CS_CLOCK_DIVIDER_1 );
    MAP_CS_initClockSignal(CS_SMCLK, CS_DCOCLK_SELECT, CS_CLOCK_DIVIDER_1 );
    MAP_CS_initClockSignal(CS_ACLK, CS_REFOCLK_SELECT, CS_CLOCK_DIVIDER_1);



    /* Configuring Timer_A to have a period of approximately 500ms and
     * an initial duty cycle of 10% of that (3200 ticks)  */
    Timer_A_generatePWM(TIMER_A0_BASE, &pwmConfig);

    /* Initializing ADC (MCLK/1/1) */
    ADC14_enableModule();
    ADC14_initModule(ADC_CLOCKSOURCE_MCLK, ADC_PREDIVIDER_1, ADC_DIVIDER_1, 0);

    ADC14_setSampleHoldTrigger(ADC_TRIGGER_SOURCE1, false);

    /* Configuring GPIOs (4.3 A10) */
    GPIO_setAsPeripheralModuleFunctionInputPin(GPIO_PORT_P4, GPIO_PIN3,
    GPIO_TERTIARY_MODULE_FUNCTION);

    /* Configuring ADC Memory */
    ADC14_configureSingleSampleMode(ADC_MEM0, true);
    ADC14_configureConversionMemory(ADC_MEM0, ADC_VREFPOS_AVCC_VREFNEG_VSS,
    ADC_INPUT_A10, false);

    /* Set ADC result format to signed binary */
    ADC14_setResultFormat(ADC_UNSIGNED_BINARY);

    /* Configuring DMA module */
    DMA_enableModule();
    DMA_setControlBase(controlTable);


    DMA_disableChannelAttribute(DMA_CH7_ADC14,
                                 UDMA_ATTR_ALTSELECT | UDMA_ATTR_USEBURST |
                                 UDMA_ATTR_HIGH_PRIORITY |
                                 UDMA_ATTR_REQMASK);


    /* Setting Control Indexes. In this case we will set the source of the
     * DMA transfer to ADC14 Memory 0
     *  and the destination to the
     * destination data array. */
    MAP_DMA_setChannelControl(UDMA_PRI_SELECT | DMA_CH7_ADC14,
        UDMA_SIZE_16 | UDMA_SRC_INC_NONE | UDMA_DST_INC_16 | UDMA_ARB_1);
    MAP_DMA_setChannelTransfer(UDMA_PRI_SELECT | DMA_CH7_ADC14,
        UDMA_MODE_PINGPONG, (void*) &ADC14->MEM[0],
        data_array1, SAMPLE_LENGTH);

    MAP_DMA_setChannelControl(UDMA_ALT_SELECT | DMA_CH7_ADC14,
        UDMA_SIZE_16 | UDMA_SRC_INC_NONE | UDMA_DST_INC_16 | UDMA_ARB_1);
    MAP_DMA_setChannelTransfer(UDMA_ALT_SELECT | DMA_CH7_ADC14,
        UDMA_MODE_PINGPONG, (void*) &ADC14->MEM[0],
        data_array2, SAMPLE_LENGTH);

    /* Assigning/Enabling Interrupts */
    MAP_DMA_assignInterrupt(DMA_INT1, 7);
    MAP_Interrupt_enableInterrupt(INT_DMA_INT1);
    MAP_DMA_assignChannel(DMA_CH7_ADC14);
    MAP_DMA_clearInterruptFlag(7);
    MAP_Interrupt_enableMaster();

    /* Now that the DMA is primed and setup, enabling the channels. The ADC14
     * hardware should take over and transfer/receive all bytes */
    MAP_DMA_enableChannel(7);
    MAP_ADC14_enableConversion();

    while(1)
    {
        MAP_PCM_gotoLPM0();
        __delay_cycles(200000);
    }
}


/* Completion interrupt for ADC14 MEM0 */
void DMA_INT1_IRQHandler(void)
{
    /* 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, SAMPLE_LENGTH);
        switch_data = 1;
    }
    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_array2, SAMPLE_LENGTH);
        switch_data = 0;
    }
}

相关帖子

沙发
quickman| | 2017-7-24 21:28 | 只看该作者
板凳
jstgotodo| | 2017-7-24 21:29 | 只看该作者
每次进入DMA 接收中断,ping buffer 里的数据会更新?

使用特权

评论回复
地板
iamaiqiyi| | 2017-7-24 21:34 | 只看该作者
MA的 目的地址有没有变化

使用特权

评论回复
5
dzfansman| | 2017-7-24 21:34 | 只看该作者
ping-pong模式的地址自增是ping、pong各算各的?

使用特权

评论回复
6
sanxingnote7| | 2017-7-24 21:35 | 只看该作者
通过pingpong操作可以提高数据传输的效率,但是用不好数据就分散了。

使用特权

评论回复
7
backlugin| | 2017-7-24 21:36 | 只看该作者
数据地址没有修改吧。

使用特权

评论回复
8
sdCAD| | 2017-7-24 21:37 | 只看该作者
这个地址配置修改在哪?

使用特权

评论回复
9
fengm| | 2017-7-24 21:37 | 只看该作者
这个可以通过双数组实现。

使用特权

评论回复
10
sanfuzi| | 2017-7-24 21:37 | 只看该作者
数字地址是否在增加?

使用特权

评论回复
11
quickman| | 2017-7-24 21:38 | 只看该作者
设置两个大小一样的ping buffer, pong buffer

使用特权

评论回复
12
jstgotodo| | 2017-7-24 21:38 | 只看该作者
当PingPong=Pong时,看一下DMA的目的地址是改成了PONG buffer首地址吗?

使用特权

评论回复
13
iamaiqiyi| | 2017-7-24 21:38 | 只看该作者
DMA的目的地址并没有配置成功。

使用特权

评论回复
14
dzfansman| | 2017-7-24 21:38 | 只看该作者
乒乓模式的地址增是各算各的

使用特权

评论回复
15
sanxingnote7| | 2017-7-24 21:38 | 只看该作者
两个数组地址修改了吗

使用特权

评论回复
16
backlugin| | 2017-7-24 21:38 | 只看该作者
DMA每次完整之后是要修改地址的。

使用特权

评论回复
17
sdCAD| | 2017-7-24 21:38 | 只看该作者
数据长度判断呢?

使用特权

评论回复
18
fengm| | 2017-7-24 21:38 | 只看该作者
MSP432 DMA没有修改过数组地址。

使用特权

评论回复
19
sanfuzi| | 2017-7-24 21:38 | 只看该作者
是否配置了不同的ping pong的地址?

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

137

主题

784

帖子

0

粉丝