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