Download presentation
Presentation is loading. Please wait.
Published byHarjanti Darmali Modified 6年之前
1
淘宝店铺:http://eboard.taobao.com 技术论坛:www.openedv.com
《手把手教你学STM32》 主讲人 :正点原子团队 硬件平台:正点原子STM32开发板 版权所有:广州市星翼电子科技有限公司 淘宝店铺: 技术论坛: 开源电子网 公众平台:“正点原子” 官方网站: 联系电话: ddddd ALIENTEK 淘宝店铺: 技术论坛:
2
淘宝店铺:http://eboard.taobao.com 技术论坛:www.openedv.com
《手把手教你学STM32》 录音机实验(WM8978) 适用平台 STM32F1xx 开发板 (正点原子) STM32F4xx 开发板 (正点原子) ddddd 淘宝店铺: 技术论坛:
3
本视频重点参考资料 参考资料: 淘宝店铺:http://eboard.taobao.com 技术论坛:www.openedv.com
WAV格式/WM8978/I2S等的介绍,请参考此例程(及视频) 参考资料: 1,探索者STM32F407开发板 《STM32F4开发指南-库函数版本》——音乐播放器实验 《STM32F4开发指南-库函数版本》——录音机实验 2,I2S参考资料 《STM32F4xx中文参考手册》-第27章 串行外设接口(SPI) 3,WAV文件格式参考资料 见光盘:软件资料WAV文件格式说明 WAV文件格式分析与应用.pdf 4,WM8978参考资料 见光盘:硬件资料芯片资料 ① WM8978G.pdf ② WM8978中文资料.doc 淘宝店铺: 技术论坛:
4
淘宝店铺:http://eboard.taobao.com 技术论坛:www.openedv.com
目录 I2S录音简介 1 硬件连接 2 源码讲解&例程测试 3 淘宝店铺: 技术论坛:
5
淘宝店铺:http://eboard.taobao.com 技术论坛:www.openedv.com
1、I2S录音简介-知识点说明 本例程要实现一个简单的录音机(录制.wav文件),需要用到的硬件有:WM8978、I2S、SD卡等,另外,对WAV文件格式,也需要有一个比较详细的了解。 这些知识点基本上在我们的:音乐播放器实验,这个例程就已经给大家做过详细介绍了,这里我们只补充一些知识点,如有不懂的,请参考:音乐播放器实验 。 淘宝店铺: 技术论坛:
6
淘宝店铺:http://eboard.taobao.com 技术论坛:www.openedv.com
1、 I2S录音简介-录音原理 本例程,要实现wav文件录音,原理如下:通过WM8978的ADC采集麦克风信号,转换成数字信号,通过I2S接口,传输给STM32F4,然后软件编码成WAV文件格式,存储在SD卡,完成WAV录音。 探索者STM32F4开发板集成了WM8978并自带了一个麦克风(咪头),连接在2个差分输入通道(LIP/LIN和RIP/RIN,见开发板原理图) 在程序上,我们采用立体声WAV录音,不过,左右声道的音源都是一样的,录音出来的虽然是立体声WAV文件,听起来就是个单声道效果(因为左右声道数据完全一样)。 淘宝店铺: 技术论坛:
7
淘宝店铺:http://eboard.taobao.com 技术论坛:www.openedv.com
1、I2S录音简介-WM8978录音配置 WM8978要开启MIC录音,并通过I2S接口将数据输出给STM32F4,需要对WM8978的寄存器进行一系列配置,需要用到的 寄存器有:R0、R1、R2、R4、R6、R14、R44、R45、R47和R49等。 接下来,我们就给大家简单介绍下这些寄存器。 淘宝店铺: 技术论坛:
8
1、I2S录音简介-WM8978寄存器 R0寄存器(00h)
该寄存器用于控制WM8978的软复位,写任意值到该寄存器地址,即可实现软复位WM8978。 注意:WM8978的寄存器是9位的!!而且是不可读的,只可以写,不可读! 淘宝店铺: 技术论坛:
9
1、I2S录音简介-WM8978寄存器 R1寄存器(01h)
这两个位都要设置为1,开启麦克风(MIC)偏置,使能模拟放大器偏置 淘宝店铺: 技术论坛:
10
淘宝店铺:http://eboard.taobao.com 技术论坛:www.openedv.com
1、I2S录音简介-WM8978寄存器 R2寄存器(02h) 该寄存器要设置SLEEP(bit6)、INPGAENR(bit3)、INPGAENL(bit2)、ADCENR(bit1)和ADCENL(bit0)等五个位。SLEEP设置为0,进入正常工作模式;INPGAENR和INPGAENL设置为1,使能PGA放大器;ADCENL和ADCENR设置为1,使能左右通道ADC。 淘宝店铺: 技术论坛:
11
淘宝店铺:http://eboard.taobao.com 技术论坛:www.openedv.com
1、I2S录音简介-WM8978寄存器 R4寄存器(04h) 该寄存器要设置WL(bit6:5)和FMT(bit4:3)等4个位。WL(bit6:5)用于设置字长(即设置音频数据有效位数),00表示16位音频,10表示24位音频;FMT(bit4:3)用于设置I2S音频数据格式(模式),我们一般设置为10,表示I2S格式,即飞利浦模式。 淘宝店铺: 技术论坛:
12
淘宝店铺:http://eboard.taobao.com 技术论坛:www.openedv.com
1、I2S录音简介-WM8978寄存器 R6寄存器(06h) 该寄存器直接全部设置为0即可,设置MCLK和BCLK都来自外部,即由STM32F4提供 淘宝店铺: 技术论坛:
13
淘宝店铺:http://eboard.taobao.com 技术论坛:www.openedv.com
1、I2S录音简介-WM8978寄存器 R14寄存器(0Eh) 该寄存器只要设置ADCOSR128(bit3)为1即可,使ADC得到最好的SNR。 淘宝店铺: 技术论坛:
14
淘宝店铺:http://eboard.taobao.com 技术论坛:www.openedv.com
1、I2S录音简介-WM8978寄存器 R44寄存器(2Ch) 该寄存器我们要设置LIP2INPPGA(bit0)、LIN2INPPGA(bit1)、RIP2INPPGA(bit4)和RIN2INPPGA(bit5)等4个位,将这4个位都设置为1,将左右通道差分输入接入IP PGA。 淘宝店铺: 技术论坛:
15
淘宝店铺:http://eboard.taobao.com 技术论坛:www.openedv.com
1、I2S录音简介-WM8978寄存器 R45&R46寄存器(2Dh&2Eh) 上图为R45寄存器描述,用于设置左通道PGA增益(调节麦克风增益),R46控制右通道。这两个寄存器的最高位(INPPGAUPDATE)用于设置是否更新左右通道的增益,最低6位用于设置通道的增益,我们可以先设置好两个寄存器的增益,最后设置其中一个寄存器最高位为1,即可更新增益设置。 淘宝店铺: 技术论坛:
16
淘宝店铺:http://eboard.taobao.com 技术论坛:www.openedv.com
1、I2S录音简介-WM8978寄存器 R47&R48寄存器(2Fh&30h) 上图为R47寄存器描述,用于设置左通道,另一个用于设置右通道。这两个寄存器,我们只关心其最高位(bit8),都设置为1,可以让左右通道的MIC各获得20dB的增益。 淘宝店铺: 技术论坛:
17
淘宝店铺:http://eboard.taobao.com 技术论坛:www.openedv.com
1、I2S录音简介-WM8978寄存器 R49寄存器(31h) 该寄存器我们只需 设置TSDEN(bit1)这个位,设置为1,开启过热保护 。 经过这些寄存器的设置,即可实现WM8978采集麦克风声音,通过ADC转换成数字信号,输出给IIS接口,实现录音,其他:3D、EQ等设置,这里就不再介绍了,请大家参考:WM8978G.pdf 淘宝店铺: 技术论坛:
18
淘宝店铺:http://eboard.taobao.com 技术论坛:www.openedv.com
1、I2S录音简介-F4 I2S配置 STM32F4的全双工I2S需要用到扩展的I2Sx_ext(x=2/3),和I2Sx组成全双工I2S。在全双工模式下,I2Sx向I2Sx_ext提供CK和WS时钟信号。 我们需要向WM8978提供WS,CK和MCK等时钟,同时又要录音,所以使用全双工模式。主I2Sx循环发送数据0X0000,给WM8978,以产生CK、WS和MCK等信号,从I2Sx_ext,则接收来自WM8978的ADC数据(I2Sxext_SD),并保存到SD卡,实现录音。 本例程,我们采用I2S2的全双工模式来录音,I2S2的相关寄存器,在音乐播放器实验已做了详细介绍。至于I2S2ext的寄存器,则有一套和I2S2一样的寄存器,不过仅少数几个对我们有用,他们是:I2S2ext_I2SCFGR、I2S2ext_CR2和I2S2ext_DR,这三个寄存器对应位的功能和描述,完全同I2S2。具体寄存器描述,请参考:《STM32F4xx中文参考手册》第27.5节。 淘宝店铺: 技术论坛:
19
淘宝店铺:http://eboard.taobao.com 技术论坛:www.openedv.com
1、I2S录音简介-I2S录音简要步骤-1 1)初始化WM8978 这个过程就是配置前面所讲的WM8978相关寄存器,让WM8978的ADC以及其模拟部分工作起来。 2)初始化I2S 由于要用到I2S2的全双工模式,所以,I2S2和I2S2ext都需要配置,其中I2S2配置为主机发送模式,I2S2ext设置为从机接收模式。他们的其他配置(I2S标准、时钟空闲电平和数据帧长)基本一样,只是一个是发送一个是接收,且都要使能DMA。同时,还需要设置音频采样率,不过这个只需要设置I2S2即可,还是通过音乐播放器实验所介绍的查表法设置。 3)设置发送和接收DMA 放音和录音都采用DMA传输数据,放音部分DMA,配置同音乐播放器实验一样,不过不用开启DMA传输完成中断。对于录音,使用DMA1数据流3的通道3实现的DMA数据接收,将DMA1数据流3设置为:双缓冲循环模式,外设和存储器都是16位宽,并开启DMA传输完成中断(方便接收数据)。 淘宝店铺: 技术论坛:
20
1、I2S录音简介-I2S录音简要步骤-2 4)编写接收通道DMA传输完成中断服务函数 为了方便接收音频数据,本例程,我们使用了DMA双缓冲接收数据,并使能DMA传输完成中断,每当一个缓冲接数据满了,硬件自动切换为下一个缓冲,同时进入中断服务函数,将已满缓冲的数据写入SD卡的wav文件。处理过程简图,如下图所示: 必须保证:程序保存时间≤DMA接收满的时间 淘宝店铺: 技术论坛:
21
淘宝店铺:http://eboard.taobao.com 技术论坛:www.openedv.com
1、I2S录音简介-I2S录音简要步骤-3 5)创建WAV文件,并保存wav头 通过前面4步操作,其实就可以开始读取音频数据了,不过在录音之前,我们得先在创建一个新的文件,并写入wav头,然后才能开始写入读取到的PCM音频数据。 6)开启DMA传输,接收数据 然后,我们就只需要开启DMA传输,然后及时将I2S2ext读到的数据写入到SD卡之前新建的wav文件里面,就可以实现录音了。 7)计算整个文件大小,重新保存wav头并关闭文件 在结束录音的时候,我们必须知道本次录音的大小(数据大小和整个文件大小),然后更新wav头,重新写入文件,注意:FATFS,在文件创建之后,必须调用f_close,文件才会真正体现在文件系统里面,否则是不会写入的!所以最后还需要调用f_close,以保存文件。。 淘宝店铺: 技术论坛:
22
淘宝店铺:http://eboard.taobao.com 技术论坛:www.openedv.com
2、硬件连接-STM32F4硬件连接 探索者STM32F407开发板,板载了WM8978芯片,硬件连接原理图如下: 淘宝店铺: 技术论坛:
23
淘宝店铺:http://eboard.taobao.com 技术论坛:www.openedv.com
3、源码讲解&例程测试-源码说明 探索者STM32F4开发板源码 光盘程序源码标准例程(库函数/寄存器)实验44 录音机实验 淘宝店铺: 技术论坛:
24
淘宝店铺:http://eboard.taobao.com 技术论坛:www.openedv.com
3、源码讲解&例程测试-I2S源码讲解 1,I2S2ext_Init函数 2,I2S2ext_RX_DMA_Init函数 3,I2S_Rec_Start函数 4,I2S_Rec_Stop函数 5,DMA1_Stream3_IRQHandler函数 淘宝店铺: 技术论坛:
25
淘宝店铺:http://eboard.taobao.com 技术论坛:www.openedv.com
3、源码讲解&例程测试-WAV录音源码讲解 1,recoder_wav_init函数 2,recoder_enter_rec_mode函数 3,rec_i2s_dma_rx_callback函数 4,wav_recorder函数 淘宝店铺: 技术论坛:
26
淘宝店铺:http://eboard.taobao.com 技术论坛:www.openedv.com
3、源码讲解&例程测试-main函数 main函数讲解 淘宝店铺: 技术论坛:
27
淘宝店铺:http://eboard.taobao.com 技术论坛:www.openedv.com
3、源码讲解&例程测试-例程测试 例程测试 淘宝店铺: 技术论坛:
28
淘宝店铺:http://eboard.taobao.com 技术论坛:www.openedv.com
谢谢您对“正点原子”团队的支持 硬件平台:正点原子STM32开发板 版权所有:广州市星翼电子科技有限公司 淘宝店铺: 技术论坛: 淘宝店铺: 技术论坛:
Similar presentations