文章目錄
- 一、題目要求
- 二、Flash地址空間的資料讀取
- 1、Flash原理
- 2、使用到的硬體及軟體
- 3、CubeMX工程
- 4、Keil代碼撰寫
- 5、STlink除錯說明
- 6、除錯
- 附:查找并選定要寫入Flash十六進制地址
- 三、基于片內Flash的提示音播放程式
- 1、使用DAC輸出周期2khz的正弦波
- 2、使用DAC輸出數字音頻歌曲資料轉換為模擬音頻波形輸出
- 總結
一、題目要求
1、Flash地址空間的資料讀取,stm32f103c8t6只有20KB 記憶體(RAM)供程式代碼和陣列變數存放,因此,針對內部Flash的總計64KB存盤空間(地址從0x08000000開始),運行一次寫入8KB資料,總計復位運行代碼4次,將32KB資料寫入Flash,并驗證寫入資料的正確性和讀寫速率,
2、基于片內Flash的提示音播放程式,
1)實驗資料準備:用Adobe audition或goldwave等音頻編輯軟體錄制“您好歡迎光臨!”的幾秒鐘的聲音(8khz采樣、8bit量化編碼的單聲道wav格式),確保音頻資料盡量小(最大不超64KB),然后編程將其分批次寫入stm32f103c8t6芯片內部flash區域,
2)數字音頻還原播放任務:編程讀取此段音頻,通過stm32f103c8t6自帶的DAC通道,轉換為模擬音頻進行播放,并用示波器觀察波形,用耳機/喇叭收聽,評判音樂還原效果;
提示:建議先用單音音頻(比如2000Hz的正弦波)的wav資料進行實驗,通過DAC或PCM音頻模塊能夠基本還原出原始正弦波聲音后,再用語音和音樂信號進行實驗,
二、Flash地址空間的資料讀取
1、Flash原理
不同型號的 STM32,其 FLASH 容量也有所不同,最小的只有 16K 位元組,最大的則達到了 1024K 位元組,市面上 STM32F1 開發板使用的芯片是 STM32F103系列,其 FLASH 容量一般為 512K 位元組,屬于大容量芯片,
Flash的編程原理都是只能將1寫為0,而不能將0寫為1,所以在進行Flash編程前,必須將對應的塊擦除,即將該塊的每一位都變為1,塊內所有位元組變為0xFF,
STM32F1 的閃存(Flash)模塊:主存盤器、資訊塊、閃存存盤器介面暫存器
①主存盤器,該部分用來存放代碼和資料常數(如 const 型別的資料),對于大容量產品,其被劃分為 256 頁,每頁 2K 位元組,注意,小容量和中容量產品則每頁只有 1K 位元組,
②資訊塊,該部分分為 2 個小部分,其中啟動程式代碼,是用來存盤 ST 自帶的啟動程式,用于串口下載代碼,當 BOOT0 接 V3.3, BOOT1 接 GND 的時候,運行的就是這部分代碼,用戶選擇位元組,則一般用于配置寫保護、讀保護等功能,
③閃存存盤器介面暫存器,該部分用于控制閃存讀寫等,是整個閃存模塊的控制機構,對主存盤器和資訊塊的寫入由內嵌的閃存編程/擦除控制器(FPEC)管理;編程與擦除的高電壓由內部產生,
在執行閃存寫操作時,任何對閃存的讀操作都會鎖住總線,在寫操作完成后讀操作才能正確地進行;既在進行寫或擦除操作時,不能進行代碼或資料的讀取操作,
2、使用到的硬體及軟體
STM32F103C8T6、STlink
軟體:Keil、STM32CubeMX
3、CubeMX工程
建立工程的具體操作不再贅述,這里只提幾個地方
→ 定時器配置

→ 管腳配置,對應外設c8t6本身設計好的PC13 LED燈

對應的GPIO設定

→ 設定堆疊大小

之后匯出即可
4、Keil代碼撰寫
工程原始碼鏈接(主:flash.h檔案需要自己重新加入到路徑中)
鏈接:https://pan.baidu.com/s/11Tn8TocHT8qithneDyKFIQ
提取碼:pmvn
將事先準備好的flash.c 及flash.h加入到工程中

在main.c檔案中添加部分代碼



編譯無誤,進行除錯
5、STlink除錯說明
接線
| ST-LINK | STM32 |
|---|---|
| SWCLK/TCK | SWCLK/TCK |
| SWDIO/TMS | SWDIO/TMS |
| GND | GND |
| VCC | VCC |

在電腦上下載好回應的ST-Link驅動,上電,可以看到STLink在電腦上顯示出來了

可以說明ST-Link 驅動已經安裝完成,接下來只需要在 mdk 工程里面配置一下 ST-Link即可,
回到Keil下,在魔法棒Option選項卡進行設定
首先是選擇除錯器,如果使用的是 ST-Link,在 Debug 選項卡中,請選擇ST-Link Debugger,如果你使用的是 JLINK,那么需要選擇J-LINK/J-Trace Cortex,

