OK6410裸機程序(一)——GPIO(LED)

            本人入手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亮
		}
}


                                         


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章