如何使用嵌入式 STM32F769I-DISCO 麦克风

描述

在这一部分中,我们将使用的软件是STM32CubeIDE和STM32CubeMX。

要按照安装说明进行操作,请参阅此 wiki 页面工具安装。

1.2启动项目↑

要创建项目,请启动STM32CubeMX,然后在主页上单击访问板选择器使用部件号搜索字段选择特定板STM32F769I-DISCO,如下图所示。

嵌入式

嵌入式

1.3配置开发板↑

下一步是设置正确的参数以创建第一个录音和收听从嵌入式 STM32F769I-DISCO 麦克风获得的声音。

让我们开始配置DFSDM通道和过滤器。

嵌入式

信息

DFSDM 是 Sigma-Delta 调制器的数字滤波器,它从外部数据执行数字信号处理,在本教程中,它是麦克风采集的外部数据。

对于通道 1,请设置以下参数:

模式:来自 ch1 的输入和内部时钟作为入口

通道 1 参数:

右位移位:2

模拟看门狗参数:

过采样 10

输出时钟:

选择 :输出时钟源是音频时钟

分频器 = 4

对于通道 0,请设置以下参数:

模式 :从 CH0 和内部时钟输入

通道 0 参数:

带下降沿的 SPI类型

SPI 时钟:内部 SPI 时钟

右位移位:2

模拟看门狗参数:

过采样:10

输出时钟:

选择 :音频时钟

分频器= 4

嵌入式

稍后,让我们配置使用的过滤器。

对于过滤器 0,请设置以下参数:

常规频道选择:

常规频道部分:Channel1

启动常规转换的触发器:软件触发器

快速模式:启用

注入通道选择:

通道 1 作为注入通道:启用

启动注入转换的触发器:软件触发器

过滤器参数:

Sinc 顺序:Sinc 3 滤波器类型

福斯尔:64

对于过滤器 1,请设置以下参数:

常规频道选择:

常规频道部分:Channel1

触发以开始常规转换:与 DFSDM0 同步

快速模式:启用

注入通道选择:

Channel0 作为注入通道:启用

启动注入转换的触发器:软件触发器

扫描模式:启用

过滤器参数:

Sinc 顺序:Sinc 3 滤波器类型

福斯尔:64

现在是配置SAI外设的时候了。

嵌入式

信息

SAI 是串行音频接口,它提供一个接口,允许微控制器与外部音频设备(例如放大器、ADC、DAC 或音频处理器)进行通信。

在 Pinout & Configuration 选项卡中,单击SAI以显示Mode 和 Configuration面板并使用以下参数配置 SAI 参数:

音频= 44

插槽大小= 数据大小

插槽活动= 用户设置:0&1

嵌入式

在项目管理器视图中,配置项目设置:重命名应用程序,选择 STM32CubeIDE 作为工具链,然后单击生成代码。

启动项目后,请按照以下步骤创建应用程序:

在Drivers文件夹中的项目目录中创建一个新文件夹并将其命名为BSP。

从STM32CubeMX下载的STM32CubeF7 MCU包中,复制目录下的Components文件夹:C:UsersUserNameSTM32CubeRepositorySTM32Cube_FW_F7_V1.16.0DriversBSP,粘贴到项目目录下的BSP文件夹中。

在BSP中创建一个名为STM32F769I-Discovery的新文件夹,并从以下目录复制两个文件:stm32f769i_discovery.c及其头文件stm32f769i_discovery.h : C:UsersUserNameSTM32CubeRepositorySTM32Cube_FW_F7_V1.16.0DriversBSP STM32F769I-Discovery并将它们放在STM32F769I-Discovery文件夹中。

从“项目”菜单或“文件”菜单,转到“属性”》“C/C++ 构建”》“设置”》“工具设置”》“MCU GCC 编译器”》“包含路径”

嵌入式

添加以下内容,如下图所示:

嵌入式

在main.h文件中添加以下内容:

#include “stm32f7xx_hal.h” #include “stm32f769i_discovery.h” #include “。./Components/Common/audio.h” #include “。./Components/wm8994/wm8994.h”

在 main.c 文件中添加以下声明:

#define SaturaLH(N, L, H) (((N)《(L))?(L):(((N)》(H))?(H):(N))) int32_t LeftRecBuff [ 2048 ] ; int32_t RightRecBuff [ 2048 ]; int16_t PlayBuff [ 4096 ]; uint32_t DmaLeftRecHalfBuffCplt = 0 ; uint32_t DmaLeftRecBuffCplt = 0 ; uint32_t DmaRightRecHalfBuffCplt = 0 ; uint32_t DmaRightRecBuffCplt = 0 ; uint32_t PlaybackStarted = 0 ; AUDIO_DrvTypeDef * audio_drv ;

添加以下函数代码:

void HAL_DFSDM_FilterRegConvHalfCpltCallback ( DFSDM_Filter_HandleTypeDef * hdfsdm_filter ) { if( hdfsdm_filter == & hdfsdm1_filter0 ) { DmaLeftRecHalfBuffCplt = 1 ; }

else { DmaRightRecHalfBuffCplt = 1 ; } }

在SAI的初始化函数中,添加以下代码,从麦克风设备读取信号:WM899,初始化音频驱动 */

if( WM8994_ID != wm8994_drv 。 ReadID ( AUDIO_I2C_ADDRESS )) { Error_Handler (); } audio_drv = & wm8994_drv ; audio_drv -》重置(AUDIO_I2C_ADDRESS );

if( 0 != audio_drv -》 Init ( AUDIO_I2C_ADDRESS , OUTPUT_DEVICE_HEADPHONE , 100 , AUDIO_FREQUENCY_22K )) { Error_Handler (); }

将i声明为uint32_t后,在While循环中添加以下代码:

if(( DmaLeftRecHalfBuffCplt == 1 ) && ( DmaRightRecHalfBuffCplt == 1 ))

{ for

( i = 0 ; i 《 1024 ; i ++ ) { PlayBuff [ 2 * i ] = SaturaLH (( LeftRecBuff [ i ] 》》 8 ) , - 32768 , 32767 ); PlayBuff [( 2 * i )+ 1 ] = SaturaLH (( RightRecBuff [ i ] 》》 8 ), - 32768 , 32767 ); } if( PlaybackStarted == 0 )

{ if

( 0 != audio_drv -》 Play ( AUDIO_I2C_ADDRESS , ( uint16_t * ) & PlayBuff [ 0 ], 4096 )) { Error_Handler (); } 如果

(HAL_OK != HAL_SAI_Transmit_DMA ( & hsai_BlockA1 , ( uint8_t * ) & PlayBuff [ 0 ], 4096 ))

{ Error_Handler (); } PlaybackStarted = 1 ; } DmaLeftRecHalfBuffCplt = 0 ; DmaRightRecHalfBuffCplt = 0 ; } 如果((DmaLeftRecBuffCplt == 1 ) && (DmaRightRecBuffCplt == 1 ))

{ for(i = 1024; i 《 2048; i++) { PlayBuff[2*i] = SaturaLH((LeftRecBuff[i] 》》 8), -32768, 32767); PlayBuff[(2*i)+1] = SaturaLH((RightRecBuff[i] 》》 8), -32768 , 32767 ); } DmaLeftRecBuffCplt = 0 ; DmaRightRecBuffCplt = 0 ; }

完成代码部分后,单击Buildand laterDebugthe program。

将耳机插入输出音频线插孔,尽情享受吧!

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分