在这一部分中,我们将使用的软件是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。
将耳机插入输出音频线插孔,尽情享受吧!
腾讯在硅谷设立自动驾驶汽车研究团队 正在招兵买马
防丢神器:智能提醒,再也不怕丢三落四
采用IEEE 802.15.4实现射频放大电路的设计
汽车线束端子压接电压降的产生原因
基于LM3S101处理器的温度测量模块设计
如何使用嵌入式 STM32F769I-DISCO 麦克风
小米Note10核心配置信息曝光搭载骁龙855 Plus支持40W快充
多参数水质分析仪概述、用途、原理及参数
一文揭秘C语言的void指针
光线强弱检测实验
物联网的云优势有哪些?
随着物联网的快速发展,它改变了哪些行业的面貌
赛微电子:MEMS代工产能提升30%,MEMS晶圆价格快速上涨
智能魔镜,让你上瘾的镜子显示屏
“缺芯”环境下,国产MCU迎来窗口期
电梯安全无线监控方案
LDO基础知识:电源抑制比
通过智能家居魔镜的应用来让家里的设备互动起来
大兴机场积极尝试引入探鸟雷达技术
如何将弱电、安防、监控和综合布线故障和失误减至最低