Beagle Bone Black开发板GPIO引脚读写异常求助
先开启GPIO1外设时钟
AM335X的外设时钟默认处于关闭状态,这会直接导致寄存器读回全0且无法写入。找到CM_PER_GPIO1_CLKCTRL寄存器(地址0x44E000AC),在GDB中执行:set *(unsigned int *)0x44E000AC = 0x00000002
该值会将时钟设置为使能状态,之后再尝试读写GPIO1相关寄存器。核对GPIO1寄存器的物理地址
不要凭记忆使用地址,直接参考AM335X官方手册:GPIO1基地址是0x4804C000,DATAOUT寄存器偏移为0x134,完整地址是0x4804C134。可以先读取GPIO1的SYSCONFIG寄存器(偏移0x10,地址0x4804C010),时钟使能后该寄存器应返回非0值,以此验证地址正确性。检查OpenOCD配置与JTAG连接
确保OpenOCD启动时加载了AM335X专用配置文件(如ti/am335x.cfg),避免使用通用ARM配置。同时确认:- JTAG适配器的udev规则已配置,无需sudo即可访问(或使用sudo启动OpenOCD)
- 开发板JTAG引脚连接正确,TCK/TMS/TDI/TDO/GND一一对应
- 部分BBB版本需要设置JTAG_ENABLE跳线以启用调试接口
确认目标核心状态
在GDB中执行halt命令暂停核心运行,运行中的核心会干扰外设寄存器访问。执行info registers检查核心寄存器是否能正常读取,以此验证JTAG连接的有效性。配置GPIO引脚复用功能
要点亮的LED对应的引脚可能默认不是GPIO模式。比如BBB的USR0 LED对应GPIO1_21,需找到对应引脚的PINMUX寄存器(如0x44E10890),执行:set *(unsigned int *)0x44E10890 = 0x00000007
将引脚配置为GPIO功能后,再操作DATAOUT寄存器设置输出值。排查内存访问限制
如果目标板已运行Linux系统,MMU可能将GPIO地址映射为只读或未映射区域。此时可以:- 通过OpenOCD完全暂停Linux系统后再尝试读写
- 切换到裸机调试环境(如将裸机程序烧写到SRAM)
- 先用
devmem命令在Linux用户空间验证寄存器是否可读写,对比GDB操作结果
内容的提问来源于stack exchange,提问作者venkatakrishs

