This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

TM4C123 DMA没有数据(DMA为外部中断触发)

代码

uint8_t ControlTable[1024];
void dma_init(void)
{
{
/* 数据线 */
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOB);
GPIODirModeSet(GPIO_PORTB_BASE, GPIO_PIN_0, GPIO_DIR_MODE_IN);
GPIOPadConfigSet(GPIO_PORTB_BASE, GPIO_PIN_0, GPIO_STRENGTH_2MA, GPIO_PIN_TYPE_STD_WPD);
delayUs(5);
GPIODirModeSet(GPIO_PORTB_BASE, GPIO_PIN_1, GPIO_DIR_MODE_IN);
GPIOPadConfigSet(GPIO_PORTB_BASE, GPIO_PIN_1, GPIO_STRENGTH_2MA, GPIO_PIN_TYPE_STD_WPD);
delayUs(5);
GPIODirModeSet(GPIO_PORTB_BASE, GPIO_PIN_2, GPIO_DIR_MODE_IN);
GPIOPadConfigSet(GPIO_PORTB_BASE, GPIO_PIN_2, GPIO_STRENGTH_2MA, GPIO_PIN_TYPE_STD_WPD);
delayUs(5);
GPIODirModeSet(GPIO_PORTB_BASE, GPIO_PIN_3, GPIO_DIR_MODE_IN);
GPIOPadConfigSet(GPIO_PORTB_BASE, GPIO_PIN_3, GPIO_STRENGTH_2MA, GPIO_PIN_TYPE_STD_WPD);
delayUs(5);
GPIODirModeSet(GPIO_PORTB_BASE, GPIO_PIN_4, GPIO_DIR_MODE_IN);
GPIOPadConfigSet(GPIO_PORTB_BASE, GPIO_PIN_4, GPIO_STRENGTH_2MA, GPIO_PIN_TYPE_STD_WPD);
delayUs(5);
GPIODirModeSet(GPIO_PORTB_BASE, GPIO_PIN_5, GPIO_DIR_MODE_IN);
GPIOPadConfigSet(GPIO_PORTB_BASE, GPIO_PIN_5, GPIO_STRENGTH_2MA, GPIO_PIN_TYPE_STD_WPD);
delayUs(5);
GPIODirModeSet(GPIO_PORTB_BASE, GPIO_PIN_6, GPIO_DIR_MODE_IN);
GPIOPadConfigSet(GPIO_PORTB_BASE, GPIO_PIN_6, GPIO_STRENGTH_2MA, GPIO_PIN_TYPE_STD_WPD);
delayUs(5);
GPIODirModeSet(GPIO_PORTB_BASE, GPIO_PIN_7, GPIO_DIR_MODE_IN);
GPIOPadConfigSet(GPIO_PORTB_BASE, GPIO_PIN_7, GPIO_STRENGTH_2MA, GPIO_PIN_TYPE_STD_WPD);
delayUs(5);
}

SysCtlPeripheralEnable(SYSCTL_PERIPH_UDMA);
uDMAEnable();
uDMAControlBaseSet(ControlTable);
IntEnable(INT_UDMA);
uDMAChannelAssign(UDMA_CH15_GPIOF);

uDMAChannelControlSet(UDMA_CHANNEL_ADC1 | UDMA_PRI_SELECT,
UDMA_SIZE_8| UDMA_SRC_INC_NONE| UDMA_DST_INC_8 |UDMA_ARB_8);

uDMAChannelAttributeDisable(UDMA_CHANNEL_ADC1,
UDMA_ATTR_USEBURST | UDMA_ATTR_ALTSELECT |
(UDMA_ATTR_HIGH_PRIORITY |
UDMA_ATTR_REQMASK));
//uDMAChannelAttributeEnable(UDMA_CHANNEL_ADC1,UDMA_ATTR_HIGH_PRIORITY);
uDMAChannelTransferSet(UDMA_CHANNEL_ADC1 | UDMA_PRI_SELECT,
UDMA_MODE_BASIC ,
(void *)(GPIO_PORTB_BASE+GPIO_O_DATA),
image, OV7725_SIZE);
}

