您的位置:首页 > 其它

海思芯片3516cv200上GPIO操作步骤的整理

2017-11-15 11:41 429 查看
最近在研究海思芯片,弄到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手册
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: