• 沒有找到結果。

多媒體播放器之微控器系統設計

N/A
N/A
Protected

Academic year: 2021

Share "多媒體播放器之微控器系統設計"

Copied!
195
0
0

加載中.... (立即查看全文)

全文

(1)

電機學院 電機與控制學程

多媒體播放器之微控器系統設計

Multimedia Player System Design of The Microcontroller

研 究 生:林文彬

指導教授:林錫寬 教授

(2)

多媒體播放器之微控器系統設計

Multimedia Player System Design of The Microcontroller

研 究 生:林文彬 Student:Wen-Pin Lin 指導教授:林錫寬 Advisor:Sire-Kuan Lin 國 立 交 通 大 學

電機學院 電機與控制學程

碩 士 論 文 A Thesis

Submitted to College of Electrical and Computer Engineering National Chiao Tung University

in partial Fulfillment of the Requirements for the Degree of

Master of Science in

Electrical and Control Engineering March 2011

Hsinchu, Taiwan, Republic of China

(3)

多媒體播放器之微控器系統設計

學生:林文彬 指導教授:林錫寬 國立交通大學 電機學院 電機與控制學程碩士班 摘 要 近幾年關於多媒體的應用已經廣泛的出現在日常生活中,例如衛星導 航、行動電話或電子書等,都能夠看到多媒體應用的蹤跡。 本論文主要目的是透過多媒體的應用,並使用市面上主流的ARM微控 器,來熟悉嵌入式系統的軟硬體設計。在硬體方面以脈衝波寬調變(PWM) 模式來取代DAC功能輸出;軟體部分則建立SD記憶卡的底層程序並整合 FAT檔案儲存系統,使得在開發嵌入式系統時可以快速的解決檔案儲存的應 用。並透過播放WAVE音樂來熟悉脈衝編碼調變(PCM)的編解碼流程,與播 放MP3音樂來了解音樂壓縮編碼與解碼處理的程序。

(4)

Multimedia Player System Design of The Microcontroller

student:Win-Pin Lin Advisors:Dr. Sire-Kuan Lin

Degree Program of Electrical and Computer Engineering

National Chiao Tung University

ABSTRACT

In recent years, the applications of multimedia have widely appeared in our

daily lives, for instance, GPS navigation systems, cellar phones and electronic books. You can easily spot multimedia applications everywhere.

The purpose of this study was to gain an understanding of the design of

embedded hardware-software systems based on commonly-used ARM micro -controllers and through the application of multimedia. In terms of hardware, pulse-width modulation (PWM) was employed to replace digital-to-analog converter (DAC) output. For software, an underlying SD card process was developed and integrated with the FAT file system, which enables rapid file storage when developing an embedded system. The encoding and decoding process of pulse-code modulation (PCM) is used in playing WAVE music files. In addition, by playing MP3 music files we can understand the encoding and decoding process of music compression.

(5)

首先我要感謝指導教授 林錫寬教授在學期間不吝的指導與

教誨,讓我得以順利的完成本論文。再來要感謝我的家人在我求

學的日子里,給予我最大的支持與鼓勵,讓我在專班的學習路途

上無後顧之憂。

本篇論文謹獻給指導教授及我的家人與在求學路上不吝幫助

我與鼓勵我的長輩和朋友們,與您們一起分享這份喜悅。

(6)

目 錄

中文提要 i 英文提要 ii 誌謝 iii 目錄 iv 圖目錄 vii 表目錄 xii 一、 簡介 1 1.1 研究背景與動機 1 1.2 章節安排 2 二、 STM32F103x 微控器介紹 3 2.1 系統時脈管理 6 2.2 通用輸入/輸出埠 11 2.3 外部中斷與事件 15 2.4 通用計數器 17 2.4.1 向上計數模式 18 2.4.2 脈衝寬度調變模式 20 2.4.3 PWM 低通濾波器 25 2.5 序列週邊界面 29 2.5.1 SPI 模式的初始設定 33 2.5.2 SPI 模式的資料傳輸 36 2.5.3 SPI 模式下的 DMA 傳輸 38 2.6 SDIO 模組 41 2.6.1 SDIO 功能說明 42 三、 SD 記憶卡介紹 51 3.1 SD 記憶卡概述 52 3.1.1 SD 記憶卡的記憶體配置 53 3.1.2 SD 記憶卡架構 55

(7)

3.1.3 SD 記憶卡的匯流排結構 57 3.1.4 SD 記憶卡的暫存器 60 3.1.5 CRC 檢查碼 63 3.2 SPI 傳輸模式 65 3.2.1 SPI 模式選擇 66 3.2.2 指令格式 68 3.2.3 SPI 模式的回應 71 3.2.4 卡識別模式 77 3.2.5 資料傳輸 80 3.3 SD Bus 傳輸模式 89 3.3.1 資料線模式設定 91 3.3.2 SD Bus 模式的回應 93 3.3.3 SD Bus 模式的卡識別模式 97 3.3.4 SD Bus 模式的資料傳輸 101 四、 FAT 檔案系統 107 4.1 FAT 系統概述 108 4.2 FAT 的保留磁區 111 4.2.1 開機磁區 112 4.2.2 磁碟分區表 114 4.2.3 啟動參數區 115 4.3 文件分配表區域 120 4.4 目錄區域 122 4.5 資料區域 125 五、 WAVE 音效檔 129 5.1 WAVE 檔案資料結構 130 5.2 WAVE 檔案播放 135 5.2.1 WAVE 檔頭解碼 136

(8)

5.2.4 播放流程 143 六、 MP3 音效格式 145 6.1 MP3 文件的標籤格式 146 6.2 MP3 音框格式 150 6.3 MP3 解碼流程 153 6.4 MP3 解碼程序 154 七、 結果與展望 159 參考文獻 161 附錄一 STM32F103x 記憶體映射 163 附錄二 SD 記憶卡命令描述 164 附錄三 FAT 磁區內容與結構 167 附錄四 MP3 音框檔頭格式 169 附錄五 MP3 播放器電路與 PCB 佈線圖 170 自傳 180

(9)

圖 目 錄

圖2-1 多媒體系統功能方塊圖 5 圖2-2 HSE/LSE 時脈來源 7 圖2-3 內部高速時脈(HSI)與相鎖迴路(PLL)電路 8 圖2-4 內/外部低速時脈(LSE/LSI)電路 8 圖2-5 主頻率來源電路 9 圖2-6 RCC 初始設定程序 10 圖2-7 編譯軟體的RCC 設定 10 圖 2-8 編譯軟體的GPIO 設定 13 圖 2-9 SD 記憶卡電源控制與插入偵測電路 14 圖 2-10 SD 記憶卡電源控制與插入偵測程式 14 圖 2-11 外部中斷輸入電路 15 圖 2-12 EXTI 設定副程式 16 圖 2-13 編譯軟體的EXIT 設定 16 圖 2-14 TIM 中斷處理架構 17 圖 2-15 向上計數模式時序 18 圖 2-16 編譯軟體的TIM4 設定 19 圖 2-17 PWM duty cycle 波形 20 圖 2-18 PWM 模式 1 與模式 2 波形 21 圖 2-19 CCR 為 4 與 255 的 PWM 輸出波形 22 圖 2-20 TIM3 計數器設定 23 圖 2-21 模擬PWM 輸出波形 24 圖2-22 放大器與低通濾波器電路 25 圖2-23 二階低通濾波器分析 26 圖2-24 一階高通濾波器分析 27 圖2-25 PWM 濾波器的分析 27 圖2-26 輸出 8KHz PWM 訊號經過濾波器的波形 28

(10)

圖2-28 單一 SPI Master 匯流排對複數 Slave 29 圖2-29 SPI 模組方塊圖 30 圖2-30 SPI 模式資料傳輸的時序圖 34 圖2-31 SPI 模式設定副程式 35 圖2-32 SPI 模式的資料發送副程式 36 圖2-33 SPI 模式的資料接收副程式 37 圖2-34 SPI 傳輸的 DMA 設定副程式 39 圖2-35 SPI 使用迴圈與 DMA 的傳輸程式 40 圖2-36 SDIO 模組方塊圖 42 圖2-37 SDIO 轉接器模組方塊圖 42 圖2-38 SDIO 命令通道狀態機方塊圖 43 圖2-39 SDIO 命令發送副程式 44 圖2-40 SDIO 資料通道狀態機方塊圖 45 圖2-41 DPSM 設定副程式 46 圖2-42 SDIO 模式設定副程式 47 圖3-1 SD 記憶卡標誌與尺寸 51 圖3-2 SD 記憶體配置方式 54 圖3-3 SD 記憶卡架構 55 圖3-4 SD Bus 架構 58 圖3-5 SPI Bus 架構 59 圖3-6 OCR 結構分析 61 圖3-7 CMD0 的 CRC7 計算過程 64 圖3-8 SPI 時序 65 圖3-9 SPI Power On 時序 66 圖3-10 SD 記憶卡上電時序 67 圖3-11 SPI 模式傳送命令副程式 69 圖3-12 SPI 模式 CMD0 波形 70 圖3-13 SPI 回應 1b 的時序 72 圖3-14 SPI 回應 2 的時序 72

(11)

圖3-15 SPI 回應 3 格式 73 圖3-16 SPI 回應 7 格式 74 圖3-17 SPI 開始 0xFC 與結束 0 xFD 傳送回應的時序 75 圖3-18 SPI 資料回應格式 75 圖3-19 SPI 資料回應的時序 76 圖3-20 SPI 資料錯誤回應 76 圖3-21 SPI 模式的卡判斷流程 77 圖3-22 SPI 模式的卡判斷副程式 79 圖3-23 開啟或關閉CRC 功能副程式 80 圖3-24 設定區塊大小副程式 81 圖3-25 讀取單區塊(CMD17)的操作時序 81 圖3-26 SPI 模式讀取單區塊副程式 82 圖3-27 讀取多區塊(CMD18)的操作時序 83 圖3-28 SPI 模式讀取多區塊副程式 83 圖3-29 SPI 模式接收資料區塊副程式 84 圖3-30 寫入單區塊(CMD24)的操作時序 85 圖3-31 SPI 模式寫入單區塊副程式 86 圖3-32 寫入多個區塊(CMD25)的操作時序 86 圖3-33 SPI 模式寫入多區塊副程式 87 圖3-34 SPI 模式傳送資料區塊副程式 88 圖3-35 SD Bus 命令格式 89 圖3-36 SD Bus 回應格式 89 圖3-37 SD Bus 資料傳輸格式 90 圖3-38 SD Bus 模式寬資料傳輸啟動副程式 92 圖3-39 SD Bus 模式命令與回應時序 93 圖3-40 SD Bus 模式的卡判斷流程 97 圖3-41 SD 記憶卡的初始化程序 98

