[嵌入式]S5PV210微處理器GPIO程式設計

丫就是熊個貓貓發表於2016-12-20

第四章 S5PV210微處理器GPIO程式設計

4.1  S5PV210硬體資源

   S5PV210是一款32位精簡指令集計算機(RISC),具有低成本、低功耗、高效能的微處理器解決方案,適用於手機及一般應用。它整合了ARM Cortex-A8的核心,並實現了ARM構架的V7-A的配套外設。

   S5PV210採用64位的內部匯流排架構,包括許多強大的硬體加速器,用來完成像運動視訊處理、顯示控制和縮放等任務。整合多格式編解碼器(MFC)。S5PV210擁有一個外部儲存器,能夠承受高階通訊服務所需要的大記憶頻寬。為了降低系統總成本和提高整體功能,S5PV210包括許多硬體外設。

硬體框圖

 

封裝與管腳

·電源管腳分配

·地線管腳分配

·UART涉及管腳

·SPI埠管腳

·PWM/I2C管腳

·I2S/PCM/SPDIF/AC97

·攝像頭處理器管腳

·LCD管腳

·EINT/KEYPAD管腳

·Modem/CAMIF等管腳

·記憶體埠管腳

·JTAG管腳

·Clock管腳

·ADC/DAC/HDMI等管腳

·USB OTG/USB HOST管腳

·E-fuse管腳

·……

4.2  S5PV210的GPIO

GPIO概述

  GPIO的英文全稱General-Purpose Input /Output Ports,即通用I/O埠。嵌入式系統需要控制許多結構簡單的外部裝置或者電路,這些裝置有的需要通過CPU控制,有的需要CPU提供輸入訊號。許多裝置或電路只要求有開/關兩種狀態就夠了,比如LED的亮與滅。對這些裝置的控制,使用傳統的串列埠或者並口就顯得比較複雜,所以,在嵌入式微處理器上通常提供了一種“通用可程式設計I/O埠”,也就是GPIO。

   每個GPIO埠至少需要兩個暫存器,一個做控制用的“通用IO埠控制暫存器”,還有一個是存放資料的“通用I/O埠資料暫存器”。資料暫存器的每一位是和GPIO的硬體引腳對應的,而資料的傳遞方向是通過控制暫存器設定的,通過控制暫存器可以設定每一位引腳的資料流向。

GPIO管腳

   S5PV210晶片包含237根多功能的GPIO管腳和142根記憶體介面引腳,共分為35組通用GPIO埠和2組記憶體埠,其中:

GPA0:8線輸入/輸出 埠 ,或2×UART 帶流控制埠;

GPA1:5線輸入/輸出埠,或2×UART 不帶流控或1×UART帶流控埠;

GPB:8線輸入/輸出埠,或2×SPI埠;

GPC0:5線輸入/輸出埠,或I2S、PCM、AC97埠;

GPC1:5線輸入/輸出埠,或I2S、SPDIF、LCD_FRM埠;

GPD0:4線輸入/輸出埠,或PWM埠;

GPD1:6線輸入/輸出埠,或3×I2C、PWM、IEM埠;

GPE0,1:13線輸入/輸出埠,或Camera I/F埠;

GPF0,1,2,3:30線輸入/輸出埠,或LCD I/F埠;

GPG0,1,2,3:28線輸入/輸出埠,或4×MMC 通道埠;

GPH0,1,2,3:32線輸入/輸出埠,或鍵盤及最大32位睡眠可喚醒介面;

GPI:低功率I2S、PCM,或AUDIO_SS PDN暫存器控制PDN 掉電配置埠;

GPJ0,1,2,3,4:35線輸入/輸出埠,或Modem IF、CAMIF、CFCON、KEYPAD、SROM ADDR[22:16] 埠;

MP0_1,2,3:20線輸入/輸出埠,或EBI(SROM、NF、OneNAND)控制訊號口;

MP0_4,5,6,7:32線輸入/輸出記憶體埠,或EBI埠;

MP1_0-8:71線DRAM1 埠;

MP2_0-8:71 線DRAM2 埠;

ETC0, ETC1, ETC2, ETC4:28線輸入/輸出ETC 埠,或JTAG埠等。

GPIO功能框圖

 

4.3 S5PV210的GPIO暫存器

埠控制暫存器GPnCON

 

埠資料暫存器GPnDAT

  如果埠被配置為輸出埠,可以向GPnCON的相應位寫資料。如果埠被配置成輸入埠,可以從GPnDAT的相應位讀出資料。

  例如:GPA0DAT資料暫存器定義(其他埠資料暫存器定義類似)。

 

