调用GPIO引脚与SDK的sample代码实现开发板的音频录制与播放

目录

一、gpio引脚的配置

1、gpio的介绍

2、gpio的规则

 3、gpio用法示例(LED)

二、SDK的sample代码功能运行

1、准备阶段

2、执行阶段 

三、所遇问题

1、文件不存在

2、引脚错误

3、资源占用 

4、型号对应

5、电平取反

四、总结


一、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灯测试。其中遇到了引脚错误与型号不对应等许多棘手问题,好在借助大佬的力量成功解决,我与大佬真厉害( •̀ ω •́ )✧

主要还是因为信息过于闭塞,与同伴的交流太少了,像本篇型号对应的原理图我手上压根儿就没有,哎😔不在沉默中爆发,就在沉默中灭亡。还有就是观察不够细节,看完原理图连简单的电平取反都没注意,虽然原理图信息很多,但对于相关的信息还是应该更仔细一些才行。

  • 25
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值