(12)

圖3-44 資料傳輸模式狀態圖 101 圖3-45 SD bus 讀取數據塊操作時序 102 圖3-46 SD bus 讀取資料磁區副程式 103 圖3-47 SD bus 寫入資料磁區操作時序 104 圖3-48 SD bus 寫入資料磁區副程式 106 圖4-1 讀取 FAT 檔案資料範例 109 圖4-2 FAT16 系統資料結構 110 圖4-3 FAT 開機磁區的資料型態 111 圖4-4 開機磁區資料 113 圖4-5 FAT 載入 BPB 資訊副程式 116 圖4-6 導入 FAT 系統副程式 119 圖4-7 FAT16 的檔案叢集鏈 121 圖4-8 尋找下一個叢集號碼副程式 121 圖4-9 根目錄區域磁區資料 122 圖4-10 讀取文件目錄資訊副程式 124 圖4-11 資料區域的儲存結構 125 圖4-12 轉換叢集次區位址副程式 126 圖4-13 FAT 系統文件資料讀取副程式 128 圖5-1 WAVE 音訊資料配置結構 133 圖 5-2 RIFF WAVE 檔頭格式 134 圖 5-3 WAVE 播放流程圖 135 圖 5-4 WAVE 檔頭解碼副程式 136 圖 5-5 取樣頻率設定副程式 137 圖5-6 2 組緩衝區設定副程式 139 圖5-7 有號數轉換為無號數的副程式 140 圖5-8 音訊解碼副程式 142 圖5-9 WAVE 播放功能流程 144 圖5-10 WAVE 播放功能副程式 144 圖6-1 ID3V1 資料結構定義 147

(13)

圖6-2 MP3 ID3V1 資料內容 147 圖6-3 ID3V2.3 結構定義 148 圖6-4 ID3V2.3 容量計算程式 148 圖6-5 ID3V2.3 Frame 結構定義 149 圖6-6 MP3 ID3V2.3 資料內容 149 圖6-7 MP3 音框結構 150 圖6-8 MP3 音框頭結構(32 位元) 150 圖6-9 MP3 音框資料 151 圖 6-10 MP3 旁資訊結構 152 圖 6-11 MP3 主資料結構 152 圖 6-12 MP3 解碼程序 153 圖 6-13 MP3 解碼流程 154 圖 6-14 MP3 解碼副程式 157

(14)

表 目 錄

表2-1 通用輸入/輸出埠的模式設定 11 表2-2 硬體電路GPIO 功能應用 12 表2-3 SPI 模式接腳映射 30 表2-4 SPI 狀態暫存器 31 表2-5 SPI 控制暫存器 31 表2-6 SPI 資料暫存器 32 表2-7 SPI 控制暫存器 32 表2-8 SDIO 模組接腳對應 41 表2-9 SDIO 時鐘控制暫存器 48 表2-10 SDIO 資料控制暫存器 49 表2-11 SDIO 命令暫存器 49 表2-12 SDIO 參數暫存器 50 表2-13 SDIO 狀態暫存器 50 表3-1 SD 記憶卡接腳功能描述 57 表3-2 SD 記憶卡內部暫存器 60 表3-3 SD 記憶卡命令格式 68 表3-4 SPI 回應 1 格式 71 表3-5 SPI 回應 2 格式 73 表3-6 SD Bus 模式 R1 回應格式 94 表3-7 SD Bus 模式 R2 回應格式 94 表3-8 SD Bus 模式 R3 回應格式 95 表3-9 SD Bus 模式 R6 回應格式 95 表3-10 SD Bus 模式 R7 回應格式 96 表4-1 FAT12/16/32 系統比較 107 表4-2 開機磁區結構 112 表4-3 FAT 磁碟分區結構 114 表 4-4 FAT16 文件分配表的結構 120

(15)

表5-1 WAVE 文件結構 130

表5-2 WAVE Format chunk 格式 131

表5-3 WAVE 編瑪方式 131

表5-4 WAVE fact chunk 結構 132

表5-5 WAVE data chunk 結構 132

表5-6 WAVE 結構範例 133

表6-1 MP3 檔案結構 146

(16)

第一章 簡介

1.1 研究背景與動機

近年來多媒體系統已經廣泛的融入生活之中,不論是通訊產品如行動 電話或是一般消費性產品如電子書等,都可以看到多媒體系統的應用,使 得我們可以容易的獲得影音方面的資訊。而現今應用在多媒體系統上,最 主流的微控器為進階精簡指令集微控器(Advanced RISC Machine)簡稱為 ARM微控器。其為32位元的微控器,並且廣泛地使用在許多嵌入式系統設 計中,主要的設計目標就是提供低耗電高效能的應用特性。 現今多媒體系統應用上,使用最為廣泛的影音格式為MPEG,而其中 MP3是大家最常使用到的一種音樂壓縮格式。其為一種數位音訊編碼和破 壞性壓縮格式,它被設計用來降低音訊的資料量,而沒有明顯的影響大多 數使用者的聽覺感受。 另外由於影音數位化的普及,對於儲存媒體容量的需求也越來越高, 一般內建的儲存記憶空間並無法儲存太多的多媒體檔,因此使用擴充的儲 存媒體是必需的。目前市面上以SD memory card為主流的擴充儲存裝置,其 可格式化為一般作業系統使用的檔案格式,例如FAT檔系統。 因此當我們想要學習嵌入式系統的多媒體應用時,選擇ARM微控器來 當主架構與利用SD memory card來做為儲存裝置,並且使用軟體解碼方式來 播放MP3音樂檔,如此一來讓我們可以完整的學習到嵌入式系統在多媒體 上的應用架構。

(17)

1.2 章節安排

本論文的章節安排如下: 第一章說明研究背景與動機。 第二章介紹STM32F103x 微控器。 第三章介紹SD 記憶卡。 第四章介紹FAT 檔案格式。 第五章敘述Wave PCM 音效格式的播放流程。 第六章簡述MP3 音效格式的解碼流程。 第七章為結果與未來展望。

(18)

第二章

STM32F103x 微控器介紹

本文的多媒體系統使用的是ARM 微控器來做為核心,我們選用的是意

法半導體公司ST Microelectronics (簡稱 ST)所生產的 STM32F103x 系列 32

位元ARM 微控器。

STM32F 微控器使用了先進的 32 位元 ARM Cortex™-M3 內核,核心頻

率可高達25MHz,並配備最大可達 512 Kbytes 的快閃記憶體(Flash Memory)

與64 Kbytes SRAM。還具有豐富的內置功能電路,其最高工作頻率可操作 在72MHz,內置電路功能包括有多組的計數器、USB 介面、外部儲存器介 面等。 ARM Cortex™-M3 針對中斷回應的問題,在內核上設置了向量中斷控 制器(NVIC),使得基於 Cortex-M3 內核的不同廠牌微控器都具有統一的中 斷控制器,使我們進行中斷程式設計與程式移植帶來了很大的便利。 STM32F 微控器還加入了類似於 8 位元處理器的低功耗模式,使整個晶 片更具有高性能、低功耗與低電壓特性的優勢 [1]。 本文接下來的章節將針對 STM32F 微控器在多媒體應用所用到的功能 進行說明,其他應用的詳細資訊請參考意法半導體公司所公佈的 RM0008 Referance Manual [1] 使用手冊。另外本章節所圖列之範常式式,是從意法 半導體公司(ST)所提供的公用程式庫中針對本系統進行修改,公用程式庫可

(19)

圖 2-1 為本文所應用的多媒體播放機功能配置,其中 USB 與 USART 功能未導入,而 SD 記憶卡工作在 SPI 模式時,可以使用 LCD 顯示功能, 如果工作在SD Bus 模式時,因為 SDIO 接腳與 LCD 模組使用相對的腳位, 所以無法同時使用。另外還有按鍵功能,提供播放動作的選擇與 8 位元的 LED 輸出提供狀態顯示。詳細的硬體電路請參見附錄五,底下將簡述多媒 體播放機的功能。 時脈控制(RCC)功能:本系統使用外部晶體振器提供 8MHz 主頻率給微控 器,再經過內部相鎖迴路倍頻至 72MHz,供給內置的功能電路使用,詳述 內容請參考第2.1 章節。

通用輸入/輸出埠(GPIO):本系統使用 GPIOA、GPIOB 與 GPIOC 這三個埠, 其需配合各功能電路(如 EXTI、TIMER、SPI,SDIO 等)來設定使用模式。

詳述內容請參考第2.2 章節。

向量中斷(EXTI):使用 GPIOC 的 PC5~PC8 來做為多媒體播放機的輸入按

鍵,詳述內容請參考第2.3 章節。

通用計數器(TIMER):本系統使用 TIM3 與 TIM4 這兩個計數器,其中 TIM3

工作在PWM 模式,用來輸出音樂訊號;而 TIM4 使用在向上計數模式,用 來產生音樂訊號的取樣頻率,詳述內容請參考第2.4 章節。 序列週邊介面(SPI):用來與 SD 記憶卡溝通的通訊介面,本系統使用 SPI1 模組,並且工作在Master 模式下,詳述內容請參考第 2.5 章節。 SDIO 模組:與 SD 記憶卡溝通的另一種通訊介面,具有高傳輸率的特性, 詳述內容請參考第2.6 章節。

(20)

Audio 電路:分為音訊放大輸出與麥克風輸入兩個部分,詳細電路請參考附 錄五圖5 之應用電路。 系統電源:可由USB 接頭輸入 5V 電壓,經過 LDO 轉出 3.3V 供給系統使 用。或是由JTAG 轉板直接供給 3.3V。 圖2-1 多媒體系統功能方塊圖 LCD 模組 JTAG

USB and Power

Audio LPF and Amplify Switch

Output Test Port LED

SD Card RS232

Microphone

(21)

2.1 系統時脈管理

