目錄
- 一、前言
- 二、題目要求
- 三、什么是片內flash
- 四、閃存的編程和擦除
- 五、基于flash的資料讀取
- 1、工程創建
- 2、修改代碼
- 3、燒錄
- 4、除錯
- 六、基于flash的提示音播放
- 1、生成正弦波資料
- 2、使用DAC轉換播放音頻
- 參考資料
一、前言
本文是基于STM32F103C8T6的片內flash資料讀取,由于目前還沒有音頻播放模塊,所以說還不知道播放效果,如果有什么問題,還請大家多多指正,
二、題目要求
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)數字音頻還原播放任務:編程讀取此段音頻,分別通過 (a)stm32f103c8t6自帶的DAC通道,轉換為模擬音頻進行播放,并用示波器觀察波形,用耳機/喇叭收聽,評判音樂還原效果;
提示:建議先用單音音頻(比如2000Hz的正弦波)的wav資料進行實驗,通過DAC或PCM音頻模塊能夠基本還原出原始正弦波聲音后,再用語音和音樂信號進行實驗,
三、什么是片內flash
不同型號的 STM32,其 FLASH 容量也有所不同,最小的只有 16K 位元組,最大的則達到了 1024K 位元組,市面上 STM32F1 開發板使用的芯片是 STM32F103系列,其 FLASH 容量一般為 512K 位元組,屬于大容量芯片,而我們的C8T6flash大小為64KB,
STM32F1 的閃存(Flash)模塊由:主存盤器、資訊塊和閃存存盤器介面暫存器等 3 部分組成,下面我們就來介紹下這些組成部分:
①主存盤器,該部分用來存放代碼和資料常數(如 const 型別的資料),對于大容量產品,其被劃分為 256 頁,每頁 2K 位元組,注意,小容量和中容量產品則每頁只有 1K 位元組,從上圖可以看出主存盤器的起始地址就是0X08000000, BOOT0、BOOT1 都接 GND 的時候,就是從 0X08000000 開始運行代碼的,
②資訊塊,該部分分為 2 個小部分,其中啟動程式代碼,是用來存盤 ST 自帶的啟動程式,用于串口下載代碼,當 BOOT0 接 V3.3, BOOT1 接 GND 的時候,運行的就是這部分代碼,用戶選擇位元組,則一般用于配置寫保護、讀保護等功能,這里我們不做介紹,大家可以百度了解,
③閃存存盤器介面暫存器,該部分用于控制閃存讀寫等,是整個閃存模塊的控制機構,對主存盤器和資訊塊的寫入由內嵌的閃存編程/擦除控制器(FPEC)管理;編程與擦除的高電壓由內部產生,
在執行閃存寫操作時,任何對閃存的讀操作都會鎖住總線,在寫操作完成后讀操作才能正確地進行;既在進行寫或擦除操作時,不能進行代碼或資料的讀取操作,
具體可以參考:STM32之內部FLASH原理
四、閃存的編程和擦除
STM32 的閃存編程是由 FPEC(閃存編程和擦除控制器)模塊處理的,這個模塊包含 7 個 32 位暫存器,他們分別是:
① FPEC 鍵暫存器(FLASH_KEYR)
② 選擇位元組鍵暫存器(FLASH_OPTKEYR)
③ 閃存控制暫存器(FLASH_CR)
④ 閃存狀態暫存器(FLASH_SR)
⑤ 閃存地址暫存器(FLASH_AR)
⑥ 選擇位元組暫存器(FLASH_OBR)
⑦ 寫保護暫存器(FLASH_WRPR)
其中 FPEC 鍵暫存器總共有 3 個鍵值:
RDPRT 鍵=0X000000A5
KEY1=0X45670123
KEY2=0XCDEF89AB
STM32 復位后, FPEC 模塊是被保護的,不能寫入 FLASH_CR 暫存器;通過寫入特定的序列到 FLASH_KEYR 暫存器可以打開 FPEC 模塊(即寫入 KEY1 和KEY2),只有在寫保護被解除后,我們才能操作相關暫存器,
STM32 閃存的編程每次必須寫入 16 位(不能單純的寫入 8 位資料),當FLASH_CR 暫存器的 PG 位為’1’時,在一個閃存地址寫入一個半字將啟動一次編程;寫入任何非半字的資料, FPEC 都會產生總線錯誤,在編程程序中(BSY 位為’1’ ),任何讀寫閃存的操作都會使 CPU 暫停,直到此次閃存編程結束,
同樣,STM32 的 FLASH 在編程的時候,也必須要求其寫入地址的 FLASH 是被擦除了的(也就是其值必須是 0XFFFF),否則無法寫入,在 FLASH_SR 暫存器的 PGERR 位將得到一個警告,STM32 的 FLASH 編程程序如下:

