目录
一、gpio引脚的配置
1、gpio的介绍
GPIO是通用输入/输出引脚(General Purpose Input/Output)的缩写,是嵌入式系统中的一种常见引脚类型。GPIO的作用是允许CPU与外部设备进行通信,实现数据的输入和输出。通常情况下,这些引脚是可编程的,可以在软件层面上配置它们的功能。GPIO在嵌入式系统中的作用类似于PC上的USB接口或串口
2、gpio的规则
对于一般嵌入式Linux系统而言,gpio的子系统控制通常位于/sys/class/gpio目录下,我们可以利用子系统提供的功能来与用户空间进行交互
cd /sys/class/gpio #进入gpio子系统
通过在export写入引脚编号来导入对应引脚,对于已分组的引脚,遵从以下规则:
gpioN = (端口号 - 1)* 组内引脚总数 + 组内标号
举个例子,假设一组端口有32个gpio引脚,则
GPIOB_31 = (2-1)* 32 +31 = GPIO63
GPIOC_5 = (3-1)*32 + 5 = GPIO69
当然你也可以将 端口号 - 1 的A,B,C看作16进制然后减去10
而对于未分组的gpio引脚,一般是调用不到的,硬件上已经默认作为这个功能无法更改了。
3、gpio用法示例(LED)
输入以下指令调出gpio54
echo 54 >export #写入export调出GPIOB22
进入gpio54目录,会出现一些功能文件
主要便是direction文件控制gpio端口的方向,内容可以是 输入in 或者 输出out;还有value文件控制gpio引脚的电平,0为低电平,非0为高电平;然后是edge,中断的触发方式;active_low这个文件表示GPIO引脚的电平是否被设置为“活动低”(active low)。如果设置为1,则表示低电平(0V)是活动的电平;subsystem返回gpio目录;uevent事件通知。
将direction设为out,value设为1输出高电平启动
echo out >direction #输出模式
echo 1 >value #高电平
这时可以看到LED灯的颜色发生了变化
重新将value置为0,LED恢复到原始颜色
二、SDK的sample代码功能运行
1、准备阶段
利用交叉编译链编译SDK的sample代码,当然我这里的SDK里面已经写好了makefile,直接make一下就好。关于makefile部分见利用makefile实现多目录编译的三种方式
关于交叉编译部分见利用交叉编译链在开发板运行程序
然后再用tftp将编译好的可执行文件传入开发板并赋予执行权限,关于tftp部分见利用tftp实现开发板与Linux服务器的文件传输
2、执行阶段
先运行sample-Ai录制一段音频
得到一份pcm音频文件
然后进入gpio引脚目录导出GPIO的44号引脚
你问我引脚标号与功能咋知道的?查看你设备型号的原理图
进入gpio44目录内,将引脚设置为输出高电平模式
接着回到tmp目录运行sample-Ao程序播放pcm音频,没想到后面竟是痛苦的开始......
三、所遇问题
1、文件不存在
这是由于sample-Ao的代码编写只能读取ao_play.pcm文件,而我们录制的文件名为ai_record.pcm
将其改个名就好
然后发现设备没有任何声音
2、引脚错误
回到gpio目录进行检查,发现44号引脚的value值仍未0低电平
尝试修改,但无济于事
还记得本篇第一章第2节的gpio规则吗?对于未分组的gpio引脚,一般是调用不到的,硬件上已经默认作为这个功能无法更改了,即便调用到了,也无法通过一般方法进行修改。而44号引脚正是这样。而且HPOUT (Headphone Output),是耳机输出接口,用于连接耳机或耳塞,接口可能包括一个3.5毫米的耳机插孔,但硬件上没有耳机孔😭😭😭。
知道这点后,我再次查看设备原理图,终于找到第二个音频输出口speak引脚
引脚号为GPIO63 (2-1)*32 +31 =63,在我们导出63号引脚之前,先要取消44引脚的导出。
但 取消的引脚会保留已经设置好的状态而不会重置为初始状态
所以得先手动初始化再取消导出,如果不这样操作即便取消导出了44号引脚仍是out输出状态
接着像上面步骤一样导出63号引脚并设置为输出高电平
没想到在第一步导出就遇到了问题。
3、资源占用
sh: write error: Device or resource busy 意思为尝试执行写入操作到一个设备或资源时,该设备或资源当前正忙或被占用
这可能是由于使用的这个gpio口之前已经申请过了,所以再使用它时必须得在申请它的地方将其释放掉
然而它并没有申请过。当然我们也可以找出占用该引脚的进程然后kill关闭它,ps一下查看进程
发现shell启动后的进程进程与gpio引脚无关,那么gpio的63号口应该是内核启动时就被占用了,对于嵌入式内核部分我目前几乎没啥了解,于是只能去请教大佬
4、型号对应
大佬首先也是查了各种进程,发现找不到gpio63的占用,又对照了一下原理图,发出了灵魂质问:“你设备型号是对应的这个原理图吗?”而我只能默默的回一句:
“设备型号在哪看?”🤪🤪🤪
开发者对每个设备的型号烧写地址是的一个单独存放目录(我们是这样的),所以不能由某个常用指令直接显示,只能自行到该目录进行查看,对于我们这边来说,一般写在设备/mnt/mtd/product_type/目录下
对照一下设备原理图,果然不对应( ̄_, ̄ )
拿到正确原理图后,我也是不负众望终于找到了正确引脚GPIO52 =(2-1)*32 +20 =52
重复之前引脚申请设置步骤
播放pcm音频
然后没有任何声音!
不是,哥们(开发板)?what can i say?╰(艹皿艹 )
5、电平取反
喵~ (☞゚ヮ゚)☞ 请教大佬😘😘😘 ☜(゚ヮ゚☜)
然后默默翻到了原理图的下一页
SPEAK正对的SHDN引脚上有一杠,代表此处的电平取反,也就是低电平0
进入gpio52设置value值为0
后面再./sample-Ao播放pcm音频,完美,终于搞定了 〒▽〒
四、总结
本篇主要介绍了如何调用GPIO引脚与SDK的sample代码实现开发板的音频录制与播放,还利用gpio进行了简单的LED灯测试。其中遇到了引脚错误与型号不对应等许多棘手问题,好在借助大佬的力量成功解决,我与大佬真厉害( •̀ ω •́ )✧
主要还是因为信息过于闭塞,与同伴的交流太少了,像本篇型号对应的原理图我手上压根儿就没有,哎😔不在沉默中爆发,就在沉默中灭亡。还有就是观察不够细节,看完原理图连简单的电平取反都没注意,虽然原理图信息很多,但对于相关的信息还是应该更仔细一些才行。