重置與時脈控制(RCC)是用來實現 STM32 微控器的時脈管理,其管理 外部、內部和外設的時脈,設置、打開和關閉這些時脈。對於ARM 微控器 來說,CPU 和匯流排以及外設的時脈設置是非常重要的,因為時脈設定錯 誤就無法產生正確的時序,組合電路時脈設定錯誤則會造成I/O 控制混亂。 STM32 微控器有三種不同的時脈來源可被用來驅動系統時脈,外部高 速時脈(HSE) ,內部高速時脈(HSI),相鎖迴路時脈(PLL)。另外還有兩個次 級時脈來源:40KHz 低速內部 RC 時脈,32.768KHz 低速外部晶體振盪時脈。

使用者可透過多重分頻器設置 AHB、高速 APB2 和低速 APB1 裝置區域的

頻率。其中 AHB 和 APB2 裝置區域的最大工作頻率是 72MHz,而 APB1

裝置區域的最高頻率是36MHz。另外 SDIO 介面的工作頻率固定為 CLK/2, USB介面的工作頻率為48MHz。系統主頻率通過AHB除8倍頻後,提供給 Cortex™系統計數器(SysTick)使用 [1]。 詳細的重置與時脈控制(RCC)資訊請參考意法半導體公司的使用手冊 RM0008 Referance Manual ch.6 [1]。 外部高速時脈(HSE) 外部高速時脈(HSE)可以由兩種時脈型態供應,一個為使用外部晶體振 盪器(Crystal)或陶瓷共振器(Ceramic resonator),另一個為使用外部時脈產生 器(External clock)。如果是由外部晶體振盪器來產生時脈,晶體振盪器的頻 率範圍為 4 至 16MHz。而在使用外部時脈產生器的情況下,頻率範圍最高 可達25MHz。

(22)

圖2-2 為外部高速時脈的使用方式,圖(a)為使用外部時脈來源時,由 OSC_IN 輸入。圖(b)為使用外部振盪器的連接方式。 (a) 外部時脈來源 (b) 外部振盪器 圖2-2 HSE/LSE 時脈來源 [1] 內部高速時脈(HSI) 內部高速時脈(HSI)是由微控器內部的 RC 振盪器來產生的,它的工作 頻率為 8MHz,可直接供應給系統頻率分配器使用,或除 2 後供應給 PLL 當來源。其主要目的為減少外部元件並提供低價位的時脈來源。 相鎖迴路(PLL) 相鎖迴路(PLL)主要是用來倍頻內/外部高速時脈,並提供給系統當作主 頻率來源,也會直接提供給高速設備電路如USB 使用。相鎖迴路的倍頻倍 數為2 到 16 倍,但是輸出頻率最高為 72MHz。 圖2-3 為相鎖迴路與內部高速時脈的電路,系統頻率(SYSCLK)可選擇 由HSE、HSI 或 PLLCLK 當來源。而 PLLCLK 頻率來源可選擇由 HSI 或 HSE 經過 PLLMUL 倍頻後輸入。 外部低速時脈(LSE) 外部低速時脈(LSE)是由 32.768KHz 的外部晶體或陶瓷共振器所產生, 其主要功能為,提供系統Real-Time Clock 電路所需的低功耗且準確的時脈 來源。 Ecternal Source OSC_IN OSC_OUT External Clock (HiZ) Crystal/Resonator OSC_IN OSC_OUT CL1 CL2

(23)

圖2-3 內部高速時脈(HSI)與相鎖迴路(PLL)電路 [1] 內部低速時脈(LSI) 內部低速時脈(LSI)是由微控器內部的 RC 振盪器來產生的,其頻率大 約落在30KHz 到 60KHz 之間,可以用來取代外部低速時脈的功能。另外也 可以在微控器進入待機模式下保持動作,為Watchdog 電路與自動喚醒電路 提供時脈來源。 圖2-4 為低速時脈的電路,主要做為 RTC 電路的頻率來源,可以選擇

由LSE、LSI 或 HSE 除 128 來做為來源。另外,LSI 又提供給看門狗電路

(Watchdog)使用。 圖2-4 內/外部低速時脈(LSE/LSI)電路 [1] STM32 微控器使用重置與時脈控制暫存器(RCC)來設定系統主要的頻 率來源,也可以設定與啟動內置功能電路的頻率。其中RCC_CR 暫存器用 HSE HSE

(24)

APB2 等區域功能的頻率,而 RCC_AHBENR/APB1ENR/APB2ENR 等暫存 器則是用來控制各個功能的頻率啟動。 當系統程式開始執行時,第一步驟需要先設定好STM32 微控器使用的 主頻率來源,再根據頻率來源的頻率來配置內部各裝置的時脈。在本文的 應用中,我們使用外部高速時脈(HSE)功能連接 8MHz 振盪器,外部低速時 脈(LSE) 連接 32.768KHz 振盪器,設定 PLL 頻率為 72MHz(9 倍頻),來當 作主系統時脈(SysCLK),設定 AHB 分頻器後的 HCLK 為 72MHz,高速 APB2

區域的時脈為72MHz,低速 APB1 區域的時脈為 36MHz。 圖 2-5 為本系統的應用電路,PD0 與 PD1 連接 8MHz 外部高速時脈; PC14 與 PC15 連接 32.768KHz 外部低速時脈(LSE)。 圖2-5 主頻率來源電路 我們可以使用兩種方式來設定STM32 微控器的頻率來源,圖 2-6 為設 定STM32 微控器頻率來源與頻率配置 RCC_Initial ( ) 的副程式,本系統使 用8MHz HSE 提供給 PLL,並且倍頻 9 倍至 72MHz,當設置好參數後,將

HSE_ON 與 PLL_ON 位元設為 1,以啟動 HSE 與 PLL 電路,最後等待 HSE

(25)

程式名稱:RCC_Initial ( ) 功能敘述:設定系統頻率

輸 入:HSE,PLL 頻率來源 輸 出:無

viod RCC_Initial (void)

