在這一部分中,我們將使用的軟件是STM32CubeIDE和STM32CubeMX。
要按照安裝說明進(jìn)行操作,請參閱此 wiki 頁面工具安裝。
1.2啟動(dòng)項(xiàng)目↑
要?jiǎng)?chuàng)建項(xiàng)目,請啟動(dòng)STM32CubeMX,然后在主頁上單擊訪問板選擇器使用部件號搜索字段選擇特定板STM32F769I-DISCO,如下圖所示。
1.3配置開發(fā)板↑
下一步是設(shè)置正確的參數(shù)以創(chuàng)建第一個(gè)錄音和收聽從嵌入式 STM32F769I-DISCO 麥克風(fēng)獲得的聲音。
讓我們開始配置DFSDM通道和過濾器。
DFSDM 是 Sigma-Delta 調(diào)制器的數(shù)字濾波器,它從外部數(shù)據(jù)執(zhí)行數(shù)字信號處理,在本教程中,它是麥克風(fēng)采集的外部數(shù)據(jù)。
對于通道 1,請?jiān)O(shè)置以下參數(shù):
模式:來自 ch1 的輸入和內(nèi)部時(shí)鐘作為入口
通道 1 參數(shù):
右位移位:2
過采樣 10
輸出時(shí)鐘:
選擇 :輸出時(shí)鐘源是音頻時(shí)鐘
分頻器 = 4
對于通道 0,請?jiān)O(shè)置以下參數(shù):
模式 :從 CH0 和內(nèi)部時(shí)鐘輸入
通道 0 參數(shù):
帶下降沿的 SPI類型
SPI 時(shí)鐘:內(nèi)部 SPI 時(shí)鐘
右位移位:2
模擬看門狗參數(shù):
過采樣:10
輸出時(shí)鐘:
選擇 :音頻時(shí)鐘
分頻器= 4
稍后,讓我們配置使用的過濾器。
對于過濾器 0,請?jiān)O(shè)置以下參數(shù):
常規(guī)頻道選擇:
常規(guī)頻道部分:Channel1
啟動(dòng)常規(guī)轉(zhuǎn)換的觸發(fā)器:軟件觸發(fā)器
快速模式:啟用
注入通道選擇:
通道 1 作為注入通道:啟用
啟動(dòng)注入轉(zhuǎn)換的觸發(fā)器:軟件觸發(fā)器
過濾器參數(shù):
Sinc 順序:Sinc 3 濾波器類型
福斯?fàn)枺?4
對于過濾器 1,請?jiān)O(shè)置以下參數(shù):
常規(guī)頻道選擇:
常規(guī)頻道部分:Channel1
觸發(fā)以開始常規(guī)轉(zhuǎn)換:與 DFSDM0 同步
快速模式:啟用
注入通道選擇:
Channel0 作為注入通道:啟用
啟動(dòng)注入轉(zhuǎn)換的觸發(fā)器:軟件觸發(fā)器
掃描模式:啟用
過濾器參數(shù):
Sinc 順序:Sinc 3 濾波器類型
福斯?fàn)枺?4
現(xiàn)在是配置SAI外設(shè)的時(shí)候了。
信息
SAI 是串行音頻接口,它提供一個(gè)接口,允許微控制器與外部音頻設(shè)備(例如放大器、ADC、DAC 或音頻處理器)進(jìn)行通信。
在 Pinout & Configuration 選項(xiàng)卡中,單擊SAI以顯示Mode 和 Configuration面板并使用以下參數(shù)配置 SAI 參數(shù):
音頻= 44
插槽大小= 數(shù)據(jù)大小
插槽活動(dòng)= 用戶設(shè)置:0&1
在項(xiàng)目管理器視圖中,配置項(xiàng)目設(shè)置:重命名應(yīng)用程序,選擇 STM32CubeIDE 作為工具鏈,然后單擊生成代碼。
啟動(dòng)項(xiàng)目后,請按照以下步驟創(chuàng)建應(yīng)用程序:
在Drivers文件夾中的項(xiàng)目目錄中創(chuàng)建一個(gè)新文件夾并將其命名為BSP。
從STM32CubeMX下載的STM32CubeF7 MCU包中,復(fù)制目錄下的Components文件夾:C:UsersUserNameSTM32CubeRepositorySTM32Cube_FW_F7_V1.16.0DriversBSP,粘貼到項(xiàng)目目錄下的BSP文件夾中。
在BSP中創(chuàng)建一個(gè)名為STM32F769I-Discovery的新文件夾,并從以下目錄復(fù)制兩個(gè)文件:stm32f769i_discovery.c及其頭文件stm32f769i_discovery.h : C:UsersUserNameSTM32CubeRepositorySTM32Cube_FW_F7_V1.16.0DriversBSP STM32F769I-Discovery并將它們放在STM32F769I-Discovery文件夾中。
從“項(xiàng)目”菜單或“文件”菜單,轉(zhuǎn)到“屬性”》“C/C++ 構(gòu)建”》“設(shè)置”》“工具設(shè)置”》“MCU GCC 編譯器”》“包含路徑”
添加以下內(nèi)容,如下圖所示:
在main.h文件中添加以下內(nèi)容:
#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 ;
添加以下函數(shù)代碼:
void HAL_DFSDM_FilterRegConvHalfCpltCallback ( DFSDM_Filter_HandleTypeDef * hdfsdm_filter ) { if( hdfsdm_filter == & hdfsdm1_filter0 ) { DmaLeftRecHalfBuffCplt = 1 ; }
else { DmaRightRecHalfBuffCplt = 1 ; } }
在SAI的初始化函數(shù)中,添加以下代碼,從麥克風(fēng)設(shè)備讀取信號:WM899,初始化音頻驅(qū)動(dòng) */
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循環(huán)中添加以下代碼:
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。
將耳機(jī)插入輸出音頻線插孔,盡情享受吧!
-
嵌入式
+關(guān)注
關(guān)注
5060文章
18983瀏覽量
302291 -
麥克風(fēng)
+關(guān)注
關(guān)注
15文章
630瀏覽量
54746 -
STM32
+關(guān)注
關(guān)注
2265文章
10858瀏覽量
354425
發(fā)布評論請先 登錄
相關(guān)推薦
評論