使用STM32F407驱动鹰眼摄像头

风格不统一 提交于 2020-01-31 23:28:09

ctime:2018-07-06 13:14:33 +0800|1530854073

标签(空格分隔): 未分类


鹰眼摄像头一般用在智能车比赛上,因此现在网上大部分都是用K60来驱动。但K60没有像STM32的HAL、STD库那样的官方库,都是爱好者或者商家(野火、逐飞)等写的民间库,水平也参差不齐。而STM32不仅有官方库,还有STM32QubeMX这种方便的GUI来直接配置底层。

因此,在2018年的创意组上,我们决定使用STM32来驱动鹰眼,这样,以后在Robocon中也能用得上。

STM32F407实际上是有DCMI摄像头接口的,但由于鹰眼摄像头是硬件二值化过的输出,因此似乎不能用DCMI。(我没尝试,因为如果使用DCMI的话,就不能用中断+DMA的方式来驱动了,如果DCMI失败只能重新打板。)

保险起见我直接将鹰眼的D0-D7接到407的PD0-PD7上,然后场中断接PC9的外部中断,PCLK接PC8(TIM8的CH4)。

驱动方式与K60基本一样,即场中断来时,开启DMA传输,设置传输源地址为&GPIOD->IDR,传输目的地址为图像数组首地址,传输长度为数组的size。

这个DMA是TIM8 CH4的输入捕捉DMA,因此每次PCLK脉冲过来,都会触发一次。

需要注意的是,一开始我以为DMA传输从 GPIOD->IDRimg_buffer,这是内存到内存间的传输,DMA应该设置为memory to memory,结果发现如果设置成M2M,那场中断来了之后,刚开启DMA,这玩意儿就把几百个字节全传过去了,根本不考虑PCLK。导致出来的图是一堆全白或者全黑(因为复制的第一二个字节)。因此,DMA应该设置成外设到内存

另外,有些小细节。DMA传输完成后的回调函数里,应该写一句
__HAL_TIM_DISABLE_DMA(&htim8, TIM_DMA_CC4);把DMA关了,否则会出现本来应该在图像右边的跑到图像左边来了。
令人费解的是,我设置的DMA模式是NORMAL,也就是说应该传输完DMA就自己关了的阿。

另外,在定时器初始化函数中,应该加一句

HAL_DMA_RegisterCallback(&hdma_tim8_ch4_trig_com,HAL_DMA_XFER_CPLT_CB_ID,IMG_OK_Callback);

来注册DMA传输完成的回调函数。

HAL_TIM_IC_Start(&htim8,TIM_CHANNEL_4);

来开始定时器的输入捕捉。

详细代码可参考:
https://github.com/Ncerzzk/stm32_Eagle-Eye/tree/master/source

使用HAL库

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!