[技术问答] N32926 读写GPIO的注意事项

[复制链接]
 楼主| updownq 发表于 2025-7-12 20:01 | 显示全部楼层 |阅读模式
前段时间要使用新塘的N32926开发项目,需要使用到GPIO控制输入输出。本来很简单的东西,踩到了坑,特此记录下来。如果是需要看GPIO例程的,请查看新塘资料包的DEMO
1. 问题描述
以前也用过Stm32这类处理器,操作GPIO只要按标准来配置一下寄存器之类的就好了。
项目中需要使用GPC3,4,5,6用作LED的控制口。板子启动过程中可以看到灯先会全部亮起。在启动Linux后,使用bash进行GPIO读写,虽然可以设置为I/O模式,但是设置为输出模式时,改变输出值,万用表量测毫无反应。
后续还使用到了GPG7,9作为输入口,也出现了类似GPIO无反应的问题。

2. 问题分析定位和解决
首先检查‘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的特殊操作,操作相应的寄存器,问题解决。
92573686c8e87d9d8e.png
图1 Keil中DEMO对GPG的额外操作

3. 问题解决的详细说明
首先就是具体管脚的复用寄存器对应的寄存器地址是什么。打开新塘的官方手册N3292x Design GuideX.pdf,检索GPCFUN0(我这里查到在84页),也就是GPC多功能寄存器0,找到这个寄存器的详细描述,以GPC3为例,如图2,可以看到:从15~12位(这是32位处理器,所以寄存器也是32位的)的每一位定义了GPC3的功能。因此把这4位都写成0即为GPIO功能。

            57022686c8e9907439.png
             图2 新塘手册中GPC3的多功能寄存器描述
同理,检索DEMO中出现的GPG7,9对应的REG_SHRPIN_AUDIO的AIN3_AEN和REG_SHRPIN_TOUCH的SAR_AHS_AEN两个位。找到对应寄存器的地址偏移(GPC0多功能寄存器为0x90),加上寄存器基址地址(0xb0000000),写入即可。
原文链接:https://blog.csdn.net/qq_33309098/article/details/103518908

huangcunxiake 发表于 2025-7-17 09:53 | 显示全部楼层
这个看着跟普通的裸机编程不太一样啊。
脑洞星球居民 发表于 2025-7-18 18:08 | 显示全部楼层
感谢分享,遇到GPIO问题确实很头疼,你的分析和解决方案很有帮助。
yiy 发表于 2025-7-30 13:03 | 显示全部楼层
一定要按照规范读写。
yiy 发表于 2025-7-30 13:04 | 显示全部楼层
具体管脚的复用寄存器对应的寄存器地址是什么。
xinpian101 发表于 2025-7-31 22:02 | 显示全部楼层
看库函数跟基础的MCU库函数不太一样。
wilhelmina2 发表于 2025-8-4 11:11 | 显示全部楼层
设置上拉或下拉模式的重要性              
louliana 发表于 2025-8-5 10:12 | 显示全部楼层
严格按手册配置寄存器,不忽略时钟和复用功能
uptown 发表于 2025-8-5 10:53 | 显示全部楼层
输出模式下建议串联限流电阻防止短路
olivem55arlowe 发表于 2025-8-5 11:47 | 显示全部楼层
GPIO引脚在未连接外部信号时,若不设置上拉或下拉模式,引脚将处于浮空状态,电平不稳定,容易受到外界干扰,导致系统运行异常
wangdezhi 发表于 2025-8-7 14:36 | 显示全部楼层
未使用的GPIO口若未正确配置,容易进入浮接状态,导致功耗增加或信号不稳定。
linfelix 发表于 2025-8-14 16:53 | 显示全部楼层
查阅《N3292x Design Guide》找到对应引脚的控制寄存器地址及位域定义
linfelix 发表于 2025-8-14 19:41 | 显示全部楼层
新塘N32926的官方文档和示例代码是开发的重要参考。
bestwell 发表于 2025-8-14 20:09 | 显示全部楼层
GPIO的硬件连接也可能引发问题。
pmp 发表于 2025-8-14 20:45 | 显示全部楼层
需将复用寄存器的相关位清零以启用GPIO功能
zerorobert 发表于 2025-8-16 16:54 | 显示全部楼层
先配置复用功能→再设置输入/输出模式→最后设定初始电平
gygp 发表于 2025-8-16 20:25 | 显示全部楼层
关键寄存器配置代码              
wwppd 发表于 2025-8-16 21:18 | 显示全部楼层
N32926的操作也需要按照标准配置寄存器。
pl202 发表于 2025-8-18 20:09 | 显示全部楼层
可以使用软件延时消抖或硬件电容消抖。
yorkbarney 发表于 2025-8-18 21:47 | 显示全部楼层
N32926 的 GPIO 输出可能支持推挽或开漏模式
您需要登录后才可以回帖 登录 | 注册

本版积分规则

57

主题

3461

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部