本人入手OK6410-A開發板,已經有一段時間。因爲去年工作忙一直沒時間來折騰這個東東。現在工作也有點空閒時間,又想開始折騰一下了。
我給自己定的最終目標是:linux驅動開發。有點經驗的人都知道,驅動開發對硬件知識的掌握也很重要,所以本人確定就先從裸板程序開始學習。
我將借用這個平臺來記錄我學習的過程中的問題和經驗。好了話不多說,現在就開始第一課。
OK6410裸機程序(一)——GPIO(LED)
這是一個非常簡單的程序,這個程序就好像我們在學習C語言所寫的“HELLO WORLD”程序。都會用它來做爲C語言的入門程序。
GPIO意思就是通用輸入、輸出端口,通俗地說,就是一些引腳,可以通過它們輸入出高低電平。或者通過它們讀入引腳狀態——高低電平。
S3C6410共有187個多功能的I/O端口。共分佈在17個端口上(GPA、GPB……GPQ)。即然
一個引腳可以用於輸入、輸出或其他功能,那麼一定有寄存器用來選擇這些功能;對於輸入,一定可以
通過讀取某個寄存器來確定引腳的電平是高是低;對於輸出,一定可以通過寫入某個寄存器來讓這個引腳
輸出高電平或低電平;對於其它功能,則另有寄存器來控制它了。
對於這幾組GPIO引腳,它們的寄存器是相似的,普通I/O功能通常是由三個寄存器來完成:
GPxCON:用於選擇引腳功能。
GPxDAT:用於讀寫引腳數據。
GPxUP:用於確定是否使用內部上拉電阻。(x表示:A、B、C……Q)
下面就於端口A爲例:如下圖所示,一個端口是由5個32位的寄存器控制。每個寄存器都有自己地址。一個端口有八個引腳,也就是寄存器每四位控制一個引腳。
如圖下面每個引腳的配置:
圖2 引腳配置
數據寄存器GPADAT
上下拉電阻設置寄存器GPAPUD
我們在對GPIO操作的時候,第一步就是對這三個寄存器進行設置。配置相應的功能、輸入、輸出模式的選擇。是否開啓上下拉電阻功能。
下面我們就與點亮OK6410板上的第一個LED燈爲例。
首先,來看一下OK6410開發板的原理圖。LED燈的硬件是接在CPU上的個哪個引腳。
圖:底板原理圖
圖:核心板原理圖部分
結合核心板與底板原理圖,可以看出位號LED1的LED燈(我們要點亮的燈),是陰極通過電阻接到了CPU上的GPM0引腳上。陽極直接接到了電源3.3V。也就是說:我們要點亮LED1這個燈,就要使CPU上的GPM0引腳輸出低電平。才能點亮LED。
接下來,我們來看看這個程序 (請在linux環境下用交叉工具執行)。
/*GNU 彙編,設置CPU必要的硬件環境*/
.globl _start /*設置全局標號*/
_start:
/* 告訴CPU外設的基地址,對協處理器CP15操作命令*/
/* Peri port setup */
ldr r0, =0x70000000
orr r0, r0, #0x13
mcr p15,0,r0,c15,c2,4 @ 256M(0x70000000-0x7fffffff)
/*關閉看門狗*/
ldr r0, =0x7E004000
mov r1, #0
str r1, [r0]
/* 設置堆棧*/
ldr sp, =8*1024
bl Main /*轉到C語言執行*/
halt:
b halt
/*************************************************************************/
/*程序名稱:點亮LED燈 C程序
/************************************************************************/
volatile unsigned long *GPMCON = (volatile unsigned long *)0x7F008820; volatile unsigned long *GPMDAT = (volatile unsigned long *)0x7F008824; void Main() { GPMCON |= (1 << 0);//設置成輸出 while(1) { GPMDAT &= ~(1 << 0); //第0位置0,即輸出爲低,LED亮 } }