基于 STM32F103C8T6 对音频数据的 Flash 读取与 DAC 播放
文章內(nèi)容:
目錄
- 1 項目準備
- 1.1 具體要求
- 1.2 項目環(huán)境
- 2 原理簡介
- 2.1 STM32 的內(nèi)部 FLASH
- 2.2 STM32 的 DAC 通道
- 2.2.1 何為 DAC
- 2.2.2 STM32 的 DAC 模塊
- 3 Flash 地址空間的數(shù)據(jù)讀取
- 3.1 利用 CubeMX 創(chuàng)建工程
- 3.2 keil 添加文件
- 3.3 STLink 調(diào)試
- 3.3.1 STLink 連接并燒錄
- 3.3.2 調(diào)試
- 4 基于 Flash 的提示音 DAC 播放
- 4.1 使用 DAC 產(chǎn)生 2khz 周期的正弦波輸出
- 4.2 使用 DAC 輸出數(shù)字音頻歌曲數(shù)據(jù)轉(zhuǎn)換為模擬音頻波形輸出
- 5 總結
- 6 參考資料
1 項目準備
1.1 具體要求
Flash 地址空間的數(shù)據(jù)讀取。 STM32F103C8T6 只有 20KB 內(nèi)存(RAM)供程序代碼和數(shù)組變量存放,因此,針對內(nèi)部 Flash 的總計 64KB 存儲空間(地址從 0x08000000 開始),運行一次寫入 8KB 數(shù)據(jù),總計復位運行代碼 4 次,將 32KB 數(shù)據(jù)寫入 Flash。并驗證寫入數(shù)據(jù)的正確性和讀寫速率。
(用cubemx寫stm32f103c8t6的內(nèi)部Flash)
基于片內(nèi) Flash 的提示音播放程序。
1)實驗數(shù)據(jù)準備:用 Adobe audition 或 goldwave 等音頻編輯軟件錄制“您好歡迎光臨!”的幾秒鐘的聲音(8khz 采樣、8bit 量化編碼的單聲道wav格式),確保音頻數(shù)據(jù)盡量小(最大不超 64KB)。然后編程將其分批次寫入 STM32F103C8T6 芯片內(nèi)部 Flash 區(qū)域。
2)數(shù)字音頻還原播放任務:編程讀取此段音頻,分別通過 STM32F103C8T6 自帶的 DAC 通道,轉(zhuǎn)換為模擬音頻進行播放,并用示波器觀察波形,用耳機/喇叭收聽,評判音樂還原效果;
提示:
建議先用單音音頻(比如 2000Hz 的正弦波)的 wav 數(shù)據(jù)進行實驗,通過 DAC 或 PCM 音頻模塊能夠基本還原出原始正弦波聲音后,再用語音和音樂信號進行實驗。
1.2 項目環(huán)境
軟件準備:
- STM32CubeMX
- Keil 5
- Adobe audition 2022
(安裝鏈接:https://mp.weixin.qq.com/s/S7IlVsRJZ_j1oq9W1X4ZxA) - UltraEdit
(安裝鏈接:https://pan.baidu.com/s/176szE42lpj2OQ-9Cm8vUgQ 提取碼:luha) - notepad++
(安裝鏈接:https://pan.baidu.com/s/1kbYTzH1IqNJRgKwhN3K7zw 提取碼:luha)
2 原理簡介
硬件準備:
- STM32F103C8T6 核心板
- STlink(安裝鏈接:https://pan.baidu.com/s/1XeKTh1VNQo4JapX7HpGjsw 提取碼:luha )
2.1 STM32 的內(nèi)部 FLASH
- 在 STM32 芯片內(nèi)部有一個 FLASH 存儲器,它主要用于存儲代碼,我們在電腦上編寫好應用程序后,使用下載器把編譯后的代碼文件燒錄到該內(nèi)部 FLASH 中,由于 FLASH 存儲器的內(nèi)容在掉電后不會丟失,芯片重新上電復位后,內(nèi)核可從內(nèi)部 FLASH 中加載代碼并運行。
- STM32 的內(nèi)部框架圖
2.2 STM32 的 DAC 通道
2.2.1 何為 DAC
- DAC 為數(shù)字/模擬轉(zhuǎn)換模塊,故名思議,它的作用就是把輸入的數(shù)字編碼,轉(zhuǎn)換成對應的模擬電壓輸出,它的功能與 ADC 相反。在常見的數(shù)字信號系統(tǒng)中,大部分傳感器信號被化成電壓信號,而 ADC 把電壓模擬信號轉(zhuǎn)換成易于計算機存儲、處理的數(shù)字編碼,由計算機處理完成后,再由 DAC 輸出電壓模擬信號,該電壓模擬信號常常用來驅(qū)動某些執(zhí)行器件,使人類易于感知。如音頻信號的采集及還原就是這樣一個過程。
- STM32 具有片上 DAC 外設,它的分辨率可配置為 8 位或 12 位的數(shù)字輸入信號,具有兩個 DAC 輸出通道,這兩個通道互不影響,每個通道都可以使用 DMA 功能,都具有出錯檢測能力,可外部觸發(fā)。
2.2.2 STM32 的 DAC 模塊
DAC 功能框圖:
整個 DAC 模塊圍繞框圖下方的“數(shù)字至模擬轉(zhuǎn)換器 x”展開,它的左邊分別是參考電源的引腳:𝑉𝐷𝐷𝐴、𝑉𝑆𝑆𝐴 及 𝑉𝑟𝑒𝑓+,其中 STM32 的 DAC 規(guī)定了它的參考電壓 𝑉𝑟𝑒𝑓+ 輸入范圍為 2.4——3.3V。“數(shù)字至模擬轉(zhuǎn)換器 x”的輸入為 DAC 的數(shù)據(jù)寄存器“DORx”的數(shù)字編碼,經(jīng)過它轉(zhuǎn)換得的模擬信號由圖中右側(cè)的“DAC_OUTx”輸出。而數(shù)據(jù)寄存器“DORx”又受“控制邏輯”支配,它可以控制數(shù)據(jù)寄存器加入一些偽噪聲信號或配置產(chǎn)生三角波信號。
更多詳細介紹可以參考資料:零死角玩轉(zhuǎn)STM32—F103指南者 提取碼:luha
3 Flash 地址空間的數(shù)據(jù)讀取
3.1 利用 CubeMX 創(chuàng)建工程
- 配置 SYS
- 配置 RCC
- 配置引腳
- 設置堆棧大小
- 導出后打開
3.2 keil 添加文件
工程源碼鏈接(注意:flash.h文件需要自己重新加入到路徑中)
鏈接:https://pan.baidu.com/s/1X2U1c_oLlJ9gyqeRgakoVw
提取碼:luha
-
將 flash.c 及 flash.h 加入到工程中
-
在 main.c 文件中添加如下部分代碼
-
點擊編譯,接著使用 ST-Link 調(diào)試
3.3 STLink 調(diào)試
3.3.1 STLink 連接并燒錄
- STLink 與 STM32F103 接線
| SWCLK/TCK | SWCLK/TCK |
| SWDIO/TMS | SWDIO/TMS |
| GND | GND |
| VCC | VCC |
- 連接好的實際電路圖如下:
- 準備好 ST-Link 驅(qū)動
【鏈接:https://pan.baidu.com/s/1XeKTh1VNQo4JapX7HpGjsw 提取碼:luha 】
將 BOOT1 置 0,上電之后,可以在設備管理器中看到 STLink 已經(jīng)連接成功
- 配置 Keil 工程
點擊魔法棒設置,選擇 ST-Link Debugger調(diào)試器
再點擊 Setting 按鈕,可見右側(cè) IDCODE 有顯示,表示連接成功
- 點擊燒錄按鍵
可見燒錄成功。
3.3.2 調(diào)試
- 點擊 debug,依次點擊View->memory windows->memory 1,打開內(nèi)存觀察窗口,并在地址欄中輸入:0x800c000,觀察將要修改的 flash 區(qū)間區(qū)容:
- 依次點擊View->Watch windows->Watch 1,View->Watch windows->Watch 2,打開兩個變量觀察窗口,將變量 FlashWBuff 和 FlashRBuff 分別加入到 Watch 1 觀察窗口和 Watch 2 觀察窗口:
- 點擊全速運行程序,可以看到數(shù)組 FlashRBuff 中內(nèi)容與數(shù)組 FlashWBuff 中內(nèi)容一致
4 基于 Flash 的提示音 DAC 播放
4.1 使用 DAC 產(chǎn)生 2khz 周期的正弦波輸出
建議先用單音音頻(比如 2000Hz 的正弦波)的wav 數(shù)據(jù)進行實驗,通過 DAC 或 PCM 音頻模塊能夠基本還原出原始正弦波聲音后,再用語音和音樂信號進行實驗。
-
新建文件
依次點擊文件->新建->音頻文件,完成下圖所示修改
-
依次點擊效果->生成->音調(diào),出現(xiàn)下面視圖
-
修改如圖所示的配置,并點擊確定
-
依次點擊文件->導出->文件,設置導出為 wav 文件
-
用 UltraEdit 打開剛才保存的wav文件,界面視圖如下
-
點擊 CTRL+A全選,鼠標右鍵,選擇十六進制復制選定視圖
-
將內(nèi)容粘貼到一個新建文件中
-
在新建文件中,CTRL+A,鼠標右鍵,選擇范圍,輸入起始的行號和列號,選擇內(nèi)容
-
復制到 notepad++ 中
-
在需要添加內(nèi)容的位置,點擊alt+c
-
添加結果如下:
-
刪除不需要的尾行,將該文本復制下來。
-
打開打開野火提供的樣例程序——DAC 輸出正弦波。
(鏈接:https://pan.baidu.com/s/1ixWoW8xyMe3_hyWXpkd_Tg
提取碼:luha) -
將文本復制到 keil 文件的 uint16_t Sine12bit[] 數(shù)組中去,并刪掉中括號里面的數(shù)據(jù)。
-
編譯工程文件,無錯
-
燒錄
-
最后用示波器顯示波形
4.2 使用 DAC 輸出數(shù)字音頻歌曲數(shù)據(jù)轉(zhuǎn)換為模擬音頻波形輸出
- 使用 Audition 截取一段喜歡的音樂
選擇文件->打開,找到對應的音樂 - 選中一段,然后右鍵,選擇存儲選區(qū),接著更改采用類型
- 使用 UltraEdit 得到相關數(shù)據(jù)
做法同上 - 使用 notepad++ 添加相關內(nèi)容
做法同上 - 添加數(shù)據(jù)
做法同上 - 編譯燒錄
- 使用示波器觀察得到的波形
5 總結
本文學習了 STM32F103C8T6 對音頻數(shù)據(jù)的 Flash 讀取與 DAC 播放,了解了 Flash 的原理。這次任務的量很多,操作也很繁瑣。
6 參考資料
總結
以上是生活随笔為你收集整理的基于 STM32F103C8T6 对音频数据的 Flash 读取与 DAC 播放的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 如何进行用户体验的评估分析
- 下一篇: uniapp点击回复弹起键盘输入