initios

initios

0个粉丝

2

问答

0

专栏

0

资料

initios  发布于  2017-02-22 11:37:06
采纳率 0%
2个问答
8610

对海思上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

我来回答
回答16个
时间排序
认可量排序

baboe

0个粉丝

8

问答

0

专栏

1

资料

baboe 2017-02-22 14:22:32
认可0
理解无误
只是两处有点小错误

1.
我们只对GPIO6_7设置输出1,那么就应该输入:
himm 0x201A0300 0xFF

应该是笔误
himm 0x201A0200 0xFF

2.
比如3516cv200有8组,每组又有8个io口,所以gpio6_6的意思是第6组的第6个io口

如果以上面表12-20来看,有9组
因为编号是从0开始,所以gpio6_6算起来应该是第7组的第7个io口

initios

0个粉丝

2

问答

0

专栏

0

资料

initios 2017-02-22 16:48:29
认可0
谢谢楼上指点,已更正过来

kent_ly

0个粉丝

8

问答

0

专栏

0

资料

kent_ly 2017-03-03 15:39:15
认可0
用心的楼主, 和 细心的观众 :victory:

hanfei69882

2个粉丝

26

问答

0

专栏

2

资料

hanfei69882 2017-03-17 12:21:11
认可0
本帖最后由 hanfei69882 于 2017-3-17 12:23 编辑

为分享点赞,尤其是DATA寄存器的理解

补充一点:
比如说要操作GPIO6_7,建议使用himm 0x201A0200 0x80,虽然使用himm 0x201A0200 0xFF效果是一样的,如果不理解原理,可能会误解,比如说
如果GPIO6_7作为输入,高电平读取的值?

实际是0x80

Benz

0个粉丝

29

问答

0

专栏

0

资料

Benz 2017-03-17 15:21:05
认可0
为分享点赞

micro虾米

0个粉丝

5

问答

0

专栏

0

资料

micro虾米 2017-07-06 11:00:19
认可0
很好,总算是找到比较系统的讲解了,多谢分享。

wisedo

0个粉丝

2

问答

0

专栏

0

资料

wisedo 2017-07-13 18:35:07
认可0
有用,收藏了。

wisedo

0个粉丝

2

问答

0

专栏

0

资料

wisedo 2017-07-14 11:19:45
认可0
好文章,简单实用

13915426184

0个粉丝

15

问答

0

专栏

0

资料

13915426184 2017-07-21 14:57:14
认可0
好文章,顶一个,不过没有看到内核态的修改register值,非常可惜

CP19940613

0个粉丝

2

问答

0

专栏

0

资料

CP19940613 2017-07-25 16:11:17
认可0
真是一篇好文章,谢谢楼主分享

木火岁月

0个粉丝

1

问答

0

专栏

0

资料

木火岁月 2017-09-07 19:16:38
认可0
感谢楼主分享,真好

Mew

0个粉丝

3

问答

0

专栏

0

资料

Mew 2018-05-08 17:15:19
认可0
解释得很详细,受教了,谢谢。

hero

0个粉丝

1

问答

0

专栏

0

资料

hero 2018-05-09 08:44:26
认可0

用心的楼主, 和 细心的观众

hukaiqiang

0个粉丝

0

问答

0

专栏

0

资料

hukaiqiang 2017-07-15 22:15:28
认可0
好使!!!!!

木火岁月

0个粉丝

1

问答

0

专栏

0

资料

木火岁月 2017-09-07 16:20:24
认可0

非常有用,,,,,,,

木火岁月

0个粉丝

1

问答

0

专栏

0

资料

木火岁月 2017-09-07 19:27:44
认可0
收藏。。。。。。。。。。。。。。。。。。
或将文件直接拖到这里
悬赏:
E币
网盘
* 网盘链接:
* 提取码:
悬赏:
E币

Markdown 语法

  • 加粗**内容**
  • 斜体*内容*
  • 删除线~~内容~~
  • 引用> 引用内容
  • 代码`代码`
  • 代码块```编程语言↵代码```
  • 链接[链接标题](url)
  • 无序列表- 内容
  • 有序列表1. 内容
  • 缩进内容
  • 图片![alt](url)
+ 添加网盘链接/附件

Markdown 语法

  • 加粗**内容**
  • 斜体*内容*
  • 删除线~~内容~~
  • 引用> 引用内容
  • 代码`代码`
  • 代码块```编程语言↵代码```
  • 链接[链接标题](url)
  • 无序列表- 内容
  • 有序列表1. 内容
  • 缩进内容
  • 图片![alt](url)
举报反馈

举报类型

  • 内容涉黄/赌/毒
  • 内容侵权/抄袭
  • 政治相关
  • 涉嫌广告
  • 侮辱谩骂
  • 其他

详细说明

易百纳技术社区