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.

光流传感器

Other Parts Discussed in Thread: TM4C123GH6PM

光流传感器程序,芯片是A3080

2016-6-28(光流能够正常采到x,y,没有摄像头程序).zip
  • 建议你把问题详细细化一下,另外没有原理图。

  • A3080不是TI的传感器,找不到他的资料。还有,楼主没说明你的问题,这是分享帖呢,还是求助帖呢?

  • 这是分享帖......

    这是用TM4C123GH6PM驱动的光流程序

    另外,请问一下,你用过TM4C123GH6PM驱动摄像头吗?我最近在写这个程序,但是DMA配置出现了问题,GPIO触发DMA通道无法传输数据,求讲解........

    感谢你的回帖

  • 不好意思,这是一个分享帖,感谢你的回帖,这是我前几天调试出来的光流程序,就是想和大家一起分享一下。

    另外,请问一下,你用过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);
    }

    }

    希望你能帮忙看看程序问题出在哪里,感谢,感谢,感谢!!!!!!!!!