- 收藏
- 点赞
- 分享
- 举报
对海思上GPIO的一点理解
[i=s] 本帖最后由 initios 于 2017-2-22 16:48 编辑 [/i]
最近兄弟我在折腾一块3516cv200+IMX323的板子,弄到GPIO这块时,一开始一头雾水,一番搜索加看文档,貌似搞明白怎么用了。特写此文,帮助自己理解,请各位大神指教:
根据3516cv200 手册,使用gpio只需要3步 1 设置gpio端口复用 所谓复用,就是指一个端口能同时干很多事,但是具体你要求他干啥,是需要设置的,这就是管脚复用寄存器的作用。 举个例子,如果我们想设置GPIO6_7,需要首先找到对应的管脚复用寄存器地址。查手册,对应说明如图。意思是如果你想让这个管脚作为io口使用,需要给muxctrl_reg55这个寄存器里写00。那么muxctrl_reg55这个寄存器在哪呢?前面已经给了偏移地址0x0DC。手册里查下基地址为0x200F_0000。所以这个寄存器的地址为0x200F_00DC。 那么如何写值进去呢,海思SDK已经给了工具himm。 输入以下命令即可: himm 0x200F00DC 0 这样GPIO6_7对应管脚的功能就设置为了IO口。
[attach]5282[/attach]
2 设置GPIO口的方向 所谓方向,就是你是把io做输入用还是输出用。比如如果你的板子外接了个电池模块,你希望电池模块在没电的时候,能够给你的板子一个信号,告诉你没电了,这时你就需要将io口作为输入使用。反过来,如果你需要告诉外接的什么设备什么事情,那就要将io口做输出。 设置GPIO口的方向,实际上就是写 GPIO_DIR寄存器。同样的,首先需要找地址。 看下面两张表: [attach]5283[/attach] [attach]5284[/attach]
查表得到GPIO6_7的GPIO_DIR寄存器地址为0x201A_0400。 然后GPIO_DIR寄存器里有8位,每一位对应一个GPIO的方向。 即 [attach]5285[/attach]
如果你想把GPIO6_7的方向设为输出 则输入命令 himm 0x201A0400 0b10000000. 但是实际操作中,直接这样干也许会影响到其他的GPIO方向,所以最好先把寄存器里的值读出来,只改bit 7的值,其他的保持不变。
3 读取或者写入GPIO值 这块实际上就是GPIO_DATA寄存器,从名字就可以知道,这个寄存器就是装的数值对不,很好理解。但是不好理解的是手册里的一段话:
[attach]5286[/attach] 反正我是没看明白。但是我的理解是这样。GPIO_DATA[7:0]实际上就对应了GPIO6_7到GPIO6_0 8个IO口,每一个bit是1还是0,就对应了每个IO口的数值。
[attach]5287[/attach] 那么那段话里什么0x3FC,0x200这些地址什么意思呢,我理解实际上允许你对GPIO的值进行批量操作。 打个比方,如果你只想操作GPIO6_7,那么你的偏移地址就应该为0b10_0000_0000(即0x200),但是如果你想同时操作GPIO6_7和GPIO6_6,那么你给的偏移地址就应该是0b11_0000_0000(即0x300)。 所以继续上面的例子,我们只对GPIO6_7设置输出1,那么就应该输入: himm 0x201A0200 0xFF 虽然我们给的值是0xFF,但是由于上面的原因,实际上我们只是给GPIO_DATA[7]赋值了,其他的都没作用。
最后补充说下linux下gpio和海思gpio编号区别问题: 我看资料时,先看的是原理图,一上来就看到gpio编号都是gpiox_x(gpio6_6之类的)这种写法,就有点蒙。因为我以前只搞过linux简单的GPIO输入输出,所以脑海里只有gpiox这种写法,比如gpio1、gpio2。看了cpu手册才知道,原来海思的gpio是分组的,比如3516cv200有9组,每组又有8个io口,所以gpio6_6的意思是第6组的第7个io口。
参考资料: 3516cv200手册 http://www.ebaina.com/bbs/forum.php?mod=viewthread&tid=7674&highlight=gpio
Markdown 语法
- 加粗**内容**
- 斜体*内容*
- 删除线~~内容~~
- 引用> 引用内容
- 代码`代码`
- 代码块```编程语言↵代码```
- 链接[链接标题](url)
- 无序列表- 内容
- 有序列表1. 内容
- 缩进内容
- 图片![alt](url)
-
2016-09-01 22:39:49
-
2017-12-11 10:47:49
-
2018-12-18 17:37:21
-
2013-11-19 11:53:24
-
2019-01-22 17:19:16
-
2020-01-13 11:39:59
-
2018-12-08 11:59:33
-
2020-09-24 15:04:04
-
2013-11-26 20:26:57
-
2014-03-13 10:48:30
-
2021-02-19 14:42:52
-
2017-03-08 10:39:30
-
2020-11-03 11:50:18
-
2022-09-21 11:14:19
-
2021-06-15 17:14:34
-
2015-04-14 19:44:20
-
2019-02-21 10:48:10
-
2017-09-12 17:20:54
-
2022-10-18 16:18:00
-
5Hi3516CV610 如何使用SD卡升级固件
-
5cat /dev/logmpp 报错 <3>[ vi] [func]:vi_send_frame_node [line]:99 [info]:vi pic queue is full!
-
50如何获取vpss chn的图像修改后发送至vo
-
5FPGA通过Bt1120传YUV422数据过来,vi接收不到数据——3516dv500
-
50SS928 运行PQtools 拼接 推到设备里有一半画面会异常
-
53536AV100的sample_vdec输出到CVBS显示
-
10海思板子mpp怎么在vi阶段改变视频数据尺寸
-
10HI3559AV100 多摄像头同步模式
-
9海思ss928单路摄像头vio中加入opencv处理并显示
-
10EB-RV1126-BC-191板子运行自己编码的程序
举报类型
- 内容涉黄/赌/毒
- 内容侵权/抄袭
- 政治相关
- 涉嫌广告
- 侮辱谩骂
- 其他
详细说明