首先检查‘GPX n’在系统内编号是否有问题。新塘官方DEMO的README提示每个GPIO组有32个编址,百度到了一个资料说没有GPF,所以GPG直接接在GPE后面编号,这是要注意的,虽然这个错我一开始也没有犯。
README文档中,有一句这样的话:
The GPIO driver does not touch register MFSEL, and assumes the pin user application trys to control is configured as GPIO pin. In other words, the driver use the same pin must be unselect in kernel configuration.
Please make sure “menuconfig->device drivers->GPIO support->/sys/class/gpio” and “menuconfig->device drivers->GPIO support->W55FA92 GPIO support” are enabled in kernel configuration.
翻译过来就是,GPIO驱动不会检查复用寄存器的状态,默认认为操作的管脚已经配置为GPIO了。请确认kernel配置的时候GPIO功能已经打开了,并且相关引脚不要在kernel配置的时候复用为其它功能。
问题出现的原因其实全被包含在上面的那段话中。检查kernel的配置是毫无问题的。
后来使用了新塘提供的Keil DEMO,也就是无操作系统的程序,烧写GPIO的程序并运行,这几个管脚控制都毫无问题。说明管脚本身没有问题。
最后在师兄的指导下,使用操作系统SDK中自带的nvbitio程序,也就是对寄存器进行位操作的程序,查看了GPC的复用寄存器,发现GPC3 4 5 6都默认配置为了LCD显示屏的引脚。更改复用寄存器的值为GPIO配置后,问题解决。
对于后来使用的GPG7,9,上面这一招就不灵了。后来也是通过Keil的DEMO源码发现对于GPG管脚,会额外调用一个函数(见图1)。原来GPG7,9默认配置为了模拟音频之类的输入输出口,而且模拟管脚的复用是不归复用寄存器管的。因此按照DEMO内,对于GPG7,9的特殊操作,操作相应的寄存器,问题解决。