在選擇完除錯器之后,點擊右邊的 Setting 按鈕

如果右側IDCODE有顯示的話就是連接成功了
JTAG 模式和 SWD 模式使用方法都是一樣的,不同的是,SWD 介面除錯更加節省埠,一般情況下,為了節省更多的資源,建議大家使用 SWD 模式仿真,
之后,點紅框的箭頭就可以將程式燒錄到stm32中
注意:使用st-link和keil進行燒錄會嚴格檢查stm32型號,如果不是對應的型號燒錄會報錯,
6、除錯
進入debug,如果是仿真除錯的話,實際操作發現陣列沒有產生變化,
于是又用STlink又試了一下,以下主要是STlink除錯的程序,
View->memory windows->memory 1打開記憶體觀察視窗,并在地址欄中輸入:0x800c000,觀察將要修改的flash區間區容:

View->Watch windows->Watch 1打開一個變數觀察視窗,將變數FlashWBuff 和 FlashRBuff加入到 Watch 1 觀察視窗:

全速運行程式,可以看到陣列FlashRBuff中內容與陣列FlashWBuff中內容一樣了

在Memory 1視窗中可以看到在FLASH地址0x0800C000區成功寫入對應內容,

斷電,重新上電后再次除錯,程式剛停在main入口處時還可以看到Flash對應區間的內容保持上一次寫入內容值,

重復讀寫入,這里沒什么變化,

可以看一下起始位置的資料0x08000000


之后的FF說明資料沒有再寫入覆寫了,
通過內部flash的學習,以后基于STM32開發就可以省去一些外部flash或EEPROM了,
附:查找并選定要寫入Flash十六進制地址
要想選定安全的Flash地址進行讀寫,可以根據自己的STM32 MCU型號,查找資料手冊,確定FLASH的地址區段,因為起始段會存盤代碼,所以一定要避開起始段,以避免資料錯誤,(一般是根據Flash大小計算Flash的最末尾地址,往前推一段地址空間,在這里一般不會對代碼中的資料產生覆寫等影響)
此次操作Flash使用的MCU是STM32F103C8T6,以該型號MCU為例進行描述:
在資料手冊中,可以看到STM32F103C8T6的flash起始地址是0x0800 0000(如下圖所示),而STM32F103C8T6的Flash大小為64K,可以計算出STM32F103C8T6的Flash地址范圍是:0x0800 0000——0x0800 FFFF(計算方法參考另一篇博客:STM32記憶體大小與地址的對應關系以及計算方法),這里選取0x0800 F000作為讀寫操作的起始地址,對于C8T6這款MCU,操作這個起始地址應該算是很安全的范圍了,

三、基于片內Flash的提示音播放程式
1、使用DAC輸出周期2khz的正弦波
建議先用單音音頻(比如2000Hz的正弦波)的wav資料進行實驗,通過DAC或PCM音頻模塊能夠基本還原出原始正弦波聲音后,再用語言/音樂信號進行實驗,
生成單音正弦波
檔案—>新建—>音頻檔案

效果->生成->音調


檔案->匯出->設定匯出為wav檔案

用UltraEdit得到相關資料
用UltraEdit打開剛才保存的wav檔案

CTRL+A,接著滑鼠右鍵,選擇 十六進制復制選定視圖,將內容粘貼到一個新建檔案中
在新建檔案中,CTRL+A,接著滑鼠右鍵,選擇范圍輸入起始的行號和列號,確定就選中了整個我們需要的內容
復制到notepad++中
Edit編輯->列塊編輯->輸入0x

這里借用DAC生成正弦波的例程代碼
鏈接:https://pan.baidu.com/s/18zsQG5mZXbjafPuAJEUkMg
提取碼:706i
將內容復制到keil檔案對應的位置,在下圖紅框中進行替換,

之后,編譯下載,看能否觀察到預期的正弦波,
2、使用DAC輸出數字音頻歌曲資料轉換為模擬音頻波形輸出
操作同上,采樣率修改一下,其余燒錄步驟都是一樣的,不再贅述,

編輯好代碼后,燒錄,借助音頻模塊聽聽看能否還原,
這里由于手頭沒有音頻播放模塊,暫時不詳述,
總結
通過本實驗了解到片內flash的重要作用,可以不借助外設即可實作存放,
參考
[1] https://blog.csdn.net/qq_40147893/article/details/107423621
[2] https://blog.csdn.net/lushoumin/article/details/87694389
[3] https://blog.csdn.net/zhanglifu3601881/article/details/96632971
[4] https://blog.csdn.net/Ace_Shiyuan/article/details/78196648
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/397478.html
標籤:其他
上一篇:Ubuntu20.04+Qt5.15.2+Webassembly+qmqtt模塊構建Web端物聯網平臺
下一篇:2022屆安防展觀展體會
