光流传感器程序,芯片是A3080
Maka Luo:
建议你把问题详细细化一下,另外没有原理图。
xyz549040622:
A3080不是TI的传感器,找不到他的资料。还有,楼主没说明你的问题,这是分享帖呢,还是求助帖呢?
memgzhu pan:
回复 xyz549040622:
这是分享帖……
这是用TM4C123GH6PM驱动的光流程序
另外,请问一下,你用过TM4C123GH6PM驱动摄像头吗?我最近在写这个程序,但是DMA配置出现了问题,GPIO触发DMA通道无法传输数据,求讲解……..
感谢你的回帖
memgzhu pan:
回复 Maka Luo:
不好意思,这是一个分享帖,感谢你的回帖,这是我前几天调试出来的光流程序,就是想和大家一起分享一下。
另外,请问一下,你用过TM4C123GH6PM驱动摄像头吗?我最近在写这个程序,但是DMA配置出现了问题,GPIO触发DMA通道无法传输数据,求讲解……..
这是我DMA的初始化,我用PF4引脚作为DMA的触发源,这个引脚接摄像头的CLK上,PB8口做摄像头的数据口,即源地址就是PB口的数据寄存器地址 (void *)(GPIO_PORTB_BASE+GPIO_O_DATA), g_ui32DstBuf,是我存像素值的二维数组,也就是我的目的地址,另外,GPIO F的DMA通道设置的正确吗?GPIO F和ADC0 SS1同一个通道,即通道15,用ROM_uDMAChannelAssign(UDMA_CH15_GPIOF); //配置通道15GPIOF 来配置GPIO F通道。请问这个配置有什么问题?
void InitDMA(void){
ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOF); //使能GPIOF4时钟—摄像头CLK GPIODMATriggerEnable(GPIO_PORTF_BASE,GPIO_PIN_4); //设置PF0为DMA触发源 GPIOIntRegister(GPIO_PORTF_BASE, uDMAIntHandler); //GPIO注册中断–uDMAIntHandler GPIOPinTypeGPIOInput(GPIO_PORTF_BASE,GPIO_PIN_4); //设置F4为输入 GPIOPadConfigSet(GPIO_PORTF_BASE,GPIO_PIN_4,GPIO_STRENGTH_2MA, GPIO_PIN_TYPE_STD_WPU);//配置F4为上拉电阻 输出电流能力2mA GPIOIntTypeSet(GPIO_PORTF_BASE,GPIO_PIN_4,GPIO_RISING_EDGE);//上升沿触发 GPIOIntEnable(GPIO_PORTF_BASE,GPIO_PIN_4); //使能F4中断 ROM_IntEnable(INT_GPIOF);
//ROM_SysCtlPeripheralClockGating(true); //休眠模式 ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_UDMA); //使能外设uDMA //ROM_SysCtlPeripheralSleepEnable(SYSCTL_PERIPH_UDMA); //使能uDMA休眠模式 ROM_IntEnable(INT_UDMAERR); //使能uDMA错误中断 ROM_uDMAEnable(); //使能uDMA ROM_uDMAControlBaseSet(pui8ControlTable); // ROM_IntEnable(INT_UDMA); // 使能UDMA中断 ROM_uDMAChannelAssign(UDMA_CH15_GPIOF); //配置通道15GPIOF // 这个函数是禁用uDMA通道的属性 GPIOF通道,连续模式转移|备用通道|高优先级|屏蔽该通道的外设请求信号 ROM_uDMAChannelAttributeDisable(UDMA_CHANNEL_ADC1, UDMA_ATTR_USEBURST | UDMA_ATTR_ALTSELECT | (UDMA_ATTR_HIGH_PRIORITY | UDMA_ATTR_REQMASK)); // ROM_uDMAChannelAttributeEnable(UDMA_CHANNEL_ADC1,UDMA_ATTR_HIGH_PRIORITY); //这个函数是设置uDMA转移的控制参数。 GPIOF通道|主控制,数据宽度8位|源地址增量0位|目的地址增量32位|仲裁数目8个数据单元 ROM_uDMAChannelControlSet(UDMA_CHANNEL_ADC1 | UDMA_PRI_SELECT, UDMA_SIZE_8| UDMA_DST_INC_NONE| UDMA_DST_INC_32 |UDMA_ARB_8); //这个函数是配置uDMA转移参数。 GPIOB通道|主控制,基本传输模式,源地址,目的地址,传输数据项的数量 ROM_uDMAChannelTransferSet(UDMA_CHANNEL_ADC1 | UDMA_PRI_SELECT, UDMA_MODE_BASIC , (void *)(GPIO_PORTB_BASE+GPIO_O_DATA), g_ui32DstBuf, L); // ROM_uDMAChannelEnable(UDMA_CHANNEL_ADC1); //使能uDMA通道 开始数据传输}
下面是触发源PF4的中断函数
void uDMAIntHandler(void){ uint32_t ui32Mode; uint32_t ui32Status; ui32Status = GPIOIntStatus(GPIO_PORTF_BASE, true); //读取PORTF中断状态 GPIOIntClear(GPIO_PORTF_BASE,ui32Status); //清除PORTF中断状态 turnA7(); ui32Mode = ROM_uDMAChannelModeGet(UDMA_CHANNEL_ADC1|UDMA_PRI_SELECT); //GPIOF通道转移数据 if(ui32Mode == UDMA_MODE_STOP) //转移完成 { g_ui32MemXferCount++; //转移数据计数加一 if(g_ui32MemXferCount>5000) g_ui32MemXferCount=0; //这个函数是配置uDMA转移参数。 GPIOB通道 |主控制,基本传输模式,源地址,目的地址,传输数据项的数量 ROM_uDMAChannelTransferSet(UDMA_CHANNEL_ADC1|UDMA_PRI_SELECT, UDMA_MODE_BASIC, (void *)( GPIO_PORTB_BASE+GPIO_O_DATA), g_ui32DstBuf, L); ROM_uDMAChannelEnable(UDMA_CHANNEL_ADC1); //GPIOF通道使能 } if(!ROM_uDMAChannelIsEnabled(UDMA_CHANNEL_ADC1)) { //这个函数是配置uDMA转移参数。 GPIOB通道 |主控制,基本传输模式,源地址,目的地址,传输数据项的数量 ROM_uDMAChannelTransferSet(UDMA_CHANNEL_ADC1|UDMA_PRI_SELECT, UDMA_MODE_BASIC, (void *)(g_ui32SrcBuf+GPIO_O_DATA ), g_ui32DstBuf, L);//yuanBuf g_ui32SrcBuf+GPIO_O_DATA ROM_uDMAChannelEnable(UDMA_CHANNEL_ADC1); }}
希望你能帮忙看看程序问题出在哪里,感谢,感谢,感谢!!!!!!!!!