埠上拉暫存器GPnUP

   埠上拉暫存器控制了每個埠組的上拉電阻的允許/禁止。如果某一位為0,相應的上拉電阻被允許;如果某一位為1,相應的上拉電阻被禁止。如果埠的上拉電阻被允許,無論在哪種狀態下(輸入、輸出、DATAn、EINTn等),上拉電阻都起作用

例如:GPA0UP上拉暫存器定義:

 

4.4 GPIO程式設計例項

電路連線

該例項電路通過GPD0_0管腳連線蜂鳴器,並通過GPH2_0/1/2/3管腳連線4只獨立按鍵,通過GPJ2_0/1/2/3管腳連線LED等。對S5PV210的GPIO口進行程式設計,用查詢方式獲取按鍵狀態,當按鍵按下時,對應的LED燈閃亮,蜂鳴器鳴響一聲。當按鍵鬆開,對應的LED燈熄滅。

 

暫存器設定

為了達到讀取按鍵及控制蜂鳴器的目的,需要通過配置GPD0CON暫存器將GPD0_0管腳配置為輸出方式,LED燈控制引腳暫存器GPJ2CON配置為GPJ2_0/1/2/3引腳為輸出功能,將按鍵輸入引腳暫存器GPH2CON使GPH2_0/1/2/3引腳為輸入功能。

蜂鳴器控制程式buzzer.c

#define GPD0CON(*(volatile unsigned long *)0xE02000A0)
#define GPD0DAT(*(volatile unsigned long *)0xE02000A4)
 
// 初始化buzzer
void buzzer_init(void)
{
GPD0CON |= 1<<0;
}
void buzzer_on(void)
{
GPD0DAT |= 1<<0;
}
void buzzer_off(void)
{
GPD0DAT &= ~(1<<0);
}


主程式 main.c

// LED
#define GPJ2CON              (*(volatile unsigned long *) 0xE0200280)
#define GPJ2DAT(*(volatile unsigned long *) 0xE0200284)
// KEY
#define GPH2CON              (*(volatile unsigned long *) 0xE0200C40)
#define GPH2DAT(*(volatile unsigned long *) 0xE0200C44)
//燈輸出與按鍵輸入
#define GPJ2_0_OUTPUT (1<<(0*4))
#define GPJ2_1_OUTPUT (1<<(1*4))
#define GPJ2_2_OUTPUT (1<<(2*4))
#define GPJ2_3_OUTPUT (1<<(3*4))
#define GPH2_0_INTPUT ~(0xf<<(0*4))
#define GPH2_1_INTPUT ~(0xf<<(1*4))
#define GPH2_2_INTPUT ~(0xf<<(2*4))
#define GPH2_3_INTPUT ~(0xf<<(3*4))
void main()
{     unsigned long dat;
      // LED:設定暫存器GPJ2CON0使GPJ2_0/1/2/3引腳為輸出功能
     GPJ2CON = GPJ2_0_OUTPUT|GPJ2_1_OUTPUT|GPJ2_2_OUTPUT|GPJ2_3_OUTPUT;
      // KEY:設定暫存器GPH2CON0使GPH2_0/1/2/3引腳為輸入功能
      GPH2CON =GPH2_0_INTPUT&GPH2_1_INTPUT&GPH2_2_INTPUT&GPH2_3_INTPUT;  
     buzzer_init();
      while(1){
// 讀取KEY相關的引腳值,用於判斷KEY是否被按下
dat = GPH2DAT;
// 判斷KEY1:GPH2_0
if(dat & (1<<0))// KEY1被按下,則LED1亮,否則LED1滅
{GPJ2DAT |= 1<<0;// OFF
buzzer_off();
}
else
{GPJ2DAT &= ~(1<<0);// ON
buzzer_on();
delay(0x10000);
}
// 判斷KEY2:GPH2_1
if(dat & (1<<1))// KEY2被按下,則LED2亮,否則LED2滅
{GPJ2DAT |= 1<<1;    buzzer_off();}
   else
{GPJ2DAT &= ~(1<<1);  buzzer_on();  delay(0x10000);    }
// 判斷KEY3:GPH2_2
if(dat & (1<<2))// KEY3被按下,則LED3亮,否則LED3滅
{……}
else
{……}
// 判斷KEY4:GPH2_3
if(dat & (1<<3))// KEY4被按下,則LED4亮,否則LED4滅
{……}
else
{……}
}  //End of while(1)
}  //End of main()


 

相關文章