david

david

33个粉丝

368

问答

253

专栏

229

资料

david  发布于  2015-05-23 20:18:09
采纳率 1%
368个问答
一个爱徒步的~IT民工
19969

3520D 通用GPIO 使用篇(板子3G电源控制脚说明)

 
本帖最后由 david 于 2015-5-23 20:22 编辑

在一个嵌入式系统中使用最多的莫过于 通用输入输出 GPIO口。看到论坛中经常有朋友问海思为什么没有提供GPIO驱动。其实不然。

在海思SDK  xxx/osdrv/tools/board_tools/reg-tools-1.0.0/source/tools/下 提供了himm的读写工具源码。
你也可以根据himm的源码来写一个文件设备操作的驱动。毕竟轮子已经有了,我们就没必要再去造轮子了。

这个工具是用来 配置海思寄存器的。当然可以稍加改造或者在应用直接使用来控制通用寄存器。

根据海思提供资料 ,配置一个通用GPIO需要做如下工作。
1.  参考“管脚复用控制寄存器”配置管脚的相应位,使能需要使用的 GPIO管脚功能。(这块大家自己去查复用寄存器表)
2.  配置寄存器 GPIO_DIR,选择 GPIO是作为输入还是输出。
            GPIO用于输入:外部信号通过 GPIO 管脚送进来,此时可通过 GPIO_DATA 寄存器查看输入信号值。
             注意:输入的信号会同时送到和 GPIO复用的管脚上。
             GPIO用于输出:先向 GPIO_DATA 寄存器写入相应值后,再通过 GPIO输出写入值。
            GPIO8 0x201D_0000
            GPIO7 0x201C_0000
            GPIO6 0x201B_0000
            GPIO5 0x201A_0000
            GPIO4 0x2019_0000
            GPIO3 0x2018_0000
            GPIO2 0x2017_0000
            GPIO1 0x2016_0000
            GPIO0 0x2015_0000


GPIOn对应的寄存器地址为:GPIOn基地址+该寄存器偏移地址。


下面是比较关键的一个问题:我们知道对GPIO_DATA的操作可以控制输出,如果DIR方向是输入,可以读取这个地址的值 。那么怎么进行位操作呢?
海思的手册给出如下解释。海思的DATA寄存器通过 一个10位的地址中的高8位进行位寻址。

比如我要操作

若地址为 0x3FC(0b11_1111_1100) ,则对 GPIO_DATA[7:0]这 8bit操作全部有效。
操作方式: 基地址+偏移地址   0x3FC就为便宜地址,如果对该地址的寄存器操作则对所有8个IO的控制有效。
若地址为 0x200(0b10_0000_0000) ,则仅对 GPIO_DATA[7]的操作有效。

另一个关键寄存器
GPIO_DIR 方向寄存器 偏移地至 0x400

下面举个栗子: (控制开发板3G电源)
比如控制GPIO0_1  
基地址  GPIO0_BASE 0x2015_0000
GPIO_DIR    = GPIO0_BASE + OFFSET(0x400)   0:输入  1:输出
则数据DATA寄存器地址  0b00_0000_1000  = 0x08

对了别忘了复用:

复用的基地址   0x200F0000  复用偏移地址  0x09c   
该寄存器 bit0 控制复用  0 为GPIO  1为功能。

himm 0x200F009C  0
himm 0x20150400  2
himm 0x20150008  0xFF

附图:



3G_RST  =  RMII_TXD0     功能1 : GPIO0-2

3G_Power = RMII_TXEN      功能1:    GPIO0-1

复用寄存器基地址 0x200F 0000

偏移地址


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

bingbing

0个粉丝

12

问答

0

专栏

0

资料

bingbing 2015-05-26 17:18:04
认可0
请教您一个问题,HI3531     sample_vio 和sample_vdec两个例程在vga视频输出上有哪些差异


为什么qt界面可以显示在sample_vdec的视频上,却显示不到sample_vio的视频上


运行qt  程序前应先打开framebuffer设备文件,可以先运行海思提供的framebuffer演示demo程序。
       ./sample_hifb &  //程序后台执行,目的是打开framebuffer设备文件

我在想是不是vio的图层设置与hifb的图层冲突,请指点一下,谢谢。

fox-cool

0个粉丝

9

问答

0

专栏

0

资料

fox-cool 2015-05-26 19:19:14
认可0
[quote][url=forum.php?mod=redirect&goto=findpost&pid=16428&ptid=7674]bingbing 发表于 2015-5-26 17:18[/url]
请教您一个问题,HI3531     sample_vio 和sample_vdec两个例程在vga视频输出上有哪些差异


[/quote]

怎么到处 乱发。

jp1017

0个粉丝

78

问答

0

专栏

9

资料

jp1017 2015-05-27 08:13:05
认可0
非常好,非常感谢哦,哈哈哈,谢谢!!!

bingbing

0个粉丝

12

问答

0

专栏

0

资料

bingbing 2015-05-27 09:38:14
认可0
[quote][url=forum.php?mod=redirect&goto=findpost&pid=16435&ptid=7674]fox-cool 发表于 2015-5-26 19:19[/url]
怎么到处 乱发。[/quote]

迫不得已,想找版主指点一下

jp1017

0个粉丝

78

问答

0

专栏

9

资料

jp1017 2015-05-27 09:57:10
认可0
[quote][url=forum.php?mod=redirect&goto=findpost&pid=16467&ptid=7674]bingbing 发表于 2015-5-27 09:38[/url]
迫不得已,想找版主指点一下[/quote]

:):):):):):):):):)

goodman

2个粉丝

30

问答

18

专栏

17

资料

