GPIO接口及點亮第一個LED燈


一、GIPIO介紹

General Purpose Input Output (通用輸入/輸出)簡稱為GPIO,或總線擴展器,人們利用工業標准I2C、SMBus或SPI接口簡化了I/O口的擴展。當微控制器或芯片組沒有足夠的I/O端口,或當系統需要采用遠端串行通信或控制時,GPIO產品能夠提供額外的控制和監視功能。

1.GPIO的優點
  • 低功耗:GPIO具有更低的功率損耗(大約1μA,μC的工作電流則為100μA)。
  • 集成IIC從機接口:GPIO內置IIC從機接口,即使在待機模式下也能夠全速工作。
  • 小封裝:GPIO器件提供最小的封裝尺寸 ― 3mm x 3mm QFN!
  • 低成本:您不用為沒有使用的功能買單。
  • 快速上市:不需要編寫額外的代碼、文檔,不需要任何維護工作。
  • 可預先確定響應時間:縮短或確定外部事件與中斷之間的響應時間。
2.GPIO的寄存器
    • GPxCON 寄存器
      用於配置引腳功能。 PORT A 與 PORT B~PORT H/J 在功能選擇上有所不同,GPACON 中每一位對應一根引腳,共 23 個引腳。當某位被設為 0 時候,相應引腳為 輸出引腳。此時我們可以在GPADAT 中相應的寫入 1或者 0 來讓此引腳輸出高電平或者低電平;當某位被設為1時,相應引腳為地址線或用於地址控制,此時GPADATA無用。
      一般而言 GPACON 通常被設為 1 ,以便訪問外部器件。
      PORT B~PORT H/J在寄存器操作方面完全相同,GPxCON 中每兩位控制一根引腳,
      • 00 輸入
      • 01 輸出
      • 10 特殊功能
      • 11 保留不用
    • GPxDAT 寄存器
      GPxDAT用於讀寫引腳,當引腳被設為輸入時候,讀此寄存器可知道相應引腳的電平狀態高還是低,當引腳被設為輸出時候,寫此寄存器的位,可令引腳輸出高電平還是低電平。
    • GPxUP寄存器
      GPxUP寄存器某位為1時,相應管腳沒有內部上拉電阻;為 0 時候 相應管腳有內部上拉電阻。
      上拉電阻作用在於,當GPIO 引腳處於第三種狀態時候,既不是輸出高電平,也不是輸出低電平。而是呈現高阻態,相當於沒有接芯片。它的電平狀態由上下拉電阻決定。

二、控制LED實例

1.查看硬件原理圖

2.查看數據手冊
  • 在三星公司提供的DataSheet手冊中找到介紹GPIO的章節

3.確定關鍵定義
    • GPJ0CON寄存器
      寄存器地址:0xE0200240
      要控制的位數:[15:12]
      要設置的二進制數據:0b0001
    • GPJ0PUD寄存器
      寄存器地址:0xE0200248
      要控制的位數:[7:6]
      要設置的二進制數據:0b00
    • GPJ0DAT寄存器
      寄存器地址:0xE0200244
      要控制的位數:[3]
      要設置的二進制數據:0b1
4.編寫程序
start:
    @;配置GPJ0CON寄存器 Address=0xE0200240 [15:12]=0b0001
    ldr r0,=0xE0200240
    ldr r1,=0x1000
    str r1,[r0]

    @;配置GPJ0PUD寄存器 Address=0xE0200248 [7:6]=0b00
    ldr r0,=0xE0200248
    ldr r1,=0x0
    str r1,[r0]

    @;配置GPJ0DAT寄存器 Address=0xE0200244 [3]=1
    ldr r0,=0xE0200244
    ldr r1,=0x4
    str r1,[r0]
5.實例測試

生成目標文件
arm-linux-gcc -c led.S

生成可執行文件
arm-linux-gcc -Ttext 0x34000000 -nostartfiles -nostdlib led.o -o led

生成獨立執行的二進制
arm-linux-objcopy -O binary led led.bin

使用tftp命令下載
tftp 0x34000000 led.bin

使用go命令執行
go 0x34000000

 

6.簡單的流水燈實現

.global _start
_start:
    ldr r0, =0x11111111
    ldr r1, =0xE0200240
    str r0, [r1]
    
    ldr r0, =0x11111111
    ldr r1, =0xE02000A0
    str r0, [r1]
 
flash:    
    ldr r0, =(1<<1)
    ldr r1, =0xE02000A4
    str r0, [r1]

    ldr r0, =~(1<<3)
    ldr r1, =0xE0200244
    str r0, [r1]
    bl delay
    
    ldr r0, =~(1<<4)
    ldr r1, =0xE0200244
    str r0, [r1]    
    bl delay
    
    ldr r0, =~(1<<5)
    ldr r1, =0xE0200244
    str r0, [r1]
    bl delay
    
    ldr r0, =~(1<<1)
    ldr r1, =0xE02000A4
    str r0, [r1]
    bl delay
    
    b flash
    
    
delay:
    ldr r2, =100000000
    ldr r3, =0x0
delay_loop:
    sub r2, r2, #1
    cmp r2, r3
    bne delay_loop
                    
    mov pc, lr    

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM