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.

TM4C123GH6PM 使用DMA获取GPIO数据问题

用GPIO中断启动DMA获取GPIO数据

下面是代码

uint8_t pui8ControlTable[1024];
uint8_t g_ui32DstBuf=0x33;
//uint32_t g_ui32MemXferCount = 0;
//uint32_t g_ui32BadISR = 0;
void initEagleGPIO(void)
{
    SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOD);
    //PD解锁
    HWREG(GPIO_PORTD_BASE + GPIO_O_LOCK) = GPIO_LOCK_KEY;
    HWREG(GPIO_PORTD_BASE + GPIO_O_CR) |= 0x01;
    HWREG(GPIO_PORTD_BASE + GPIO_O_LOCK) = 0;

    GPIOPinTypeGPIOInput(GPIO_PORTD_BASE,GPIO_PIN_0);
    GPIOPadConfigSet(GPIO_PORTD_BASE,GPIO_PIN_0,GPIO_STRENGTH_2MA, GPIO_PIN_TYPE_STD_WPU);//配置D为上拉电阻 输出电流能力2mA
    GPIOPinTypeGPIOInput(GPIO_PORTD_BASE,GPIO_PIN_1);
    GPIOPadConfigSet(GPIO_PORTD_BASE,GPIO_PIN_1,GPIO_STRENGTH_2MA, GPIO_PIN_TYPE_STD_WPU);//配置D为上拉电阻 输出电流能力2mA
	    GPIOPinTypeGPIOInput(GPIO_PORTD_BASE,GPIO_PIN_2);
    GPIOPadConfigSet(GPIO_PORTD_BASE,GPIO_PIN_2,GPIO_STRENGTH_2MA, GPIO_PIN_TYPE_STD_WPU);//配置D为上拉电阻 输出电流能力2mA
	    GPIOPinTypeGPIOInput(GPIO_PORTD_BASE,GPIO_PIN_3);
    GPIOPadConfigSet(GPIO_PORTD_BASE,GPIO_PIN_3,GPIO_STRENGTH_2MA, GPIO_PIN_TYPE_STD_WPU);//配置D为上拉电阻 输出电流能力2mA
	    GPIOPinTypeGPIOInput(GPIO_PORTD_BASE,GPIO_PIN_4);
    GPIOPadConfigSet(GPIO_PORTD_BASE,GPIO_PIN_4,GPIO_STRENGTH_2MA, GPIO_PIN_TYPE_STD_WPU);//配置D为上拉电阻 输出电流能力2mA
	    GPIOPinTypeGPIOInput(GPIO_PORTD_BASE,GPIO_PIN_5);
    GPIOPadConfigSet(GPIO_PORTD_BASE,GPIO_PIN_5,GPIO_STRENGTH_2MA, GPIO_PIN_TYPE_STD_WPU);//配置D为上拉电阻 输出电流能力2mA
	    GPIOPinTypeGPIOInput(GPIO_PORTD_BASE,GPIO_PIN_6);
    GPIOPadConfigSet(GPIO_PORTD_BASE,GPIO_PIN_6,GPIO_STRENGTH_2MA, GPIO_PIN_TYPE_STD_WPU);//配置D为上拉电阻 输出电流能力2mA
	    GPIOPinTypeGPIOInput(GPIO_PORTD_BASE,GPIO_PIN_7);
    GPIOPadConfigSet(GPIO_PORTD_BASE,GPIO_PIN_7,GPIO_STRENGTH_2MA, GPIO_PIN_TYPE_STD_WPU);//配置D为上拉电阻 输出电流能力2mA
	

    SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOE);
    //PE解锁
    HWREG(GPIO_PORTE_BASE + GPIO_O_LOCK) = GPIO_LOCK_KEY;
    HWREG(GPIO_PORTE_BASE + GPIO_O_CR) |= 0x01;
    HWREG(GPIO_PORTE_BASE + GPIO_O_LOCK) = 0;

    GPIOPinTypeGPIOInput(GPIO_PORTE_BASE, GPIO_PIN_2);
    GPIOIntTypeSet(GPIO_PORTE_BASE,GPIO_PIN_2,GPIO_RISING_EDGE);	//设置PE2中断类型
    GPIOPadConfigSet(GPIO_PORTE_BASE,GPIO_PIN_2,GPIO_STRENGTH_2MA, GPIO_PIN_TYPE_STD_WPU);//配置F0为上拉电阻 输出电流能力2mA
    GPIOIntEnable(GPIO_PORTE_BASE,GPIO_PIN_2);	    //使能PE2中断
    GPIOIntRegister(GPIO_PORTE_BASE,VSYNCIntHandler);  //为PE2注册一个中断处理句柄




    SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA);
    //PA解锁
    HWREG(GPIO_PORTA_BASE + GPIO_O_LOCK) = GPIO_LOCK_KEY;
    HWREG(GPIO_PORTA_BASE + GPIO_O_CR) |= 0x01;
    HWREG(GPIO_PORTA_BASE + GPIO_O_LOCK) = 0;

    GPIOPinTypeGPIOInput(GPIO_PORTA_BASE, GPIO_PIN_6);
    GPIOIntTypeSet(GPIO_PORTA_BASE,GPIO_PIN_6,GPIO_FALLING_EDGE);	//设置PE3中断类型
    GPIOPadConfigSet(GPIO_PORTA_BASE,GPIO_PIN_6,GPIO_STRENGTH_2MA, GPIO_PIN_TYPE_STD_WPU);//配置F0为上拉电阻 输出电流能力2mA
    GPIOIntEnable(GPIO_PORTA_BASE,GPIO_PIN_6);	    //使能PE3中断
    GPIOIntRegister(GPIO_PORTA_BASE, PCLKIntHandler);      //GPIO注册中断--PCLKIntHandler
    //GPIODMATriggerEnable(GPIO_PORTA_BASE,GPIO_PIN_6);       //设置PF0为DMA触发源
    //uDMAIntRegister(UDMA_CHANNEL_ETH0TX,PCLKIntHandler);


    SysCtlPeripheralEnable(SYSCTL_PERIPH_UDMA);

    uDMAEnable();

    //IntEnable(INT_UDMAERR);
    //IntEnable(INT_UDMA);

    uDMAControlBaseSet(&pui8ControlTable[0]);

    uDMAChannelAssign(UDMA_CH7_GPIOD);
    //UDMA_CHANNEL_ETH0TX  7
    uDMAChannelAttributeDisable(UDMA_CHANNEL_ETH0TX,UDMA_ATTR_ALL);



    //uDMAChannelControlSet(uint32_t ui32ChannelStructIndex,uint32_t ui32Control)
    //设置uDMA通道控制结构的控制参数。这些参数是通常不会经常改变。
    //ui32Control是几个控制值的逻辑或,用于设置通道的控制参数。
    uDMAChannelControlSet(UDMA_CHANNEL_ETH0TX | UDMA_PRI_SELECT,	            //UDMA_CHANNEL_ETH0TX | UDMA_PRI_SELECT
                          //许多通道参数逻辑或UDMA_PRI_SELECT  UDMA_ALT_SELECT
                          //选择主要或备用控制结构。
                          //对于基本和自动传输模式,只有主控制结构需要。
                          //只有Pingpong的复杂传输模式才需要备用控制结构。
                          UDMA_SIZE_8 | UDMA_SRC_INC_NONE | UDMA_DST_INC_8 | UDMA_ARB_8);
    //ui32Control参数是五个值的逻辑或:
    //1数据大小,2源地址增量,3目标地址增量,4仲裁大小 ,5使用突发标志。


    uDMAChannelTransferSet(UDMA_CHANNEL_ETH0TX | UDMA_PRI_SELECT,
                           UDMA_MODE_BASIC,  (void *)(GPIO_PORTD_BASE+GPIO_O_DATA), &g_ui32DstBuf,
                           sizeof(g_ui32DstBuf));

    // Now the software channel is primed to start a transfer.  The channel
    // must be enabled.  For software based transfers, a request must be
    // issued.  After this, the uDMA memory transfer begins.
    uDMAChannelEnable(UDMA_CHANNEL_ETH0TX);
    //uDMAChannelRequest(UDMA_CHANNEL_ETH0TX);

}