goodman 2015-05-27 10:23:58
认可0
本帖最后由 goodman 于 2015-5-27 10:25 编辑

如果集成在代码里用这个函数还是比工具强啊。
HI_S32 HI_MPI_SYS_SetReg(HI_U32 u32Addr, HI_U32 u32Value);

当然,改寄存器测试,还是himm好用:lol

zhitao2072

0个粉丝

0

问答

0

专栏

0

资料

zhitao2072 2015-05-27 15:30:55
认可0
楼主好牛逼,我正需要这个呢。。。谢谢分享

lee1111

0个粉丝

5

问答

0

专栏

0

资料

lee1111 2015-11-27 11:25:03
认可0
[quote][url=forum.php?mod=redirect&goto=findpost&pid=16470&ptid=7674]goodman 发表于 2015-5-27 10:23[/url]
如果集成在代码里用这个函数还是比工具强啊。
HI_S32 HI_MPI_SYS_SetReg(HI_U32 u32Addr, HI_U32 u32Value ...[/quote]

谢谢提醒HI_S32 HI_MPI_SYS_SetReg正好用到:lol

李超_百视通科技

0个粉丝

21

问答

0

专栏

0

资料

李超_百视通科技 2015-12-19 11:28:16
认可0
谢谢楼主。感谢分享

ngswfx

1个粉丝

55

问答

1

专栏

40

资料

ngswfx 2016-04-14 19:18:44
认可0
这个必须会,研究一下,才能控制给外部看门狗喂狗粮

hik

0个粉丝

3

问答

0

专栏

0

资料

hik 2016-04-21 13:53:32
认可0
David是个好银

lihongfei

0个粉丝

17

问答

0

专栏

2

资料

lihongfei 2016-06-23 14:34:08
认可0
本帖最后由 lihongfei 于 2016-6-23 14:35 编辑

十分感谢DAVID的分享
但是有两个问题,
himm  0x200F009C 0 // 定义管脚功能为 GPIO类型
himm  0x20150400 2  // 这里是不是表示输出,但是如果表示输出是否应该为1
himm  0x20150008 0xff//这是要将第四位输出为1

有个问题想请教一下
1:GPIO0_X,其中X代表0~7,是否他们的输入输出必须保持一致
2:如果是输入怎么表呢,DATA = himm 0x20150008 ;这样?

lejianz

0个粉丝

1

问答

0

专栏

1

资料

lejianz 2016-06-25 22:05:25
认可0



这是HI3531的/etc/init.d/rcS的内容,结合HIMM工具,我们分析一下。


#GPIO17 3~6                              

himm 0x200F0234 0                        

himm 0x200F0238 0                        

himm 0x200F023C 0                        

himm 0x200F0240 0                        

#GPIO17 DIR                              

himm 0x20260400 0x20                     

#GPIO17_5 BUZZER                          

himm 0x20260080 0x20                     

                                          

ifconfig eth0 192.168.0.140               

ifconfig eth1 192.168.1.163               

                                          

telnetd&                                 

                                         

#GPIO17_5 BUZZER                        

himm 0x20260080 0x0









#GPIO17 3~6                              

himm 0x200F0234 0                        

himm 0x200F0238 0                        

himm 0x200F023C 0                        

himm 0x200F0240 0   

这四行是定义GPIO17的3~6引脚为GPIO1的功能,即用作IO管理用。





地址计算为基地址0X200F0000, 再加上0X234, 定义GP17.3的地址。










#GPIO17 DIR                              

himm 0x20260400 0x20                     

这是定义GPIO17.5脚为输出引脚,即方向引脚。记住:0X400都是方向引脚,一个组只有一个寄存器




#GPIO17_5 BUZZER                          

himm 0x20260080 0x20         

这里直接输出17_5的引脚为高电平,引脚为高,蜂鸣器开始响了。 0X20为0B0010_0000,  也就是BIT5, 管脚号是GPIO17_0~GPIO17_7,

这里的0x20260080 的数据寄存器




再加上偏移地址0X080,  计算方法为:  0X20260000 + (1 《  (5 + 2))

其中5为管脚号, 2为右移MASK地址PADDR[9:2]









#GPIO17_5 BUZZER                        

himm 0x20260080 0x0

在运行了网络配置和TELNET程序后,置GPIO17_5脚为低电平,关掉蜂鸣器。

hanfei69882

2个粉丝

26

问答

0

专栏

2

资料

hanfei69882 2016-08-10 11:50:48
认可0
跑来收藏加点赞:victory:

Cybers

0个粉丝

0

问答

0

专栏

0

资料

Cybers 2016-09-12 13:14:25
认可0
谢谢楼主,学习了,,,,

记得发如雪

0个粉丝

2

问答

0

专栏

0

资料

记得发如雪 2016-10-13 11:53:32
认可0
多谢楼主的分享

Joey

1个粉丝

15

问答

0

专栏

0

资料

Joey 2016-12-02 13:23:27
认可0

谢谢楼主,学习了

281324114

0个粉丝

4

问答

0

专栏

0

资料

281324114 2016-12-03 15:04:14
认可0
:):):):)不错 谢谢分享!!!

cy_ygs

0个粉丝

0

问答

0

专栏

0

资料

cy_ygs 2016-12-26 15:09:43
认可0
好资料,学习了

zltkf

0个粉丝

1

问答

0

专栏

0

资料

zltkf 2016-12-27 14:27:48
认可0
感谢楼主和大家的回答。很详细,很有帮助,谢谢了。
加载中···
或将文件直接拖到这里
悬赏:
E币
网盘
* 网盘链接:
* 提取码:
悬赏:
E币

Markdown 语法

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

Markdown 语法

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

举报类型

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

详细说明

易百纳技术社区