Firefly开源社区

12
发表新贴

【GoRK3288】4.GPIO操作方法(2)

230

积分

23

威望

20

贡献

技术达人

Rank: 2

积分
230

突出贡献

发表于 2015-5-10 12:50:04     
     请先在https://github.com/tjCFeng/GoRK3288下载 GoRK3288 开源库

    上一节通过不靠谱的方法控制了WorkLED,那么对于一个具有功能复用的GPIO应该怎样操作呢?为了能够表达的更清楚一些,这次先不看代码,而是找一个具有代表性的端口来针对它说明。
    Firefly-RK3288有两排引出接口,从这里做文章吧

1.png


    找来找去,发现GPIO7_A1这个口很好,是PWM和GPIO复用的端口,就对它下手。
    由于它本身没有连接到任何地方,直接操作看不出效果,所以我翻箱倒柜找到了个小板子
2.jpg

    上面有LED和蜂鸣器,特别适合做这个试验。不过它是排针而Firefly-RK3288的是排座,还得用杜邦线来连接。最好的是一头公一头母的。手头上没有这种线,只能用公对公、母对母的来连接了
3.jpg
5.jpg


    开发板这端按照第一张图来连接好
4.jpg

    另外还有VCC和GND别忘了。

    连接完毕,可以看看代码了。如果按照上一节那样的操作,会发现根本不起作用,改变不了电平。
    差在什么地方呢?来看看示例代码
6.png


    比上一节的代码多了不少呀。不过不用担心,这里面有一些不需要的。
    首先,两个Flip(),就是电平翻转用的,这个已经知道了,可以忽略掉。
    其次,Print打印状态和Sleep延时函数,都是Go语言的东西,也可以忽略,一下子少了5行代码。
    在来看SetPP(),这个是设置内部上拉下拉电阻的,LED小板已经有上拉电阻了,这句可以省略;
    SetSR(),设置GPIO的速度,分为Fast和Slow,控制个LED快慢都无所谓,也可以省略;
    SetE(),设置GPIO驱动电流,LED小板上有三极管来驱动,只要个GPIO的信号就可以了,所以也可以省略。

    最关键的就一句,SetDir(),设置为输出。复用的端口改变为GPIO后,默认是输入的,所以要手动设置为输出,这也是为什么原来的代码不能控制LED的原因。
    当然,不要怪我故弄玄虚,不就是个设置方向吗,讲了这么多。其实隐藏在表面的背后,还有一部分操作,就是设置功能复用,通过RK3288的IOMUX来改变功能。说起来简单,但是在手册中查找每一个端口的复用操作很繁琐。当初在尝试使用这个GPIO口的时候,按照手册一点一点的配置好功能复用后居然发现还是不能操作电平,原因就是把方向设置给忘了,还以为是代码的问题而费了不少时间,所以这里特别强调了一下。
    不过经过封装后,想操作一个GPIO就再也不用去担心IOMUX了,直接使用就可以了,这就是封装的威力。

    好了,为了庆祝一下,来看看LED的效果吧

7.jpg

    可以根据代码每次的翻转来改变LED的亮灭。

下面总结一下GPIO类常用的方法:
    CreateGPIO:初始化端口
    FreeGPIO:释放端口
    GetData:获取高低电平
(仅在输出时有效)
    Flip:翻转电平
(仅在输出时有效)
    SetData:设置高低电平
(仅在输出时有效)
    SetPP:设置内部拉电阻
    SetSR:设置GPIO速度
    SetE:设置驱动电流
    GetInputValue:获取输入的高低电平(仅在输入时有效)

   
GoRK3288库请在https://github.com/tjCFeng/GoRK3288下载。


回复

使用道具 举报

65

积分

0

威望

0

贡献

技术小白

积分
65
发表于 2016-10-17 16:01:30     
大師Orz
我看了你的GRF.go 有點不太懂
我見到類似                        Value |= (0x3 << 16)
                                        Value &^= (0x3 << 0)
在各個設定中,請問是不是每一個PORT 跟 PIN 的設定都不同?
另外,我發現只有P7 是被設定的,但實際有25個GPIO可用,如果我用lookup table 或 array 代替switch會不會令flip() 的反應時間變慢?
如果我問了白痴問題,我先說一聲對不起

