1. 程式人生 > >S3C2440之裸板GPIO操作

S3C2440之裸板GPIO操作

環境:
開發板:JZ2440
系統:Ubuntu 14.04
交叉編譯器:arm-linux-gcc 3.4.5

這一節我們實現的是操作GPIO點亮LED
其實操作GPIO很簡單,分為以下幾個步驟
1.引腳設定為輸入/輸出
2.配置引腳輸出0/1

對於學過微控制器的同學都知道 要想控制硬體 不是一上來就是寫程式碼 而是先檢視原理圖和手冊的基礎上才能完成程式碼的編寫
我使用的開發板是JZ2440 通過瀏覽硬體原理圖可知
這裡寫圖片描述
開發板的GPIO是接到GPF4 GPF5 GPF6三個引腳 並且接入電路圖為
這裡寫圖片描述
學過電路或者類比電路的同學都知道 二極體的單方向導通性 如不理解就學好電路吧
看原理圖可知當nLED1 = 0(低電平)時 二極體導通,LED點亮
所以我們點亮LED的方法就是
1.設定GPF4為輸出引腳
2.輸出0(低電平)

知道如上資訊還不夠 我們知道了怎樣操作引腳才能電路led 但是怎麼操作呢?
學過微控制器的同學都知道要用GPIO暫存器操作 所以翻閱2440手冊可以得到
這裡寫圖片描述

從手冊上得知操作GPFCON和GPFDAT就可以實現我們的目的
1.操作GPFCON[9:8] = 01
2.操作GPFDAT[4] = 0

根據以上的資訊 我們就能學出一個GPIO的操作程式
彙編實現如下

@******************************************************************************
@ File:led_on.S
@ 功能:LED點燈程式,點亮LED1
@*****
************************************************************************* .text .global _start _start: LDR R0,=0x56000050 @ R0設為GPFCON暫存器。此暫存器 @ 用於選擇埠B各引腳的功能: @ 是輸出、是輸入、還是其他 MOV R1,#0x00000100
STR R1,[R0] @ 設定GPF4為輸出口, 位[9:8]=0b01 LDR R0,=0x56000054 @ R0設為GPBDAT暫存器。此暫存器 @ 用於讀/寫埠B各引腳的資料 MOV R1,#0x00000000 @ 此值改為0x00000010, @ 可讓LED1熄滅 STR R1,[R0] @ GPF4輸出0,LED1點亮 MAIN_LOOP: B MAIN_LOOP

c語言程式碼實現如下

#define GPFCON      (*(volatile unsigned long *)0x56000050)
#define GPFDAT      (*(volatile unsigned long *)0x56000054)

int main()
{
    GPFCON = 0x00000500;    // 設定GPF4為輸出口, 位[9:8]=0b01
    GPFDAT = 0x00000000;    // GPF4輸出0,LED1點亮

    return 0;
}

通過兩個步驟就能實現對GPIO的控制 當然對GPIO的操作不止這些 但是已經實現了這些 其他還會難嗎?無非就是看手冊操作暫存器的事嗎?一切都不會遠