在這一部分中,我們將使用的軟件是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。
將耳機插入輸出音頻線插孔,盡情享受吧!
-
嵌入式
+關注
關注
5143文章
19571瀏覽量
315694 -
麥克風
+關注
關注
15文章
659瀏覽量
55610 -
STM32
+關注
關注
2290文章
11018瀏覽量
362958
發布評論請先 登錄
STM32F769I-DISCO在代碼中為什么無法控制引腳狀態?
STM32F769I-DISCO開發板CoreMark跑分與固件恢復
基于ARM Cortex-M7內核的STM32F769NI MCU發現套件STM32F769I-DISCO
評測:STM32F769I-DISCO接入機智云,實現IoT開發遠程控制等功能
STM32F769I-DISCO評測&機智云物聯網云服務體驗
STM32F769I-DISCO開發套件
STM32F769I-DISCO外部連接器(“JP1”)的最大電流消耗和功率輸入是多少?
如何使用“USB HS”連接器用手機電池為STM32F769I-DISCO供電?
如何使用帶有FatFS和USB大容量存儲的STM32F769I-DISCO板呢
STM32F769I-DISCO斷電后無法連接目標的原因?
基于STM32F769I-DISCO微控制器的參考設計

你會不會使用STM32CubeMX建立STM32F769I-DISCO的工程?

評論