/* PF4 */
void vGPIO_PortFIntHandler(void)
{
flag=1;
uint32_t ui32Mode;
uint32_t ui32Status;
ui32Status = GPIOIntStatus(GPIO_PORTF_BASE, true);
GPIOIntClear(GPIO_PORTF_BASE,ui32Status);
ui32Mode = uDMAChannelModeGet(UDMA_CHANNEL_ADC1|UDMA_PRI_SELECT);

if(ui32Mode == UDMA_MODE_STOP)
{
g_ui32MemXferCount++;
if(g_ui32MemXferCount>5000) g_ui32MemXferCount=0;
uDMAChannelTransferSet(UDMA_CHANNEL_ADC1|UDMA_PRI_SELECT, UDMA_MODE_BASIC,
(void *)( GPIO_PORTE_BASE+GPIO_O_DATA),
image, OV7725_SIZE);
uDMAChannelEnable(UDMA_CHANNEL_ADC1);
}
if(!uDMAChannelIsEnabled(UDMA_CHANNEL_ADC1))
{
uDMAChannelTransferSet(UDMA_CHANNEL_ADC1|UDMA_PRI_SELECT, UDMA_MODE_BASIC,
(void *)(GPIO_PORTB_BASE+GPIO_O_DATA ), image, OV7725_SIZE);//
uDMAChannelEnable(UDMA_CHANNEL_ADC1);
}
}

  • 请问您现在使用的是TI的开发板还是您自己的板子?您现在是想用GPIO中断触发DMA?

    那您是否有使用GPIODMATriggerEnable?

    http://www.gianlucafiori.org/wp-content/uploads/2016/03/Tiva_C_driverlib.pdf

  • 用的是ti官方的板子,我加了那个函数。

  • 我在您的代码内没有看到。能否给出完整代码?

    另外您是否有在线调试过您的程序?DMA能否被GPIO中断触发?您所说的“DMA没有数据”具体表现是怎样的?
  • //外部中断部分
    extern uint8_t image[OV7725_SIZE];
    extern int32_t flag;
    extern uint32_t g_ui32MemXferCount;

    /* PF4 */
    void vGPIO_PortFIntHandler(void)
    {
    flag++;
    uint32_t ui32Mode;
    uint32_t ui32Status;
    ui32Status = GPIOIntStatus(GPIO_PORTF_BASE, true);
    GPIOIntClear(GPIO_PORTF_BASE,ui32Status);
    ui32Mode = uDMAChannelModeGet(UDMA_CHANNEL_ADC1|UDMA_PRI_SELECT);

    if(ui32Mode == UDMA_MODE_STOP)
    {
    g_ui32MemXferCount++;
    if(g_ui32MemXferCount>5000) g_ui32MemXferCount=0;
    uDMAChannelTransferSet(UDMA_CHANNEL_ADC1|UDMA_PRI_SELECT, UDMA_MODE_BASIC,
    (void *)( GPIO_PORTE_BASE+GPIO_O_DATA),
    image, OV7725_SIZE);
    uDMAChannelEnable(UDMA_CHANNEL_ADC1);
    }
    if(!uDMAChannelIsEnabled(UDMA_CHANNEL_ADC1))
    {
    uDMAChannelTransferSet(UDMA_CHANNEL_ADC1|UDMA_PRI_SELECT, UDMA_MODE_BASIC,
    (void *)(GPIO_PORTB_BASE+GPIO_O_DATA ), image, OV7725_SIZE);//
    uDMAChannelEnable(UDMA_CHANNEL_ADC1);
    }
    }

    void exit_init(void)
    {
    SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOF);
    GPIODMATriggerEnable(GPIO_PORTF_BASE,GPIO_PIN_4);
    GPIODirModeSet(GPIO_PORTF_BASE, GPIO_PIN_4, GPIO_DIR_MODE_IN);
    GPIOPadConfigSet(GPIO_PORTF_BASE, GPIO_PIN_4, GPIO_STRENGTH_2MA, GPIO_PIN_TYPE_STD_WPD);
    GPIOIntRegister(GPIO_PORTF_BASE, vGPIO_PortFIntHandler);
    GPIOIntTypeSet(GPIO_PORTF_BASE, GPIO_PIN_4, GPIO_RISING_EDGE);
    GPIOIntEnable(GPIO_PORTF_BASE, GPIO_INT_PIN_4);
    IntEnable(INT_GPIOF);
    IntPrioritySet(INT_GPIOF, 0);

    GPIOIntClear(GPIO_PORTF_BASE, GPIO_INT_PIN_4);
    }
    //DMA
    void dma_init(void)
    {
    {
    /* 数据线 */
    SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOB);
    GPIODirModeSet(GPIO_PORTB_BASE, GPIO_PIN_0, GPIO_DIR_MODE_IN);
    GPIOPadConfigSet(GPIO_PORTB_BASE, GPIO_PIN_0, GPIO_STRENGTH_2MA, GPIO_PIN_TYPE_STD_WPD);
    delayUs(5);
    GPIODirModeSet(GPIO_PORTB_BASE, GPIO_PIN_1, GPIO_DIR_MODE_IN);
    GPIOPadConfigSet(GPIO_PORTB_BASE, GPIO_PIN_1, GPIO_STRENGTH_2MA, GPIO_PIN_TYPE_STD_WPD);
    delayUs(5);
    GPIODirModeSet(GPIO_PORTB_BASE, GPIO_PIN_2, GPIO_DIR_MODE_IN);
    GPIOPadConfigSet(GPIO_PORTB_BASE, GPIO_PIN_2, GPIO_STRENGTH_2MA, GPIO_PIN_TYPE_STD_WPD);
    delayUs(5);
    GPIODirModeSet(GPIO_PORTB_BASE, GPIO_PIN_3, GPIO_DIR_MODE_IN);
    GPIOPadConfigSet(GPIO_PORTB_BASE, GPIO_PIN_3, GPIO_STRENGTH_2MA, GPIO_PIN_TYPE_STD_WPD);
    delayUs(5);
    GPIODirModeSet(GPIO_PORTB_BASE, GPIO_PIN_4, GPIO_DIR_MODE_IN);
    GPIOPadConfigSet(GPIO_PORTB_BASE, GPIO_PIN_4, GPIO_STRENGTH_2MA, GPIO_PIN_TYPE_STD_WPD);
    delayUs(5);
    GPIODirModeSet(GPIO_PORTB_BASE, GPIO_PIN_5, GPIO_DIR_MODE_IN);
    GPIOPadConfigSet(GPIO_PORTB_BASE, GPIO_PIN_5, GPIO_STRENGTH_2MA, GPIO_PIN_TYPE_STD_WPD);
    delayUs(5);
    GPIODirModeSet(GPIO_PORTB_BASE, GPIO_PIN_6, GPIO_DIR_MODE_IN);
    GPIOPadConfigSet(GPIO_PORTB_BASE, GPIO_PIN_6, GPIO_STRENGTH_2MA, GPIO_PIN_TYPE_STD_WPD);
    delayUs(5);
    GPIODirModeSet(GPIO_PORTB_BASE, GPIO_PIN_7, GPIO_DIR_MODE_IN);
    GPIOPadConfigSet(GPIO_PORTB_BASE, GPIO_PIN_7, GPIO_STRENGTH_2MA, GPIO_PIN_TYPE_STD_WPD);
    delayUs(5);
    }

    SysCtlPeripheralEnable(SYSCTL_PERIPH_UDMA);
    uDMAEnable();
    uDMAControlBaseSet(ControlTable);
    IntEnable(INT_UDMA);
    uDMAChannelAssign(UDMA_CH15_GPIOF);

    uDMAChannelControlSet(UDMA_CHANNEL_ADC1 | UDMA_PRI_SELECT,
    UDMA_SIZE_8| UDMA_SRC_INC_NONE| UDMA_DST_INC_8 |UDMA_ARB_8);

    uDMAChannelAttributeDisable(UDMA_CHANNEL_ADC1,
    UDMA_ATTR_USEBURST | UDMA_ATTR_ALTSELECT |
    (UDMA_ATTR_HIGH_PRIORITY |
    UDMA_ATTR_REQMASK));
    //uDMAChannelAttributeEnable(UDMA_CHANNEL_ADC1,UDMA_ATTR_HIGH_PRIORITY);
    uDMAChannelTransferSet(UDMA_CHANNEL_ADC1 | UDMA_PRI_SELECT,
    UDMA_MODE_BASIC ,
    (void *)(GPIO_PORTB_BASE+GPIO_O_DATA),
    image, OV7725_SIZE);
    }