6243
- 收藏
- 点赞
- 分享
- 举报
对海思上GPIO的一点理解
本帖最后由 initios 于 2017-2-22 16:48 编辑
最近兄弟我在折腾一块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口。

2 设置GPIO口的方向
所谓方向,就是你是把io做输入用还是输出用。比如如果你的板子外接了个电池模块,你希望电池模块在没电的时候,能够给你的板子一个信号,告诉你没电了,这时你就需要将io口作为输入使用。反过来,如果你需要告诉外接的什么设备什么事情,那就要将io口做输出。
设置GPIO口的方向,实际上就是写 GPIO_DIR寄存器。同样的,首先需要找地址。
看下面两张表:


查表得到GPIO6_7的GPIO_DIR寄存器地址为0x201A_0400。
然后GPIO_DIR寄存器里有8位,每一位对应一个GPIO的方向。
即

如果你想把GPIO6_7的方向设为输出
则输入命令
himm 0x201A0400 0b10000000.
但是实际操作中,直接这样干也许会影响到其他的GPIO方向,所以最好先把寄存器里的值读出来,只改bit 7的值,其他的保持不变。
3 读取或者写入GPIO值
这块实际上就是GPIO_DATA寄存器,从名字就可以知道,这个寄存器就是装的数值对不,很好理解。但是不好理解的是手册里的一段话:

反正我是没看明白。但是我的理解是这样。GPIO_DATA[7:0]实际上就对应了GPIO6_7到GPIO6_0 8个IO口,每一个bit是1还是0,就对应了每个IO口的数值。

那么那段话里什么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手册
[url]http://www.ebaina.com/bbs/forum.php?mod=viewthread&tid=7674&highlight=gpio[/url]
最近兄弟我在折腾一块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口。

2 设置GPIO口的方向
所谓方向,就是你是把io做输入用还是输出用。比如如果你的板子外接了个电池模块,你希望电池模块在没电的时候,能够给你的板子一个信号,告诉你没电了,这时你就需要将io口作为输入使用。反过来,如果你需要告诉外接的什么设备什么事情,那就要将io口做输出。
设置GPIO口的方向,实际上就是写 GPIO_DIR寄存器。同样的,首先需要找地址。
看下面两张表:


查表得到GPIO6_7的GPIO_DIR寄存器地址为0x201A_0400。
然后GPIO_DIR寄存器里有8位,每一位对应一个GPIO的方向。
即

如果你想把GPIO6_7的方向设为输出
则输入命令
himm 0x201A0400 0b10000000.
但是实际操作中,直接这样干也许会影响到其他的GPIO方向,所以最好先把寄存器里的值读出来,只改bit 7的值,其他的保持不变。
3 读取或者写入GPIO值
这块实际上就是GPIO_DATA寄存器,从名字就可以知道,这个寄存器就是装的数值对不,很好理解。但是不好理解的是手册里的一段话:

反正我是没看明白。但是我的理解是这样。GPIO_DATA[7:0]实际上就对应了GPIO6_7到GPIO6_0 8个IO口,每一个bit是1还是0,就对应了每个IO口的数值。

那么那段话里什么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手册
[url]http://www.ebaina.com/bbs/forum.php?mod=viewthread&tid=7674&highlight=gpio[/url]
我来回答
回答16个
时间排序
认可量排序
认可0
认可0
认可0
认可0
认可0
认可0
认可0
认可0
认可0
认可0
认可0
认可0
认可0
认可0
认可0
认可0
或将文件直接拖到这里
悬赏:
E币
网盘
* 网盘链接:
* 提取码:
悬赏:
E币
Markdown 语法
- 加粗**内容**
- 斜体*内容*
- 删除线~~内容~~
- 引用> 引用内容
- 代码`代码`
- 代码块```编程语言↵代码```
- 链接[链接标题](url)
- 无序列表- 内容
- 有序列表1. 内容
- 缩进内容
- 图片
相关问答
-
2016-09-01 22:39:49
-
2017-12-11 10:47:49
-
2018-12-18 17:37:21
-
2019-01-22 17:19:16
-
2013-11-19 11:53:24
-
2020-01-13 11:39:59
-
2018-12-08 11:59:33
-
2014-03-13 10:48:30
-
2013-11-26 20:26:57
-
2017-03-08 10:39:30
-
2015-04-14 19:44:20
-
2019-02-21 10:48:10
-
2017-09-12 17:20:54
-
2019-10-13 13:48:16
-
2019-01-30 15:40:36
-
2015-06-24 22:42:08
-
2018-09-16 11:13:19
-
2017-06-26 12:25:06
-
2017-09-18 14:25:54
无更多相似问答 去提问

点击登录
-- 积分
-- E币
提问
—
收益
—
被采纳
—
我要提问
切换马甲
上一页
下一页
举报反馈
举报类型
- 内容涉黄/赌/毒
- 内容侵权/抄袭
- 政治相关
- 涉嫌广告
- 侮辱谩骂
- 其他
详细说明
提醒
你的问题还没有最佳答案,是否结题,结题后将扣除20%的悬赏金
取消
确认
提醒
你的问题还没有最佳答案,是否结题,结题后将根据回答情况扣除相应悬赏金(1回答=1E币)
取消
确认