野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 10002|回复: 5

摄像头相关的C语言问题

[复制链接]
发表于 2015-8-14 18:07:42 | 显示全部楼层 |阅读模式
#define READ_FIFO_PIXEL(RGB565)           do{\
                                          RGB565=0;\
                                          FIFO_RCLK_L();\
                                          RGB565 = (GPIOB->IDR) & 0xff00;\
                                          FIFO_RCLK_H();\
                                          FIFO_RCLK_L();\
                                          RGB565 |= (GPIOB->IDR >>8) & 0x00ff;\
                                          FIFO_RCLK_H();\
                                           }while(0)
想问问:RGB565 = (GPIOB->IDR) & 0xff00;以及 RGB565 |= (GPIOB->IDR >>8) & 0x00ff;所表达的意思,我只知道是把16位的数据分两次接收,但我想修改引脚,想清楚明白这两句的意思,谢谢

回复

使用道具 举报

发表于 2015-8-15 09:11:38 | 显示全部楼层
它就是你说的16位数据分两次接收。如果修改引脚的话,你把GPIOB换成其它的即可。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-8-17 11:06:58 | 显示全部楼层
你好,这样的话是不是一定要连续在一起的引脚才可以,例程上是PB8到PB15,假如我想改成PB4到PB11怎么改呢?又或者在PA占用4个引脚,在PB又占用四个引脚哪怎么改,谢谢!
回复 支持 反对

使用道具 举报

发表于 2015-8-17 13:19:30 | 显示全部楼层
zhen93 发表于 2015-8-17 11:06
你好,这样的话是不是一定要连续在一起的引脚才可以,例程上是PB8到PB15,假如我想改成PB4到PB11怎么改呢? ...

IDR是一个32位的寄存器,高16位用不到,用到的只是低16位

IDR 寄存器 位:IDR15  IDR14  IDR13  IDR12  IDR11  IDR10  IDR9  IDR8  (高8位)
                         IDR7    IDR6    IDR5    IDR4    IDR3     IDR2   IDR1  IDR0  (低8位)

RGB565是16位的数据,第一次传输的是高字节,第二次传输的是低字节,在硬件上我们用的是
PB8~PB15来接收数据,所以每次传输的数据都是在IDR这个寄存器的高字节,所以通过C语言的
&运算取出相应的数据就可以了,有效的数据与1&,无效的数据与0&。

第一次传输的是摄像头数据的高8位,放到的是IDR寄存器的高8位,读出来后放到RGB565这个变量的高8位
RGB565 = (GPIO->IDR) & 0XFF00;  

第二次传输的是摄像头数据的低8位,因为等下要放到RGB565这个变量的低8位去,所以IDR高8位接收到的
数据先右移8位把数据放到低8位先,然后再取出来,直接跟RGB565相加就可以了。
RGB565 |= (GPIO->IDR>>8) & 0X00FF;
------------------------------------------------------------------------------------------------------------------------------------------如果数据是放到 PB4~PB11,那么就把要&运算的值改一下就可以了,PB4~PB11全部置1,其他位置全部置0
这些只是C语言的问题而已。

有效的数据位置1,无效的数据位置0,然后进行&操作即可。
0 1 2 3 4 5 6 7   8 9 10 11 12 13 14 15
0 0 0 0 1 1 1 1   1 1 1   1   0   0   0   0      = 0X 0FF0

改成PB4~PB11则是:
RGB565 = (GPIOB->IDR) & 0x0FF0;           //获得高8位
RGB565 |= (GPIOB->IDR >>4) & 0X00FF; // 获取低8位,并与高8位相加

要注意的是第二次获取低8位数据的时候只要右移4位就可以了,如果是PB5~PB12,那么只要右移3位就可以了。

-----------------------------------------------------------------------------------------------------------------------------------------

如果PA占4个口,PB占4个口,的话实现也是可以的,但是比较麻烦,也没啥意义,最好就在一个端口上

具体带代码你自个倒腾吧,我这里就不给你演示了,上面我已经讲了原理了,还有啥不懂的你再跟帖提问。



回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-8-17 14:58:54 | 显示全部楼层
非常感谢火哥,太帅了,讲了原理我就知道怎么做了,万分感谢
回复 支持 反对

使用道具 举报

发表于 2015-8-17 15:35:04 | 显示全部楼层
zhen93 发表于 2015-8-17 14:58
非常感谢火哥,太帅了,讲了原理我就知道怎么做了,万分感谢

那就好                              
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

联系站长|手机版|野火电子官网|野火淘宝店铺|野火电子论坛 ( 粤ICP备14069197号 ) 大学生ARM嵌入式2群

GMT+8, 2024-5-20 14:00 , Processed in 0.037175 second(s), 24 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表