{ RCC->CFGR |= (7<<18); // PLLMUL[3:0] : PLL * 9 = 72MHZ RCC->CFGR |= (0<<17); // HSE clock not divided

RCC->CFGR |= (1<<16); // PLLSRC = 1 : HSE INPUT RCC->CFGR |= (0<<11); // PPRE2[2:0] APB2CLK=HCLK RCC->CFGR |= (4<<8); // PPRE1[2:0] APB1CLK=HCLK/2 RCC->CFGR |= (0<<4); // HPRE[2:0] AHBCLK=SysCLK RCC->CFGR |= (2<<0); // SW[1:0] : SYSTEM CLK = PLL CLK RCC->CR |= (1<<16); // 開啟HSE

while ((RCC->CR & (1<<17))==0); // 等待 HSE ready RCC->CR |= (1<<24); // 開啟PLL while ((RCC->CR & (1<<25))==0); // 等待 PLL ready }

圖2-6 RCC 初始設定程式

圖 2-7 為使用編譯軟體所提供的 STM32_Init.c 程式庫,其內建了 RCC

暫存器的設定選單,利用下拉選單的方式來設定系統頻率來源與 PLL 倍頻

(26)

2.2 通用輸入/輸出埠(General Purpose I/Os - GPIOs)

通用輸入/輸出埠(簡稱GPIO)是STM32F微控器的基本輸入/輸出功能, 每一組GPIO都有16根接腳,並且每根接腳都可以獨立的由軟體設置成不同 的工作模式,詳細的通用輸入/輸出埠(GPIO)說明請參考意法半導體公司的 使用手冊RM0008 Referance Manual ch.7 [1]。 GPIO的模式選擇是由GPIO_CRH與GPIO_CRL暫存器來設置的,其設 定方式如表2-1所示,CFNx[1:0]用來設定輸入/輸出模式,MODEx[1:0]用來 設定接腳的最高輸出頻率。 表2-1 通用輸入/輸出埠的模式設定 [1]

Configuration mode CFN1 CFN0 MODE1 MODE0 PxODR

General purpose Output Push-pull 0 0 01 10 11 0 or 1 Open-drain 1 0 or 1 Alternate function output Push-pull 1 0 X Open-drain 1 X Input Analog input 0 0 00 X Input floating 1 X Input pull-down 1 0 0 Input pull-up 1 MODE[1:0] Meaning 00 Reserved

01 Max. output speed 10MHz

10 Max. output speed 2MHz

11 Max. output speed 50MHz

本系統硬體電路的GPIO功能使用如表2-2所列,PA[2]為SD卡的電源控

制訊號,PA[8]為偵測SD卡的插入,PA[4:7]為SPI模組接腳,PB[1:2]為TIM3

的PWM輸出,PB[8:15]為LED燈號輸出,PC[4]為麥克風的ADC輸入, PC[5:8]為播放功能的中斷輸入;而沒有用到的接腳,將其設為接腳設定為

(27)

浮接輸入模式,避免意外輸出造成電路發生錯誤。

表2-2 硬體電路 GPIO 功能應用

GPIO Mode Discription

PA[2]

(參考附錄五,圖 4)

Push-pull output SD card 電源控制

0 : power on 1 : Power off PA[8]

(參考附錄五,圖 4)

Floating input SD card 插入偵測

1 : No SD card 0 : SD card insert PA[4:7]

(參考附錄五,圖 4)

Alternate function output SD card SPI 模式接腳

PA4 : CS PA5 : SCLK PA6 : DAT0 PA7 : CMD PB[1:2]

(參考附錄五,圖 5)

Alternate function output TIM3 PWM 輸出接腳 PB[8:15]

(參考附錄五,圖 4)

Push-pull output 8 位元 LED 輸出

PC[4] (參考附錄五,圖 5) Analog input 麥克風類比訊號輸入 PC4 : ADC1 channel 14 PC[5:8] (參考附錄五,圖 4)

Pull up/down input 播放功能按鍵

PC5 : Function PC6 : Play PC7 : Next PC8 : Stop PC[8:12]

PD[2]

(參考附錄五,圖 4)

Alternate function output SD card SDIO 模式接腳

PC8 : DAT0 PC9 : DAT1 PC10 : DAT2 PC11 : DAT3 PC12 : CLK PD2 : CMD

我們可以使用編譯軟體所提供的STM32_Init.c程式庫,依照表2-2所列 之功能,設置GPIO的工作模式。圖2-8為使用下拉選單的方式來設置GPIO 的工作模式。

(28)

圖2-8 編譯軟體的 GPIO 設定 舉例本系統的SD記憶卡電源控制與卡片偵測應用電路,來說明GPIO的 基本輸入與輸出設定與使用。圖2-9的電路中,透過PA[2]控制P-MOSFET電 源開關,當輸出為低電位時,P-MOSFET導通並供給電源給SD記憶卡。若 輸出為高電位時,則關閉電源。 PA[8]用來偵測SD記憶卡是否插入或拔除,在記憶卡插槽中,有一根C/D 腳位元是用來偵測卡片狀態。當卡片插入插槽時,該C/D腳位會被拉到低電 位;相反的,當卡片拔除或沒有插好的狀況下,該腳位會被拉到高電位。

(29)

Function Pin I/O High State Low State SD Power Control PA2 Output Power Off Power On SC Card Detect PA8 Input No SD card SD Card Inserted

圖2-9 SD 記憶卡電源控制與插入偵測電路 圖2-10為本系統的電源控制與卡片偵測範常式式,使用GPIOA_IDR第8 位元的狀態,來偵測SD卡。使用GPIOA_ODR第2位元,來決定電源的供給。 程式名稱:check_sd_insert ( ), SD_power_on ( ) SD_power_off ( ) 功能敘述:偵測卡片插入,打開 SD card 電源, 關閉 SD card 電源 輸 入:PA8 偵測卡片 輸 出:PA2 控制電源開闢

#define SD_PWRON() GPIOA->ODR &= ~(1<<2) // PA2:Low = Power On #define SD_PWROFF() GPIOA->ODR |= (1<<2) // PA2:High = Power Off #define SD_INS() GPIOA->IDR &= (1<<8) // PA8:Low = SD insert

u8 check_sd_insert (void)

{ if (SD_INS()) // 偵測卡片是否插入 Stat = STA_NOSDCARD; // 將狀態設為no SD card else Stat = STA_SDCARD; // 將狀態設為SD card insert return Stat; } u8 SD_power_on (void) { SD_power_off (); // 關閉SD card電源 if (check_sd_insert () == STA_NOSDCARD) // 偵測卡片是否插入 return 0; // 無卡片,返回 0 Delay (140); // 延遲140m sec SD_PWRON (); // 打開SD card電源 return 1; }

void SD_power_off (void)

(30)

2.3 外部中斷與事件(External Interrupts and Events - EXTI)

STM32F 微控器的向量中斷控制器(NVIC)提供了 60 個可遮罩的中斷通 道,和16 個可程定優先等級的低延遲異常和中斷處理。外部中斷/事件控制 器(簡稱 EXTI)是由 19 個產生事件/中斷要求的邊沿檢測器所組成的,每個 輸入可以獨立地配置其輸入類型(邊沿或準位)和對應的觸發事件(上升沿或 下降沿或者雙邊沿都觸發) [1], [2]。 詳細的向量中斷控制器(NVIC)資訊請參考意法半導體公司的使用手冊 RM0008 Referance Manual ch.8 [1],以及 ARM 公司的 Cortex-M3 Technical Referance Manual [2]。 圖2-11為本系統的外部中斷輸入電路,使用了PC[5:8]來做為播放動作 的按鍵輸入,PC[5]為主功能切換按鍵,PC[6]為播放功能按鍵,PC[7]為選 擇歌曲按鍵,PC[8]為停止播放按鍵。 圖2-11 外部中斷輸入電路 圖2-12 為中斷輸入設定的 EXTI_Init ( )副程式,設定 AFIO_EXTICRx 暫存器,選擇GPIOC 埠的 PC[5:8]為中斷輸入來源,EXTI_IMR 暫存器用來 開啟中斷功能,EXTI_FTSR 暫存器則是設定中斷觸發功能為向下邊緣觸 發。由於 EXTI 功能的中斷觸發 5 至中斷觸發 9,使用同一個中斷向量 EXTI9_5,因此在執行中斷向量副程式時,需要另外判斷是那一個接腳觸發 中斷。 EXTI SWITCH PC6 SWITCH 4P 1 2 3 4 JP29 JP4X2/DIP/P2.54 4x2 1 2 3 4 5 6 7 8 PC7 SWITCH 4P 1 2 3 4 PC7 SWITCH 4P 1 2 3 4 PC5 SWITCH 4P 1 2 3 4 D PC7 2,4 PC6 2,4 PC5 2,4 PC8 2,4 D D D

(31)

程式名稱:EXTI_Init ( )

功能敘述:設定 EXTI 中斷 (PC5 .. PC8)

輸 入:中斷訊號 PC8~5

輸 出:EXTI9~5_IRQ 中斷向量

void EXTI_Init(void)

{ RCC->APB2ENR |= (1<<0); // AFIO enable

AFIO->EXTICR[2] = 0x0002; // Set external interrupt source as PC8 AFIO->EXTICR[1] = 0x2220; // Set external interrupt source as PC7-PC5 EXTI->IMR = 0x000001E0; // EXTI mask enable TR8-TR5

EXTI->FTSR = 0x000001E0; // Set Falling edge NVIC->Enable[0] |= (1 << (EXTI9_5_IRQChannel & 0x1F));

}

圖2-12 EXTI 設定副程式

圖2-13為使用編譯軟體所提供的程式庫,在Configuration Wizard中選擇 EXTI暫存器設定的選單,針對系統應用的中斷輸入接腳,直接選擇所須要 的模式與觸發條件。

(32)

2.4 通用計數器(General Purpose Timer - TIMx)

STM32F微控器的通用計數器(簡稱TIM),是由預分頻器與自動裝載計 數器所構成,可以設定為向上計數、向下計數或者雙向計數等三種模式。 並且應用在多種場合,如產生定時中斷、測量輸入信號的脈衝寬度和產生 PWM輸出波形等。 本文所用到的TIM工作模式為向上計數模式與脈衝寬度調變(PWM)模 式,圖2-14為TIM模組的工作架構,我們將TIM4設定為向上計數模式,主 要應用在播放音樂時,用來產生與取樣頻率(Sample frequency)一致的定時 中斷,該中斷副程式會在每一次中斷發生時,輸出一筆音樂資料 [1]。 另外將TIM3設定為脈衝寬度調變(PWM)模式,由於一般低價位的微控 器大都沒有內置數位轉類比(DAC)功能,因此我們將數位音樂資料透過 PWM方式來產生相對應的波形輸出,再經由低通濾波器(LPF)來將PWM波 形轉為類比訊號。 圖2-14 TIM 中斷處理架構 詳細的通用計數器(TIM)資訊請參考意法半導體公司的使用手冊 Memory Buffer TIM4 中斷副程式 TIM3 中斷副程式 PWM 輸出 LPF

(33)

2-4-1 向上計數模式(Up counting mode)

在向上計數模式中,計數器從0計數到自動載入值(TIM_ARR暫存器) 後,會產生一個溢出事件,並且重新從0開始計數,圖2-15為計數器的向上 計數模式時序圖,其中計數器頻率(CK_CNT)為系統頻率(CK_INT)除4, TIM_ARR暫存器設定為36,當計數器數到設定值(= 36)時,會發出溢位與更 新事件訊號,如果有開起中斷,則同時會發出中斷旗標。 圖2-15 向上計數模式時序 [1]

TIM計數器的主要工作頻率(fINT)是從APB1區域分頻而來的,計數器會

先透過TIM_PSC暫存器的預分頻因數,來改變計數器的計數頻率(fCNT)。當 TIM計數器計數到自動裝載暫存器(TIM_ARR)內的數值時,會發出TIM中斷 請求。因此我們可以算出中斷訊號發出的頻率(fTIM)。 fINT fAPB (1) fCNT fINT TIM_PSC 15: 0 1 (2) fTIM fCNT TIM_ARR 15: 0 1 (3)

其中fAPB1為功能裝置橋接器的頻率,本系統為72MHz。fINT為TIM4計數器的

(34)

圖 2-16 為編譯軟體所提供的 STM32_Init.c 程式庫,在 Configuration Wizard 中選擇 TIM4 計數器暫存器設定的選單,針對 TIM4 計數器的設定, 直接使用下拉選單的方式選擇所須要的中斷頻率與操作模式。

(35)

2-4-2 脈衝寬度調變模式(PWM mode)

脈衝寬度調變(PWM)是一種將數位信號藉由高解析度計數器的應用, 圖 2-17 為方波週期內工作週期的波形與計算方式,(4)為工作週期的算式, 工作週期可以用來對應具體的類比信號。PWM 信號仍然屬於數位處理的範 圍,因為在給定的任何時刻,PWM 輸出只會有 0 或 1 的狀態。透過 0 和 1 所對應的直流電壓準位,(5)為計算工作週期和電壓的關係式,可將數位的 方波換算成類比訊號。理論上只要頻寬足夠,任何類比訊號都可以脈衝寬 度調變(PWM)的方式表示出來 [1], [3]。 Duty Cycle : D 0 ≤ D ≤ 1 Complement : D’ D’ = 1 - D 圖2-17 PWM duty cycle 波形 [3] D 1 TD /TS (4) V D V (5) 其中D為PWM的工作週期。TD為週期內導通時間。TS為整個週期時間。Vs g s g g s s s T s s s DV v v DV V DT T v dt t v T v s     

) ( 1 ) ( 1 0 TD TD

(36)

圖2-18為TIM計數器的脈衝寬度調變(PWM)模式的波形,輸出一個由 (6)計算工作頻率的TIM_ARR暫存器設定值,由(8)計算週期的TIM_CCR暫 存器設定值的PWM信號。另外,TIM計數器的PWM有兩種工作模式,在 PWM模式1下,當計數器 ≥ CCR時,PWM輸出為HIGH;在PWM模式2下, 當計數器 ≥ CCR時,PWM輸出為LOW。 圖2-18 PWM 模式 1 與模式 2 波形 脈衝寬度調變(PWM)模式的工作頻率,可以由TIM_PSC暫存器與 TIM_ARR暫存器來決定,其中TIM_ARR暫存器又可以決定脈衝寬度調變的 解析度,再透過比較TIM_CCR暫存器的設定值,得到所要的工作週期。

fPWM fINT TIM_PSC 1 TIM_ARR 1 (6)

NPWM TIM_ARR 1 (7)

D TIM_CCR TIM_ARR 1 (8)

其中fPWM為PWM模組的工作頻率。NPWM為PWM模組的解析度。

Counter TIM3_ARR TIM3_CCR

PWM Mode 1

PWM Mode 2

(37)

圖2-19為解析度設為256階,工作週期為CCR=4與CCR=255的輸出波 形,當計數器值與CCR減1相等時,會發出Capture/Compare中斷訊號,並且 PWM輸出為低電位,直到計數器值清除為0時,PWM才會輸出為高電位。 當TIM_PSC=0,TIM_ARR=255(0xFF)時,可得到 PWM 工作頻率(fPWM) 與PWM 週期解析度(NPWM)為: fPWM 72MHz 0 1 255 1 281.25KHz NPWM 255 1 256 當CCRx 設為 4 時,工作週期 D = 4 / (255 + 1) = 1.56% 當CCRx 設為 255 時,工作週期 D = D = 255 / (255 + 1) = 99.6% 圖2-19 CCR 為 4 與 255 的 PWM 輸出波形 [1] 圖2-20為TIM3_Init()副程式,設定TIM3計數器來輸出8位元解析度,且 工作頻率大於44.1KHz的PWM波形,設置需要的PWM工作頻率與解析度, 並開啟TIM3中斷向量來更新CCR值。一般常用的DAC輸出有8、12和16位 元,在此三種解析度的狀況下,PWM的工作頻率為: TIM3_ARR = 2解析度位元數 = {256,4096,65536} FPWM(8bit) = 72MHz / 256 = 281.25KHz

(38)

FPWM(16bit) = 72MHz / 65536 = 1098.6Hz 當PWM的工作頻率大於最大取樣頻率時,PWM輸出才能夠真實反應訊號, 因此只有在解析度為8位元的條件下,PWM的工作頻率才會大於44.1KHz, 所以TIM3_ARR暫存器的設定值為28 1 255 。 程式名稱:TIM3_Init ( ) 功能敘述:設定 TIM3 PWM 模式 輸 入:TIM3_PSC,TIM3_ARR 輸 出:TIM3_IRQ 中斷向量

void TIM3_Init (void)

{

RCC->APB1ENR |= (1<<1); // TIM3 enable

TIM3->PSC = 0x00; // CK_CNT = 72MHz / (0 + 1) = 72MHz TIM3->ARR = 0xFF; // CK_TIM = CK_CNT / 255+ 1) =281.25KHz TIM3->CCMR1 = 0x0000; // OC1M/2M = FROZEN

TIM3->CCMR2 |= (6<<4); // OOUPUT COMPARE 3 MODE = PWM MODE 1 TIM3->CCMR2 |= (7<<12); // OOUPUT COMPARE 4 MODE = PWM MODE 2 TIM3->CCER |= (1<<12); // CC4E enable

TIM3->CCER |= (1<<8); // CC3E enable

TIM3->CR1 |= (1<<2); // UPDATE REQUEST SOURCE ENABLE TIM3->DIER |= (1<<0); // UPDATE INTERRUPT ENABLE NVIC->ISER[0] |= (1 << (TIM3_IRQChannel & 0x1F));

} 圖2-20 TIM3 計數器設定 圖 2-21 為將一小段音訊資料放在微控器的記憶體中,透過模擬軟體將 資料由 TIM4 產生 8KHz 的取樣頻率來輸出到 TIM3 的 PWM 模組,設定 CCR3 工作在模式 1,CCR4 工作在模式 2,我們可以在 PC[0:1]得到每筆資 料相對應的PWM 輸出波形。

(39)

圖2-21 模擬 PWM 輸出波形

記憶體資料 8 位元數位資料

PWM 輸出波形 Mode 1

(40)

2-4-3 PWM 低通濾波器

本系統使用PWM 輸出模式來取代 DAC 功能,用以降低硬體成本與減 少DAC 控制流程,其工作原理為將數位音樂資料轉換為脈衝波寬調變的數 位訊號,然後經由低通濾波器來將高頻的PWM 工作頻率消除,保留原始的 低頻音樂訊號。聲音頻率的範圍在 20Hz 到 20KHz 左右,而 PWM 的工作 頻率一般為聲音頻率的10 倍以上(至少 200KHz),本系統的 PWM 工作頻率 為281.25KHz。 使用 PWM 模式來輸出音樂訊號屬於 D 類放大器,一般將輸出訊號通 過低通濾波器後就可直接接到喇叭播放,由於本系統使用的STM32 微控器 PWM 輸出為訊號等級(最大電流 25mA 輸出),無法直接驅動播放裝置,因 此需要使用 OP 放大器來將訊號的功率放大,圖 2-22 為本系統的放大器與 濾波器電路。 圖2-22 放大器與低通濾波器電路

Low Pass Filter

JP43 1 2 JP44 1 2 JP45 1 2 JP46 1 2 T3_CH3

AUDIO AMPFILY

PB0 -> LEFT PB1 -> RIGHT PWM_R PWM_L PWM_L PWM_R NC1 D PB1 2,4 PB0 2,4 U4 BH3544 AUDIO AMP SOP8/SMD OU T 1 1 MU TE 2 IN1 3 GN D 4 VC C 8 OU T 2 7 BI A S 6 IN2 5 + CE3 2.2uF/50v C2.2UF50V/D4H5 + CE4 2.2uF/50v C2.2UF50V/D4H5 R46 10K R39 10K R47 100K R40 220 C24 0.1uF CAP/104/100V + CE7 47uF/16v C47UF16V/D5H5 C20 33nF CAP/104/100V R43 1K R41 220 R33 220 LPF_R C21 33nF CAP/104/100V LPF_L R45 33K C16 33nF CAP/104/100V C25 0.1uF CAP/104/100V + CE8 47uF/16v C47UF16V/D5H5 R36 1K R34 220 R38 33K 1 Li 1' Ri 2' Ro 2 Lo VR2 VR DIP7P_0 VR7P/DIP/P2.0 1 5 1' 4 2' 3 2 2 C 1 7 K2 6 K1 L R G PHONE1

PORT PHONEJACK STEREO DIP3P

PHONEJACK/3P/DIP 1 2 3 C17 33nF CAP/104/100V + CE5 47uF/16v C47UF16V/D5H5 +CE6 47uF/16v R48 4.7 AVCC VIN AVCC AVCC T3_CH4

(41)

我們將濾波器電路拆分為兩個部分來進行分析,圖2-23 (a)為用來將高 頻的PWM 頻率濾除的二階低通濾波器電路,使用 R 為 220Ω與 C 為 33nF 時,其轉移函數為(9),-3dB 截止頻率為 21.92KHz,(b)為二階 RC LPF 的波 德圖,(c)為其相位圖。 GLPF s . . . (9) (a) 二階 RC LPF 電路 (b) 二階 RC LPF 波德圖  (c) 二階 RC LPF 相位圖  圖2-23 二階低通濾波器分析 圖2-24 (a)為接在低通濾波器後用來把低頻的直流部份濾除的一階高通 濾波器(HPF)電路,當使用 R 為 10KΩ與 C 為 2.2uF 時,其轉移函數為(10), -3dB 截止頻率為 7.23Hz,(b)為一階 RC HPF 的波德圖,(c)為其相位圖。 GHPF s . (10) Input Output

(42)

(a) 一階 RC HPF 電路 (b) 一階 RC HPF 波德圖 (c) 一階 RC HPF 相位圖 圖2-24 一階高通濾波器分析 整個PWM 波形的濾波電路為圖 2-25(a)所示,其結合了低通與高通濾 波器,並且其通過頻帶為7.23Hz 到 21.92KHz,相當於一個帶通濾波器,(b) 為整個濾波器電路的波德圖,(c)為其相位圖。 (a) PWM 濾波器電路 (b) PWM 濾波器波德圖 (c) PWM 濾波器相位圖 圖2-25 PWM 濾波器的分析 Input Output Input Output

(43)

我們使用PWM 訊號來量測濾波器電路的功能,圖 2-26 為以 8KHz 播 放頻率輸出PWM 訊號,經過濾波器電路的波形,(a)為 PWM 輸出訊號與經 過一階LPF 的波形,可以在一階 LPF 的輸出波形上面看到 PWM 的高頻成 份,(b)為經過一階與二階 LPF 的波形,在二階 LPF 的輸出波形上面高頻成 份已經明顯被消除。 (a) PWM 輸出波形與 經過一階LPF 的輸出波形 (b) 經過一階與二階 LPF 的輸出波形 圖2-26 輸出 8KHz PWM 訊號經過濾波器的波形 圖2-27 為以 44.1KHz 播放頻率輸出 PWM 訊號,經過濾波器電路的波 形,(a)為 PWM 輸出訊號與經過一階 LPF 的波形,(b)為經過一階與二階 LPF 的波形。 (a) PWM 輸出波形與 經過一階LPF 的輸出波形 (b) 經過一階與二階 LPF 的輸出波形 2-27 輸出 44.1KHz PWM 訊號經過濾波器的波形

(44)

2.5 序列週邊介面(Serial Peripheral Interface)

STM32F 微控器內建了兩組序列週邊介面(簡稱 SPI),允許微控器通過 四線制串列匯流排介面與外部設備做資料溝通,STM32 微控器的 SPI 介面 可以被設置成主模式(Master)或僕模式(Slave) [1]。在本文的多媒體應用中, 我們將SPI 模式操作在主模式下,用來跟 SD 記憶卡做資料溝通。 圖 2-28 為 SPI 模式的四條導線分別為串列時脈、主出僕入、主入僕出 和僕裝置選擇(NSS)訊號連接多個僕裝置。在主模式下,串列時脈(SCK)由 主裝置提供,命令由 MOSI 訊號線發出,資料由 MISO 訊號線接收,NSS 為僕裝置元件選擇線,每一個僕裝置需要獨立的NSS 訊號。

圖2-28 單一 SPI Master 匯流排對複數 Slave [1]

詳細的序列週邊介面(SPI)資訊請參考意法半導體公司的使用手冊 RM0008 Referance Manual ch.23 [1]。 表2-3 為本系統的 SPI 模組所對應的 I/O 接腳與功能說明。 SCK:串列時脈,由主裝置輸出頻率,僕裝置接收頻率。 MISO:主入/僕出接腳,在主模式下接收僕裝置發出的資料,在僕模式下發 送資料給主裝置。 MOSI:主出/僕入接腳,在主模式下主裝置發送命令與資料,在僕模式下接 SCK MOSI MISO /NSS SPI Master SCK MOSI MISO /NSS1 /NSS2 SPI Slave SPI Slave SCK MOSI MISO /NSS

(45)

NSS:僕裝置選擇,這是一個用來選擇僕裝置的接腳,它讓主裝置可以單獨 地與特定僕裝置通訊,避免資料線發生衝突,NSS 僕裝置選擇接腳可以使

用GPIO 來取代,用以擴充僕裝置的數量。

表2-3 SPI 模式接腳映射 [1]

PIN Function SPI1 SPI2

NSS 僕裝置選擇,用來選擇主/僕裝置 PA4 PB12 SCK 串列時鐘,作為主裝置的輸出 PA5 PB13 MISO 主裝置輸入/僕裝置輸出接腳 PA6 PB14 MOSI 主裝置輸出/僕裝置輸入接腳 PA7 PB15 圖2-29 為 STM32F 微控器的 SPI 模組方塊圖,其透過 4 個 SPI 暫存器 來控制,SPI_CR1 暫存器用來控制 SPI 模組的傳輸頻率、MSB/LSB 傳輸方 式、16/8 位元傳輸方式等;SPI_CR2 暫存器用來設定 SPI 模組的中斷控制; SPI_SR 暫存器用來判斷傳輸狀態;SPI_DR 暫存器用來儲存傳送或接收的 資料。 圖2-29 SPI 模組方塊圖 [1]

(46)

表2-4 至 2-7 節錄了意法半導體公司 RM0008 Referance Manual ch22 [1]

使用手冊的SPI 模組暫存器說明,包含狀態暫存器、控制暫存器 1、控制暫

存器2 與資料暫存器。

表2-4 SPI 狀態暫存器 [1]

31:8 7 6 5 4 3 2 1 0 Res BSY OVR MODF CRC

ERR

UDR CHSIDE TXE RXNE

Res R R R R R R R R BSY:忙碌標誌 0:SPI 不忙 1:SPI 正忙於通信,或者發送緩衝非空 UDR:下溢標誌位元 0:未發生下溢 1:發生下溢。 OVR:溢出標誌 0:沒有出現溢出錯誤 1:出現溢出錯誤 CHSIDE:聲道 0:需要傳輸或者接收左聲道 1:需要傳輸或者接收右聲道 MODF:模式錯誤 0:沒有出現模式錯誤 1:出現模式錯誤 TXE:發送緩衝為空 0:發送緩衝非空 1:發送緩衝為空 CRCERR:CRC 錯誤標誌 0:收到的 CRC 值和 SPI_RXCRCR 暫存器中的值匹配 1:收到的 CRC 值和 SPI_RXCRCR 暫存器中的值不匹配 RXNE:接收緩衝非空 0:接收緩衝為空 1:接收緩衝非空 表2-5 SPI 控制暫存器 2 [1] 31:8 7 6 5 4 3 2 1 0 Res TXEIE RXNEIE ERRIE Res SSOE TXDMAEN RXDMAEN

Res RW RW RW Res Res RW RW RW

TXEIE:發送緩衝區空中斷使能 0:禁止TXE中斷 1:允許 TXE 中斷,當 TXE 標誌置位元時產生插斷要求 SSOE:SS輸出使能 0:禁止在主模式下SS輸出,該設備可以工作在多主設備 模式 1:設備開啟時,開啟主模式下 SS 輸出,該設備不能工 作在多主設備模式 RXNEIE:接收緩衝區非空中斷使能 0:禁止RXNE中斷 1:允許 RXNE 中斷,當 RXNE 標誌置位元時產生插斷要求 TXDMAEN:發送緩衝區DMA使能,當該位元被設置 時,TXE標誌一旦被置位元就發出DMA請求 0:禁止發送緩衝區DMA 1:啟動發送緩衝區 DMA ERRIR:錯誤中斷使能,當錯誤(CRCERR、OVR、MODF) 產生時,該位控制是否產生中斷 0:禁止錯誤中斷 RXDMAEN:接收緩衝區DMA使能,當該位元被設置 時,RXNE標誌一旦被置位元就發出DMA請求 0:禁止接收緩衝區DMA

(47)

表2-6 SPI 資料暫存器 [1] 31:16 15:0 DR{15:0} RW DR[15:0]:資料暫存器 待發送或者已經收到的資料,料暫存器對應兩個緩衝區:一個用於寫(發送緩衝);另外一個用於讀(接收緩衝)。 寫操作將資料寫到發送緩衝區;讀操作將返回接收緩衝區裡的資料。 表2-7 SPI 控制暫存器 1 [1] 31:16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 0 BIDI MODE BIDI OE CRCEN CEC NEXT DFF RX ONLY SSM SSI LSB FIRST SPE BR[2:0] MSTR CPOL CP HA R RW RW RW RW RW RW RW RW RW RW RW RW RW RW RW RW BIDIMODE: 雙向資料模式致能 0:選擇“雙線雙向”模式 1:選擇“單線雙向”模式 SSI: 內部從設備選擇 該位只在SSM 位為’1’時有意義。它決定了 NSS 上的電 位,在NSS 引腳上的 I/O 操作無效 BIDIOE: 雙向模式下的輸出致能,和 BIDIMODE 一起決定 在“單線雙向”模式下資料的輸出方向 0:輸出禁止(只收模式) 1:輸出致能(只發模式) BR[2:0]:串列傳輸速率控制 000: fPCLK/2 001: fPCLK/4 010: fPCLK/8 011: fPCLK/16 100: fPCLK/32 101: fPCLK/64 110: fPCLK/128 111: fPCLK/256 CRCEN: 硬體 CRC 校驗致能 0:禁止 CRC 計算 1:啟動 CRC 計算 SPE: SPI 致能 0:禁止 SPI 設備 1:開啟 SPI 設備。 CRCNEXT: 下一個發送 CRC 0:下一個發送的值來自發送緩衝區。 1:下一個發送的值來自發送 CRC 暫存器。 LSBFIRST:框架格式 0:先發送 MSB 1:先發送 LSB DFF: 數據框架格式 0:使用 8 位元資料框架格式進行發送/接收 1:使用 16 位元資料框架格式進行發送/接收 MSTR: 主設備選擇 0:配置為從設備 1:配置為主設備 RXONLY:只接收,和 BIDIMODE 位一起決定在“雙線雙向” 模式下的傳輸方向 0:全雙工(發送和接收) 1:禁止輸出(只接收模式) CPOL: 時鐘極性 0: 空閒狀態時,SCK 保持低電位 1: 空閒狀態時,SCK 保持高電位 SSM:軟體從設備管理,當 SSM 被置位時,NSS 引腳上的 電位由SSI 位的值決定 0:禁止軟體從設備管理 1:啟用軟體從設備管理 CPHA: 時鐘相位 0: 資料採樣從第一個時鐘邊沿開始 1: 資料採樣從第二個時鐘邊沿開始

(48)

2.5.1 SPI 模式的初始設定

在本文的多媒體應用上,STM32F 微控器作為系統的核心,將 SPI 模組 設定為 Master 用來控制 SD 記憶卡的資料傳遞,所以我們將針對在主模式 工作的設定進行說明,其設定步驟如下: 1. 設定 SPI_CR1 暫存器的串列傳輸速率控制位元 BR[2:0],由(11)計算的初 始傳輸速率。在SD 記憶卡的規格書裡,規範在初始化記憶卡與進行卡判斷 的流程中,SCK 串列時脈的頻率不可超過 400KHz,在執行完記憶卡判斷的 流程後,才能調升頻率到25MHz。 fBR fPCLK/2 NBR : (11)

其中fBR為SPI模組的傳輸速率。fPCLK為SPI模組的輸入頻率。NBR為SPI模組

輸速率控制位元。

2. 設定 SPI_CR1 暫存器的 CPOL 和 CPHA 位元,圖 2-30 中為 STM32 微控

器 SPI 模組的資料傳輸和串列時序的相位關係與極性,總共能夠組合成四 種時序關係。CPOL(頻率極性)位元控制在沒有資料傳輸時時鐘的空閒狀態 電位,如果CPOL 清為 0,SCK 輸出接腳在空閒狀態保持低電位;如果 CPOL 設置為1,則 SCK 輸出接腳在空閒狀態保持高電位。另外,如果 CPHA(頻 率相位)位元被設置為 1,則資料位元的採樣在 SCK 時鐘的第二個邊沿進 行;CPHA 位元被清為 0,則在 SCK 時鐘的第一個邊沿進行資料位元採樣。 3. 設置 SPI_CR1 暫存器的 DFF 位元來定義 8 或 16 位元資料格式,SD 記憶 卡的SPI 傳輸模式使用 8 位元格式,因此將 DFF 位元設置為 0。

4. 設置 SPI_CR1 暫存器的 LSBFIRST 位元定義資料格式,SD 記憶卡的 SPI

(49)

圖2-30 SPI 模式資料傳輸的時序圖 [1]

5. 設置 SPI_CR1 暫存器 MSTR 位元,我們將 SPI 模組設置為 Master 主裝

置,因此將MSTR 位元設置為 1。

6. 設置 SPI_CR1 暫存器 SPE(Enable)位元,用以開啟 SPI 模組電路功能。 7. 設置 NSS 接腳的 GPIO 模式,將其對應的腳位設定為 Push-pull Output, 用來做為選擇僕裝置的輸出接腳。

圖 2-31 為 SPI 模式的初始設定副程式 SPI_Configuration( ),首先必須

將 SPI 模式下所對應的 I/O 接腳埠致能,本系統使用 SPI1 模組,因此對應

到GPIOA 埠的 PA[4:7]。接著便依照 SD 記憶卡的規格與主模式的設定設置

SPI_CR1 暫存器,最後將 SPI_CR1 的 SPE 位元設置為 1,用來啟動 SPI 模 組電路功能。

(50)

程式名稱:SPI_Configuration () 功能敘述:SPI 模組初始設定 輸 入:無 輸 出:無 void SPI_Configuration(void) { RCC->APB2ENR |= (1<<2); // 啟動GPIOA GPIOA->CRL &= 0x000FF0FF; GPIOA->CRL |= 0xB8B00300; // 設定 PA4, 5, 6, 7 模式 RCC->APB2ENR |= (1<<12); // 啟動SPI1 頻率 SPI1->CR1 = 0; // 清除 CR1 SPI1->CR1 |= 0<<15; // 雙向資料模式 SPI1->CR1 |= 0<<13; // 關閉 CRC 功能 SPI1->CR1 |= 0<<11; // 資料格式為 8bit SPI1->CR1 |= 0<<10; // 全雙工模式 SPI1->CR1 |= 1<<9; // 軟體控制僕裝置選擇 SPI1->CR1 |= 1<<8; // 內部從設備選擇 SPI1->CR1 |= 0<<7; // 高位元先傳輸 SPI1->CR1 |= 6<<3; // 傳輸率 fpclk / 128 SPI1->CR1 |= 1<<2; // 設定為主裝置 SPI1->CR1 |= 0<<1; // 空閒時頻率輸出為 1 SPI1->CR1 |= 0<<0; // First clock at first data SPI1->CR1 |= 1<<6; // 啟動 SPI 模組 }

(51)

2.5.2 SPI 模式的資料傳輸

SPI 模式的資料傳輸是以 1 個位元組為最小單位,我們以圖 2-32 發送 1

位元組資料的SPI_WriteByte( ) 副程式來說明動作流程,在資料的發送流程

裡,當資料寫進資料暫存器後,SPI 模組就會開始執行發送流程。在發送第

一個位元資料前,資料暫存器的資料會先傳入移位暫存器內,而後經由 SPI_CR1 暫存器中的 LSBFIRST 位元來決定是 MSB 或 LSB 先發送到 MOSI

腳位上。當資料暫存器的資料傳送到移位暫存器後,狀態暫存器的TXE 位

元會被設置為1,表示緩衝器是空的。因此在將資料寫入資料暫存器之前,

需要先確認TXE 位元標誌是否為 1,這樣才不會造成資料衝突。

程式名稱:SPI_WriteByte ()

功能敘述:使用 SPI 模組發送 1 位元組資料

輸 入:unsigned char data 輸 出:SPI_DR 資料

u8 SPI_WriteByte (u8 data)

{

while ((SPI1->SR & 1<<1) == 0); //輸出暫存器不為空 SPI TXE = 0, SPI1->DR = data; // load date to SPI_DR

while ((SPI1->SR & 1<<0) == 0); // 輸入暫存器為空SPI RXNE = 0, return SPI1->DR; // receive SPI_DR data

}

圖2-32 SPI 模式的資料發送副程式 Yes

TXE 空? SPI_DR = Data

RXE 空? Return SPI_DR Start

End Yes

No

(52)

SPI 模式的資料接收也是以 1 個位元組為基本單位,SPI 模組在資料接 收完成後,RX 移位暫存器中接收到的資料字組會被傳送到資料暫存器內, 並且在最後一個時鐘邊沿,設置狀態暫存器的 RXNE 標誌位元為 1,表示 資料接收完畢。當我們讀取資料暫存器時,SPI 模組會返回接收到的位元組 資料,並清除RXNE 位元。 圖2-33 為 SPI 模組接收 1 位元組資料的 SPI_ReadByte( )副程式,將代 表空資料的0xFF 送出後,等待狀態暫存器的 RXNE 標誌被設定,如果 RXNE 為1 時,則返回資料暫存器內的資料。 程式名稱:SPI_ReadByte () 功能敘述:使用 SPI 模組讀取 1 位元組資料 輸 入:無 輸 出:SPI_DR 資料 u8 SPI_ReadByte (void) {

while ((SPI1->SR & 1<<1) == 0); //輸出暫存器不為空 SPI TXE = 0, SPI1->DR = DUMMY; // DUMMY = 0xFF

while ((SPI1->SR & 1<<0) == 0); // 輸入暫存器為空SPI RXNE = 0, return SPI1->DR;

}

圖2-33 SPI 模式的資料接收副程式 Yes

TXE 空? SPI_DR = 0xFF

RXE 空? Return SPI_DR Start

End Yes

No

(53)

2.5.3 SPI 模式下的 DMA 傳輸

STM32F 微控器的 SPI 模組可以使用 DMA 模式來加速傳輸速率,內建

DMA1 與 DMA2 兩組控制器,DMA1 控制器有 7 組通道,DMA2 控制器有 5 組通道,每一個通道對應一個或多個裝置模組。分配給 SPI1 RX 模組使用

的是DMA1 的 Channel 2,給 SPI1 RX 使用的是 DMA1 的 Channel 3。每一

個通道都可以在設備暫存器和記憶體位址之間執行DMA 傳輸 [1]。

詳細的DMA 說明資訊請參考意法半導體公司的使用手冊 RM0008

Referance Manual ch.9 [1]。

圖2-34 為使用 DMA 通道來傳遞 SPI1 模組資料的 stm_dma_transfer( )

設定副程式 [18],STM32 微控器將 SPI1 的 RX 規劃在 DMA1 的通道 2, TX 規劃在通道 3。

DMA1 的通道 2 用來進行 SPI1 的 RX 接收動作,在 DMA1_CPAR2 暫

存器中填入 SPI 設備的 SPI1_DR 暫存器的位址,此為 DMA 傳輸時的資料

來源位址;在 DMA1_CMAR2 暫存器中設置記憶體緩衝區的位址,傳輸的 資料將寫入這個記憶體位址;需要在DMA_CCR2 暫存器中設置資料傳輸的 方向的 DIR 位元為 0,表示資料來源從記憶體讀取,還需設定外設和記憶 體的資料寬度;在DMA_CNDTR2 暫存器中可以設置所需要的資料量,DMA 控制器在接收每一筆資料後,CNDTR 數值會遞減,當遞減為零時,DMA 接收動作會停止。

DMA1 的通道 3 用來進行 SPI1 的 TX 傳輸動作,在 DMA1_CPAR3 暫

存器中設置 SPI 設備的 SPI1_DR 暫存器的位址,此為 DMA 傳輸時的資料

(54)

體的增量模式、外設和記憶體的資料寬度;在 DMA_CNDTR3 暫存器中設 置要傳輸資料量,在每筆資料傳輸後,這個數值會遞減。 程式名稱:stm32_dma_transfer ( ) 功能敘述:使用 DMA 傳輸模式來傳送/接收 SPI 資 料(rx only) 輸 入:u8 *buff 緩衝區位置 u32 btr 要讀取的位元組數量 輸 出:u8 * buff 資料寫入緩衝區位置

void stm32_dma_transfer(const u8 *buff, u32 btr)

{

u16 rw_workbyte[] = { 0xffff };

RCC->AHBENR |= (1<<0); // 啟動DMA1 頻率

DMA1->IFCR |= DMA1_Channel2_IT_Mask; // 設定 DMA1 ch2 = SPI RX DMA1->IFCR |= DMA1_Channel3_IT_Mask; // 設定 DMA1 ch3 = SPI TX // DMA1 channel2 configuration SPI1 RX

DMA1->CPAR2 = (u32)(&(SPI1->DR)); // 裝置來源 SPI1_DR DMA1->CMAR2 = (u32)buff; // 記憶體來源 buff DMA1->CCR2 = 0x3080;

DMA1->CNDTR2 = btr;

// DMA1 channel3 configuration SPI1 TX

DMA1->CPAR3 = (u32)(&(SPI1->DR)); // 裝置來源 SPI1_DR DMA1->CMAR3 = (u32)rw_workbyte; // 記憶體來源 workbyte DMA1->CCR3 = 0x3010;

DMA1->CNDTR3 = btr;

DMA1->CCR2 |= CCR_ENABLE_Set; // 啟動DMA1 ch2 RX

DMA1->CCR3 |= CCR_ENABLE_Set; // 啟動DMA1 ch3 TX

SPI1->CR2 |= (SPI_I2S_DMAReq_Rx | SPI_I2S_DMAReq_Tx); // 啟動 SPI RX TX 請求 // 等待 DMA1_Channel 3 Transfer Complete, DMA1_Channel 2 Receive Complete

while (DMA_GetFlagStatus(DMA_FLAG_SPI_SD_TC_RX) == 0) { ; }

DMA1->CCR2 &= CCR_ENABLE_Reset; // 關閉DMA1 ch2 RX DMA1->CCR3 &= CCR_ENABLE_Reset; // 關閉DMS1 ch3 TX SPI1->CR2 &= (u16)~(SPI_I2S_DMAReq_Rx | SPI_I2S_DMAReq_Tx); // 關閉 SPI RX TX 請求 }

(55)

圖 2-35 為使用迴圈或 DMA 通道的 SPI 資料接收程式,如使用迴圈來 接收資料會花費較多的時間在軟體處理上面,並造成資料接收時間過長影 響系統效率。而使用DMA 來傳輸資料,則會縮短資料接收時間。 程式名稱:SD_ReceiveData ( ) 功能敘述:使用 DMA 傳輸模式來接收設定數量的 SPI 資料 輸 入:u8 *data 資料緩衝區位置 u16 len 要讀取的資料數量 u8 release CS 是否放開 輸 出:u8 * buff 資料寫入緩衝區位置

u8 SD_ReceiveData(u8 *data, u16 len, u8 release)

{ u16 retry = 0; u8 r1; SD_Enable(); do { r1 = SPI_RWByte(DUMMY); if (retry++ > 5000) return r1; } while(r1 != 0xFE); while (len--) { r1 = SPI_RWByte(DUMMY); *data = r1; data++; } SPI_RWByte(DUMMY); SPI_RWByte(DUMMY); if (release == 1) { SD_Disable(); SPI_RWByte(DUMMY); } return 0; }

u8 SD_ReceiveData(u8 *data, u16 len, u8 release)

{ u16 retry = 0; u8 r1; SD_Enable(); do { r1 = SPI_RWByte(DUMMY); if (retry++ > 5000) return r1; } while(r1 != 0xFE);

stm32_dma_transfer (TRUE, data, (UINT)len); SPI_RWByte(DUMMY); SPI_RWByte(DUMMY); if (release == 1) { SD_Disable(); SPI_RWByte(DUMMY); } return 0; } (a) 迴圈模式 (b) DMA 模式 圖2-35 SPI 使用迴圈與 DMA 的傳輸程式

(56)

2.6 SDIO 模組

STM32F 微控器內置了與多媒體介面卡規格相容的 SDIO 模組,並且支 援三種不同的資料匯流排模式:1 位元(默認)、4 位元和 8 位元,SDIO 模組 在重置(Reset)後預設的資料匯流排為 1 位元模式,匯流排寬度可在與 SD 記 憶卡溝通過程中自由更改 [1],詳細的 SDIO 模組說明請參考意法半導體公 司的使用手冊RM0008 Referance Manual ch.19 [1]。 STM32 微控器的 SDIO 模組共有 10 根訊號線,表 2-8 分別說明其功能 與對應的GPIO 埠。 SDIO_CMD 為雙向傳輸的訊號線,用於傳輸命令與接收回應。 SDIO_SCK 用於提供 SD 記憶卡的時鐘頻率,SDIO 模組的 SCK 時鐘頻率 可以在0MHz 至 25MHz 之間變化。 SDIO_D[7:0]用於資料傳輸使用,SDIO 模組重置後,設定使用 SDIO_D[0] 於資料傳輸。在記憶卡初始化完成後,系統可以根據記憶卡的規格來改變 資料匯流排的寬度,如4 位元為 SDIO_D[3:0]或 8 位元為 SDIO_D[7:0]。 表2-8 SDIO 模組接腳對應 [1]

Pin Direction Description GPIO

SDIO_CK Output MultiMediaCard/SD/SDIO card clock. This pin is the

clock from host to card PC12

SDIO_CMD Bidirectional MultiMediaCard/SD/SDIO card command.

This pin is the bidirectional command/response signal.

PD2 SDIO_D0

Bidirectional MultiMediaCard/SD/SDIO card data. These pins are the bidirectional databus

PC8 SDIO_D1 PC9 SDIO_D2 PC10 SDIO_D3 PC11 SDIO_D4 PB8 SDIO_D5 PB9 SDIO_D6 PC6

(57)

2.6.1 SDIO 功能說明

STM32F 微控器的 SDIO 功能包含兩個部份,圖 2-36 為 SDIO 模組方塊

圖,內含SDIO 轉接器與 AHB 匯流排界兩個模組,其中 SDIO Adapter 轉接

器模組用來實現有關於 MMC/SD/SD-I/O 介面卡的所有功能,如 SCK 頻率

的產生、命令和資料的傳送等。AHB 匯流排介面用來操作 SDIO Adapter 轉

接器中的暫存器,並且可以產生中斷與DMA 請求。

圖2-36 SDIO 模組方塊圖 [1]

圖2-37 為 SDIO Adapter 轉接器模組的方塊圖,其包含了轉接器暫存器

(Adapter registers)、控制單元(Control unit)、命令通道(Command path)、資料 通道(Data path)與數據 FIFO 等 5 個部分,我們將針對命令通道與資料通道 進行說明。

(58)

命令通道(Command Path) 命令通道是執行向多媒體卡發送命令並接收從卡發出回應的單元,命 令的運作是通過命令通道狀態機(CPSM)來完成的。圖 2-38 為 SDIO 命令通 道狀態機的方塊圖,系統重置後CPSM 處於空閒狀態(Idle),當命令參數寫 入命令暫存器(SDIO_CMD)並設置了 CPSMEN 位元,就會開始發送命令; 命令發送完成時,命令通道狀態機(CPSM)設置狀態暫存器(SDIO_STA)的狀 態標誌,並在不需要回應時進入空閒狀態;當收到回應後,接收到的 CRC 碼將會與內部產生的CRC 碼比較,然後設置相應的狀態標誌;當進入等候 狀態時,命令計數器開始運行;當 CPSM 進入接收狀態之前如果產生了超 時,則會設置超時標誌並進入空閒狀態。 圖2-38 SDIO 命令通道狀態機方塊圖 [1]

(59)

圖 2-39 為用來發送命令的 SDIO_Send_Command( )副程式,將命令參 數寫入SDIO_ARG 暫存器,和將命令索引寫入臨時暫存器中,依照命令索 引的回應狀態,在臨時暫存器中設置WAITRESP 回應位元,和設置 CPSM 啟動位元,最後將設置好的臨時暫存器值寫入SDIO_CMD 暫存器,就完成 命令發送流程。 程式名稱:SDIO_SendCommand ( ) 功能敘述:發送 SDIO 命令 輸 入:*SDIO_CmdInitStruct 輸 出:無

void SDIO_SendCommand (SDIO_CmdInitTypeDef *SDIO_CmdInitStruct)

{

u32 tmpreg = 0;

SDIO->ARG = SDIO_CmdInitStruct->SDIO_Argument; // 設定Argument 參數

tmpreg = SDIO->CMD; // 讀取 SDIO_CMD 值到 tmpreg tmpreg &= CMD_CLEAR_MASK; // 清除 SDIO_CMD 設定位元 tmpreg |= (u32)SDIO_CmdInitStruct->SDIO_CmdIndex // 設定CMD 命令參數 | SDIO_CmdInitStruct->SDIO_Response // 設定WAITRESP 位元

| SDIO_CmdInitStruct->SDIO_Wait // 設定WAITINT and WAITPEND 位元 | SDIO_CmdInitStruct->SDIO_CPSM; // 設定CPSMEN 位元

SDIO->CMD = tmpreg; // 寫入到 SDIO_CMD 暫存器 } 圖2-39 SDIO 命令發送副程式 清除tempreg Start End 設定Arg 參數 tmpreg = SDIO_CMD tmpreg & 0xFFFFF800 tempreg | CPSM_EN SDIO_CMD=tempreg tempreg | cmdindex tempreg | response

(60)

資料通道(Data Path) 資料通道控制主裝置與多媒體卡之間的傳輸資料,STM32 微控器的 SDIO 模組,是以 1 位元資料匯流排為初始設定,一個時鐘週期只在 SDIO_D0 上傳輸 1 位元資料,在 SDIO_CLKCR 暫存器中,可以設置 WIDBUS[1:0] 位元來更改資料匯流排的寬度。圖2-40 為 SDIO 模組的 DPSM 資料通道狀 態機的方塊圖,系統重置後DPSM 處於空閒狀態(Idle),將資料傳輸模式設

定寫入SDIO_DCTRL 暫存器,並且設置 SDIO_DCTRL 暫存器的致能 DTEN

位元後,資料通道狀態機將根據傳輸的方向(發送或接收)進入 Wait_S 或 Wait_R 狀態。 發送時DPSM 進入 Wait_S 狀態,如果發送 FIFO 中有資料,則 DPSM 進入發送狀態(Send),同時資料通道開始向多媒體卡發送資料。 接收時DPSM 進入 Wait_R 狀態並等待開始位元,當收到開始位元後, DPSM 進入接收狀態(Reveive),同時資料通道開始從多媒體卡接收資料。

(61)

圖2-41 為資料通道狀態機(DPSM)的設定副程式,先將 Time Out 設定 值寫入 SDIO_DTIMER 暫存器,資料長度寫入 SDIO_DLEN 暫存器,再將 區塊大小、傳輸方向、傳輸模式寫入SDIO_DCTRL 暫存器,最後設定 DPSM 啟動位元,即完成資料通道狀態機設定。 程式名稱:SDIO_DataConfig ( ) 功能敘述:設定資料通道狀態機 輸 入:* SDIO_DataInitStruct 輸 出:無

void SDIO_DataConfig(SDIO_DataInitTypeDef* SDIO_DataInitStruct)

{

u32 tmpreg = 0;

SDIO->DTIMER = SDIO_DataInitStruct->SDIO_DataTimeOut; // 設定 TimeOut value SDIO->DLEN = SDIO_DataInitStruct->SDIO_DataLength; // 設定DataLength value

tmpreg = SDIO->DCTRL; // 讀取 SDIO_DCTRL 值到 tmpreg tmpreg &= DCTRL_CLEAR_MASK; // 清除 SDIO_DCTRL 設定位元 tmpreg |= (u32)SDIO_DataInitStruct->SDIO_DataBlockSize // 設定DBCKSIZE 位元 | SDIO_DataInitStruct->SDIO_TransferDir // 設定DTDIR 位元 | SDIO_DataInitStruct->SDIO_TransferMode // 設定DTMODE 位元 t | SDIO_DataInitStruct->SDIO_DPSM; // 設定DEN 位元

SDIO->DCTRL = tmpreg; // 寫入到 SDIO_DCTRL 暫存器 } 圖2-41 DPSM 設定副程式 清除tempreg Start End 設定block length tmpreg = SDIO_DCTRL tempreg | DPSM_EN SDIO_DCTRL=tempreg tempreg | block size

tempreg | dir

tempreg | mode

tmpreg & 0xFFFFFF08 設定time out

數據

圖 2-8  編譯軟體的 GPIO 設定      舉例本系統的SD記憶卡電源控制與卡片偵測應用電路,來說明GPIO的  基本輸入與輸出設定與使用。圖2-9的電路中,透過PA[2]控制P-MOSFET電  源開關,當輸出為低電位時,P-MOSFET導通並供給電源給SD記憶卡。若  輸出為高電位時,則關閉電源。      PA[8]用來偵測SD記憶卡是否插入或拔除,在記憶卡插槽中,有一根C/D  腳位元是用來偵測卡片狀態。當卡片插入插槽時,該C/D腳位會被拉到低電  位;相反的,當卡片拔除或沒有插好的狀況下,
圖 2-9 SD 記憶卡電源控制與插入偵測電路      圖2-10為本系統的電源控制與卡片偵測範常式式,使用GPIOA_IDR第8  位元的狀態,來偵測SD卡。使用GPIOA_ODR第2位元,來決定電源的供給。  程式名稱:check_sd_insert ( ),    SD_power_on ( )        SD_power_off  (  )  功能敘述:偵測卡片插入,打開 SD card 電源,    關閉 SD card 電源  輸    入:PA8 偵測卡片  輸    出:PA2 控制電
圖 2-16  編譯軟體的 TIM4 設定
圖 2-21  模擬 PWM 輸出波形
+7

參考文獻

相關文件

The method of least squares is a standard approach to the approximate solution of overdetermined systems, i.e., sets of equations in which there are more equations than unknowns.

command line, he specifies an arbitrary (but specific; in this case, 9989) local port that ssh should forward through the secure tunnel to the remote Windows ma- chine’s port

command line, he specifies an arbitrary (but specific; in this case, 9989) local port that ssh should forward through the secure tunnel to the remote Windows ma- chine’s port

compiler on the four memory segments static, this, local, argument In addition, there are four additional memory segments, whose role will. The VM’s

command tells Vim to run the text through a UNIX command.The ‘a tells the editor that the text to be worked on starts at the current line and ends at mark a.. The command that

The static, private, local and argument variables are mapped by the compiler on the four memory segments static , this , local , argument. In addition, there are four

All variables defined as the result of entering statements in the command window, exist in the Matlab workspace. At the beginning of a Matlab session, the workspace

Teachers may consider the school’s aims and conditions or even the language environment to select the most appropriate approach according to students’ need and ability; or develop