在这一部分中,我们将使用的软件是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。
将耳机插入输出音频线插孔,尽情享受吧!