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