void VSYNCIntHandler(void)
{
    GPIOIntClear(GPIO_PORTE_BASE,GPIO_INT_PIN_2);
    //UARTCharPut(UART0_BASE,0xaa);

}
void PCLKIntHandler(void)
{
    //uDMAIntClear(UDMA_CHANNEL_ETH0TX);
    GPIOIntClear(GPIO_PORTA_BASE,GPIO_INT_PIN_6);

    g_ui32DstBuf=0x33;
    UARTCharPut(UART0_BASE,g_ui32DstBuf);

    uDMAChannelTransferSet(UDMA_CHANNEL_ETH0TX | UDMA_PRI_SELECT,
                           UDMA_MODE_BASIC,  (void *)(GPIO_PORTD_BASE+GPIO_O_DATA), &g_ui32DstBuf,
                           sizeof(g_ui32DstBuf));
    uDMAChannelEnable(UDMA_CHANNEL_ETH0TX);

    uDMAChannelRequest(UDMA_CHANNEL_ETH0TX);

    UARTCharPut(UART0_BASE,g_ui32DstBuf);
    UARTCharPut(UART0_BASE,HWREGB(GPIO_PORTD_BASE+GPIO_O_DATA));
    UARTCharPut(UART0_BASE,g_ui32DstBuf);
    UARTCharPut(UART0_BASE,g_ui32DstBuf);

    UARTCharPut(UART0_BASE,g_ui32DstBuf);
}