TI中文支持网
TI专业的中文技术问题搜集分享网站

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为上拉电阻 输出电流能力2mAGPIOPinTypeGPIOInput(GPIO_PORTD_BASE,GPIO_PIN_1);GPIOPadConfigSet(GPIO_PORTD_BASE,GPIO_PIN_1,GPIO_STRENGTH_2MA, GPIO_PIN_TYPE_STD_WPU);//配置D为上拉电阻 输出电流能力2mAGPIOPinTypeGPIOInput(GPIO_PORTD_BASE,GPIO_PIN_2);GPIOPadConfigSet(GPIO_PORTD_BASE,GPIO_PIN_2,GPIO_STRENGTH_2MA, GPIO_PIN_TYPE_STD_WPU);//配置D为上拉电阻 输出电流能力2mAGPIOPinTypeGPIOInput(GPIO_PORTD_BASE,GPIO_PIN_3);GPIOPadConfigSet(GPIO_PORTD_BASE,GPIO_PIN_3,GPIO_STRENGTH_2MA, GPIO_PIN_TYPE_STD_WPU);//配置D为上拉电阻 输出电流能力2mAGPIOPinTypeGPIOInput(GPIO_PORTD_BASE,GPIO_PIN_4);GPIOPadConfigSet(GPIO_PORTD_BASE,GPIO_PIN_4,GPIO_STRENGTH_2MA, GPIO_PIN_TYPE_STD_WPU);//配置D为上拉电阻 输出电流能力2mAGPIOPinTypeGPIOInput(GPIO_PORTD_BASE,GPIO_PIN_5);GPIOPadConfigSet(GPIO_PORTD_BASE,GPIO_PIN_5,GPIO_STRENGTH_2MA, GPIO_PIN_TYPE_STD_WPU);//配置D为上拉电阻 输出电流能力2mAGPIOPinTypeGPIOInput(GPIO_PORTD_BASE,GPIO_PIN_6);GPIOPadConfigSet(GPIO_PORTD_BASE,GPIO_PIN_6,GPIO_STRENGTH_2MA, GPIO_PIN_TYPE_STD_WPU);//配置D为上拉电阻 输出电流能力2mAGPIOPinTypeGPIOInput(GPIO_PORTD_BASE,GPIO_PIN_7);GPIOPadConfigSet(GPIO_PORTD_BASE,GPIO_PIN_7,GPIO_STRENGTH_2MA, GPIO_PIN_TYPE_STD_WPU);//配置D为上拉电阻 输出电流能力2mASysCtlPeripheralEnable(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为上拉电阻 输出电流能力2mAGPIOIntEnable(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为上拉电阻 输出电流能力2mAGPIOIntEnable(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  7uDMAChannelAttributeDisable(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);
}

Vacabun:

哪里有问题啊

Vacabun:

通过外部中断启动DMA DMA好像启动了 但是没有读取到GPIO的数据

xyz549040622:

回复 Vacabun:

你指的是哪句没有执行呢?中断进去了吗?

Vacabun:

回复 xyz549040622:

中断进去了,但是dma后的数据 也就是g_ui32DstBuf 读出来是0x00,不是gpio的数据。

user6034665:

回复 Vacabun:

请问问题解决了吗?我也在用这个单片机做摄像头。。。

赞(0)
未经允许不得转载:TI中文支持网 » TM4C123GH6PM 使用DMA获取GPIO数据问题
分享到: 更多 (0)