第第第 第第 I/O 第第第第第第第第第 Ping-Liang Lai ( 第第第 )
Jan 18, 2016
第六章
通用 I/O埠的工作原理與實驗
Ping-Liang Lai (賴秉樑 )
實驗目的
1 、掌握通用輸入輸出( GPIO )電路原理及與其相關的特殊功能暫存器的配置方法。
2 、熟悉 SDT 或 ADS 整合型開發環境
3 、學習使用 SDT 或 ADS 環境編譯、下載、除錯並Trace 程式的方法。
4 、熟悉實驗系統的相關硬體結構。
實驗原理 硬體原理
S3C4510B 的通用 IO 埠的硬體功能方塊圖:
實驗原理GPIO 工作原理 S3C4510B 提供了 18 個可程式化的 GPIO 埠
每個埠配置為輸入模式、輸出模式或特殊功能模式
控制 I/O 口的特殊功能暫存器一共有 3 個:IOPMOD 、 IOPCON 和 IOPDATA
由特殊功能暫存器 IOPMOD 和 IOPCON 控制 埠 0 ~埠 7 的工作模式僅由 IOPMOD 暫存器控制 通過設置 IOPCON 暫存器,埠 8 ~埠 11 可用作外部中斷請求
INTREQ0 ~ INTREQ3 的輸入 埠 12 、埠 13 可用作外部 DMA 請求 XDREQ0 、 XDREQ1
的輸入 埠 14 、埠 15 可作為外部 DMA 請求的應答信號
XDACK0 、 XDACK1 埠 16 可作為計時器 0 的溢出 TOUT0 ,埠 17 可作為計時器 1
的溢出 TOUT1
實驗原理 I/O 埠模式暫存器 (IOPMOD) :
各位元定義為:
[0..17] P0~P17 的 I/O 模式控制位元元。0= 輸入 1= 輸出
暫存器 偏移位址 操作 功能描述 重置值IOPMOD 0x5000 讀 / 寫 I/O 埠模式暫存器 0x0000,000
0
實驗原理 I/O 埠控制暫存器 (IOPCON) :
[4 : 0] 控制埠 8 的外部中斷請求信號 0 ( xIRQ0 )輸入
[4] 0 = 禁能 1 = 致能 [3] 0 = 低電位有效 1 = 高電位有效 [2] 0 = 濾波器關 1 = 濾波器開[1 : 0]
00 = 電位檢測 01 = 上升沿檢測 10 = 下降沿檢測 11 = 上升、下降沿均檢測
暫存器 偏移位址 操作 功能描述 重置值IOPCON 0x5004 讀 / 寫 I/O 埠控制暫存器 0x0000,000
0
實驗原理 [9 : 5] 控制埠 9 的外部中斷請求信號 1 ( xIRQ1 )輸入
使用方法同埠 8 [14 : 10] 控制埠 10 的外部中斷請求信號 2 ( xIRQ2 )輸入
使用方法同埠 8 [19 : 15] 控制埠 11 的外部中斷請求信號 3 ( xIRQ3 )輸入
使用方法同埠 8 [22 : 20] 控制埠 12 的外部 DMA 請求信號 0 ( DRQ0 )輸入
[22] 0 = 禁能 1 = 致能 [21] 0 = 濾波器關 1 = 濾波器開 [20] 0 = 低電位有效 1 = 高電位有效
[25 : 23] 控制埠 13 的外部 DMA 請求信號 1 ( DRQ1 )輸入 [25] 0 = 禁能 1 = 致能 [24] 0 = 濾波器關 1 = 濾波器開 [23] 0 = 低電位有效 1 = 高電位有效
[27 : 26] 控制埠 14 的外部 DMA 應答信號 0 ( DAK0 )輸出 [27] 0 = 禁能 1 = 致能 [26] 0 = 低電位有效 1 = 高電位有效
[29 : 28] 控制埠 15 的外部 DMA 應答信號 1 ( DAK1 )輸出 [29] 0 = 禁能 1 = 致能 [28] 0 = 低電位有效 1 = 高電位有效
[30] 控制埠 16 作為計時器 0 溢出信號( TOEN0 ) 0 = 禁能 1 = 致能
[31] 控制埠 17 作為計時器 1 溢出信號( TOEN1 ) 0 = 禁能 1 = 致能
實驗原理 I/O 埠資料暫存器 ( IOPDATA )
當 I/O 埠配置為輸入模式時,對應的位元表示 I/O 埠的輸入狀態。
當 I/O 埠配置為輸出模式時,對應的位元表示 I/O 埠的輸出狀態 。
對應的位元表示 I/O 埠:
暫存器 偏移位址 操作 功能描述 重置值IOPDATA 0x5008 讀 / 寫 I/O 埠資料暫存器 未定義
通用 I/O 埠的 LED 輸出實驗 接腳電路圖
通用 I/O 埠的 LED 輸出實驗 開啟 ARM Project Manger
從 File 功能表新建一個專案項目。 File → New 如下圖所示。
選擇 Project
通用 I/O 埠的 LED 輸出實驗 輸入專案名稱 GPIO 及路徑
通用 I/O 埠的 LED 輸出實驗 新建一個 .S 文件。 File → New 。彈出如下對話方
塊
編寫程式碼
儲存檔案為 Init.s
通用 I/O 埠的 LED 輸出實驗 添加至專案檔案中
1
2
3
通用 I/O 埠的 LED 輸出實驗 再建立一個檔案,且命名為 main.c
通用 I/O 埠的 LED 輸出實驗 將 main.c 檔案儲存起來,並添加至專案檔案中
通用 I/O 埠的 LED 輸出實驗 設置編譯連接環境。 Tools→Configure → armlink 在 General 頁面設置連接程式庫路徑。
1
2
3
通用 I/O 埠的 LED 輸出實驗 在 Output 頁面設置 ARM ELF image format 輸出
為 ELF 格式 在 Entry and Base 頁面設置除錯時檔下載的目的
位元址。要保證該位址為 SDRAM 位址。
45
通用 I/O 埠的 LED 輸出實驗 編譯工程項目。
在 Project → Force build
通用 I/O 埠的 LED 輸出實驗 進入除錯程式
執行” JTAG-NT&2000.exe” 開啟” ARM Debugger For Windows”
通用 I/O 埠的 LED 輸出實驗 載入映像檔案進行除錯
通用 I/O 埠的 LED 輸出實驗 執行程式進行除錯,利用工作列上的圖示來進行單步
執行除錯
利用工作列上的圖示來監看記憶體狀態R
eload
Go
Stop
Step In
Step
Step O
ut
Run to C
ursor
Register
Locals
Mem
ory
AR
M D
isassembly
Back T
race
通用 I/O 埠的 LED 輸出實驗 按 F10 單步執行程式或點工作列上的圖示
通用 I/O 埠的 LED 輸出實驗 按 F8 單步執行程式或點工作列上的圖示
進入 Main 主程式 (C 語言 )
通用 I/O 埠的 LED 輸出實驗 觀看 IOPMOD 記憶體的變化
輸入 IOPMOD 記憶體位址 0x03FF5000
通用 I/O 埠的 LED 輸出實驗 設定 IOPMOD
0x03FF5000 記憶體的變化
通用 I/O 埠的 LED 輸出實驗 設定 IOPDATA(0x03FF5008)
IOPDATA(0x03FF5008) 的變化
通用 I/O 埠的 LED 輸出實驗 觀察 LED 變數
LED 變數的變化
通用 I/O 埠的 LED 輸出實驗 利用”移位”的方式,改變 LED 燈的變化
將移位後的值寫入 IOPDATA ,輸出至 IO port
通用 I/O 埠的 LED 輸出實驗 利用 Step 執行 Delay() ,用 Step In 會進入
Delay() 副程式 Step 單步執行
Step In 單步執行
通用 I/O 埠的 LED 輸出實驗 IOPDATA 執行變化
DemoBoardP4_LED 亮起
DemoBoardP5_LED 亮起
DemoBoardP6_LED 亮起
DemoBoardP7_LED 亮起
通用 I/O 埠的 LED 輸出實驗 當 IOPDATA 為 0x80 ,重置 LED 值
通用 I/O 埠的 LED 輸出實驗
通用 I/O 埠的 LED 輸出實驗
通用 I/O 埠的 LED 輸出實驗