從上圖可以得到閃存的編程順序如下:
① 檢查 FLASH_CR 的 LOCK 是否解鎖,如果沒有則先解鎖
② 檢查 FLASH_SR 暫存器的 BSY 位,以確認沒有其他正在進行的編程操作
③ 設定 FLASH_CR 暫存器的 PG 位為’1’
④ 在指定的地址寫入要編程的半字
⑤ 等待 BSY 位變為’0’
⑥ 讀出寫入的地址并驗證資料
五、基于flash的資料讀取
1、工程創建
創建一個CubeMX,其他配置就如我們往常那樣配置,現在主要講幾個:
由于我們要設定一個標志來表示我們的程式已經開始執行了,所以這里我選擇板子上自帶的LED(PC13),

設定堆疊的大小,這里設定為4K(也可設定為2K),

緊接著我們匯出工程就OK了,
2、修改代碼
首先咱們需要下載flash.c檔案,這里我直接把我整個工程都放進來,點擊下載,提取碼:1111
或者我們可以直接將我的檔案夾中flash.c由于flash.h檔案添加到自己的工程中:

接著打開main.c檔案,看到我們存盤資料的陣列,在里面我們可以修改需要存盤的資料

然后進行編譯無錯即可,
3、燒錄
在這里需要用到ST-link,之前我們都是用FlyMCU直接進行燒錄的,但是如果我們還是像之前一樣的話我們就將無法進行測驗,因為這次實驗的現象是將資料寫進記憶體,并沒有配置串口輸出,所以我們需要用ST-link直接在Keil中觀察測驗結果(資料是否存盤進去),
ST-link連線:
| ST-link | STM32 |
|---|---|
| SWCLK | SWCLK |
| SWDIO | SWDIO |
| GND | GND |
| VCC | VCC |
連線結果如圖所示:

緊接著我們回到Keil工程中,點擊“仙女棒”,在“Debug”選項卡中選擇ST-link

在選擇完之后查看右邊的“SWDIO”,如果顯示了“IDCODE”就表示ST-link連接成功:

然后點擊下載按鈕可以將程式下載到我們的板子中

注意我們一定要選擇正確自己板子的型號,因為ST-link在燒錄的時候會嚴格地檢查STM32型號,如果板子型號選擇錯誤就會報錯,
4、除錯
在除錯的時候為了方便我們觀察,首先需要我們在main函式中的while回圈前設定一個斷點,

一直連接上板子然后進入debug,千萬不要選擇仿真除錯,點擊視圖—>觀測視窗—>隨便選擇一個視窗

緊接著在右下角的Memory1視窗中輸入我們存盤資料的地址0x0800C000

點擊全速運行,可以看到板子上的PC13 LED亮起,然后Memory 1視窗中出現之前存盤的資料,證明資料成功寫入

斷電之后再次上電進行除錯,程式依然停在while回圈前,可以看到上次寫入的資料還在其中,證明已經將資料寫入到flash中

實驗完成
六、基于flash的提示音播放
由于提示音的波形比較復雜,這里我們用正弦波來模擬
1、生成正弦波資料
使用Adobe Audition生成正弦波資料:
首先新建一個音頻檔案

設定采樣率和位深度,八位的八位元采樣

插入基本音色(正弦波)

匯出為wab檔案

生成wav檔案之后,用UltraEdit將其打開,Ctrl+A選擇全部然后右鍵點擊選擇選擇范圍,輸入12-59列

這就選中需要的資料了,緊接著右鍵點擊然后十六進制復制選定視圖,再將十六進制數賦值到notepad++中,選中要添加的行然后Alt+C添加0x即可
這里我們直接用DAC生成正弦波的工程提取碼:1111,然后將生成得到的資料粘貼進入陣列即可(記得修改陣列大小)

將資料粘貼進去過后編譯下載并燒錄,
用示波器觀察PB5輸出的波形

實驗成功
2、使用DAC轉換播放音頻
操作與正弦波相同,但是由于存在flash里面所以我們的選取的音樂片段不能太長,建議2s

用同樣的步驟生成資料,將得到的資料粘貼到對應Keil工程的陣列中,借助音頻模塊看是否能還原,由于我這里目前沒有音頻模塊,所以目前不清楚結果,
參考資料
STM32之內部FLASH原理
DAC工程下載
flash檔案下載
提取碼:1111
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/398529.html
標籤:其他
上一篇:《人工智能及其應用》重點回顧
下一篇:STM32之DAC音頻播放
