材料:STM32F407两块 NRF24L01两个,OV2640摄像头一个,TFTLCD4.3寸显示屏一个,IS62WV51216(sram)一个。
注:一开始在无线传输模块的选材上有串口wifiESP8266和NRF24L01两个,先选择了ESP8266进行测试,这个wifi模块传输距离,面对阻隔物体的传输比NRF24L01强,但是经过深入学习总结,这个模块传输速度很慢,因为限制在了串口的速率上,比如115200的波特率计算下来10kb/s左右的传输速率,而NRF24L01则是115kb/s的传输速率,所以最后放弃了ESP8266.局限于各方面因素只能选择NRF24L01,如果有后生的话,有能力的话,建议选择sdio接口的WIFI模块。这个模块是我在正点原子论坛上了解到的,速度很块。
上图:
视频链接:http://v.youku.com/v_show/id_XMjUxNzI0MDM3Mg==.html?from=s1.8-1-1.2&spm=a2h0k.8191407.0.0
自己在这个项目中的思路:
1.先将摄像头数据过去回来打印出来,在遮挡摄像头等变化的时候看某一个位置点的数据是否有变化。
2.将获取回来的摄像头数据按照lcd屏的写入数据方式写进去,调试图像和摄像头配置
3.将NRF24L01通信的8位数据传输方式改为16位数据传输方式,并且加入视频传输开始和结束的标志。
4.(装配)将摄像头显示和无限通信结合在一起,调试程序运行的bug等
项目中的技术运用:
1.ov2640的摄像头数据通过DCMI接口获取并配置摄像头参数。
2.DCMI获取到的摄像头数据通过DMA传输到一个很大数组中。
3.单凭stm32f407的内置内存并不够,再通过FSMC内存控制器来添加外部sram(1M) fsmc片选3
4.通过SPI对NRF24L01j进行配置和读写数据
5.通过FSMC对LCD进行控制,这里是fsmc片选4
遇到的问题以及解决方法:
1.通过数组将摄像头数据用显示屏显示出来会花屏
解决方法:因为DMA速度比较快,而外部SRAM读写速度比较慢,所以就导致数组的读取跟不上DMA的速度,然后我通过大量实验摄像头窗口参数和显示屏用到的大小参数,找到可以显示真实图像不花屏的参数匹配值:240*240比较理想,最终还是通过外部sram能够级到的DMA的一个值。
2.预计视频信息传输是不到一秒一帧,但实际两到三秒
思考:因为NRF24L01大概是128kb/s,我要传输的115kb左右的数据,所以理论上一秒钟就够了,但是实际总是残酷的,SPI读写速度才37.5MHZ最大,如果改成DMA传输的SPI通道,收益不高,也就快一秒左右,并且要用到DMA和SPI的双重读写上的新函数,这个时序没有官方说明时序等注意的地方还是不太好做的一件事情。
3.视频在传输的时候会花,花的还一塌糊涂
解决方法:发现这个问题后,我还以为是自己视频的开头结尾没有处理好,以及SRAM和lcd在FSMC片选上的冲突,最后一一排除,排出的方法就是在单独的SRAM写数据和LCD显示上尝试。最终发现是自己将接收端的NRF24L01碰到了盒子上,有阻隔了(有点坑,哈哈)最后放在一块后效果还是可以的。
总结:程序其实也没什么,我一会放在下面,有时候还会有一点花屏,所以说,传输模块一定要选择好,建议可以尝试sdio接口的wifi,如果做出来可以一起分享
代码地址:http://download.csdn.net/detail/zhaoyuaiweide/9757743