求指教
回复

使用道具 举报

41

积分

0

威望

0

贡献

技术小白

积分
41
发表于 2016-10-20 16:18:17     
回复

使用道具 举报

230

积分

23

威望

20

贡献

技术达人

Rank: 2

积分
230

突出贡献

发表于 2016-10-25 12:29:52     
brian1611 发表于 2016-10-17 16:01
大師Orz
我看了你的GRF.go 有點不太懂
我見到類似                        Value |= (0x3

因为整个CPU端口太多,所以没有封装全,以P7举的例子,需要其他端口的话可以按照那种格式把代码添加进去就可以了。
至于flip,因为有操作系统,其实哪种方法操作效率都不高,慢也不会慢太多,只要注意延时不要用Sleep之类的就可以了,以免影响其他程序的运行。
回复

使用道具 举报

104

积分

0

威望

0

贡献

技术小白

积分
104
发表于 2017-6-27 16:01:19     
請問一下,GetData 只會取得 true ,false
請問如何取得 GPIO 取得的實際數據?
謝謝
回复

使用道具 举报

230

积分

23

威望

20

贡献

技术达人

Rank: 2

积分
230

突出贡献

发表于 2017-6-28 07:00:02     
evanlitw 发表于 2017-6-27 16:01
請問一下,GetData 只會取得 true ,false
請問如何取得 GPIO 取得的實際數據?
謝謝

IO取得的是0,1,要获取数据就要用Port类,GPIOGROUP的SWPORT_DR就是数据了。
回复

使用道具 举报

104

积分

0

威望

0

贡献

技术小白

积分
104
发表于 2017-6-28 09:09:41     
tjCFeng 发表于 2017-6-28 07:00
IO取得的是0,1,要获取数据就要用Port类,GPIOGROUP的SWPORT_DR就是数据了。

不好意思~
小弟不才,正在努力學習中
可否請大大再說明詳細一點
或有一段簡單的範例之類的
幫助理解及學習
謝謝大大
回复

使用道具 举报

230

积分

23

威望

20

贡献

技术达人

Rank: 2

积分
230

突出贡献

发表于 2017-6-29 06:58:19     
evanlitw 发表于 2017-6-28 09:09
不好意思~
小弟不才,正在努力學習中
可否請大大再說明詳細一點

P8, _ := RK3288.CreateGPIOGROUP(RK3288.P8)
Data := P8.SWPORT_DR //读数据
P8.SWPORT_DR = 0xF0F0F0F0  //写数据
RK3288.FreeGPIOGROUP(P8)
回复

使用道具 举报

288

积分

0

威望

0

贡献

技术达人

Rank: 2

积分
288
发表于 2017-8-1 16:00:47     
楼主你好,我用Test.go测试了一下,控制那两个灯怎么都没有反应,但是扩展出来的GPIO口(P7B1和P7A3)可以使用,还有Test.go里PWM也是正确的,我烧写的固件是kernel4.4+ubuntu16.10,自己制作的,无论怎么修改kernel都控制不了P8A1和P8A2,这是怎么回事呢?但是kernel里如果配置不改的话,通过文件系统操作是可以控制的,就是echo default-on > /sys/class/leds/...那个指令。不知道楼主有什么建议?
回复

使用道具 举报

230

积分

23

威望

20

贡献

技术达人

Rank: 2

积分
230

突出贡献

发表于 2017-8-2 18:34:30     
可能已经注册 发表于 2017-8-1 16:00
楼主你好,我用Test.go测试了一下,控制那两个灯怎么都没有反应,但是扩展出来的GPIO口(P7B1和P7A3)可以 ...

如果用这个库,就和kernel完全没有一点关系,不用考虑操作系统的影响。
至于说这两个P8的端口不能操作,是因为我没有封装进来,因为口太多了,工作量太大,没有精力完成。
用到了P8的话,可以参照GRF.go文件里IOMUX_GPIO的函数,查看手册把寄存器的配置添加进来就可以控制了。
回复

使用道具 举报

返回列表
12
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

友情链接 : 爱板网 电子发烧友论坛 云汉电子社区 粤ICP备14022046号-2
快速回复 返回顶部 返回列表