聲明:本文由個人學習過程中整理而成,轉載請註明出處
實驗開發版:S5PV210
1、什麼是GPIO?
General Purpose Input Output (通用輸入/輸出)簡稱爲GPIO,屬於芯片引腳的一部分。
嵌入式系統中常常有數量衆多,但是結構卻比較簡單的外部設備/電路,對這些設備/電路有的需要CPU爲之提供控制手段,有的則需要被CPU用作輸入信號。而且,許多這樣的設備/電路只要求一位,即只要有開/關兩種狀態就夠了,比如燈亮與滅。對這些設備/電路的控制,使用傳統的串行口或並行口都不合適。所以在微控制器芯片上一般都會提供一個“通用可編程IO接口”,即GPIO。
2、點亮LED的原因
點亮LED要求正極與負極之間有一定的正向電壓差。
熄滅LED就是讓正極與負極之間沒有電壓差。
3、查詢原理圖
D22:正極接3.3v,負極接引腳GPJ0_3。
D23:正極接3.3v,負極接引腳GPJ0_4。
D24:正極接3.3v,負極接引腳GPJ0_5。
D25:正極接3.3v,負極接引腳PWMTOUT1(GPD0_1)。
D26:正極接5V,負極接地。
可以通過編程控制GPIO引腳輸出低電平,產生電壓差。
4、查詢數據手冊
設置GPJ0CON控制寄存器,GPJ0_3、GPJ0_4、GPJ0_5引腳爲Output工作模式,使其能輸出電壓。
設置GPJ0DAT數據寄存器,GPJ0_3、GPJ0_4、GPJ0_5引腳相應位爲0(低電平)。
5、點亮LED的步驟:
(1)設置GPJ0CON控制寄存器,GPJ0_3、GPJ0_4、GPJ0_5引腳爲Output工作模式,使其能輸出電壓。
(2)設置GPJ0DAT數據寄存器,GPJ0_3、GPJ0_4、GPJ0_5引腳相應位爲0(0爲低電平,1爲高電平)。
6、彙編代碼實現LED流水燈
.global _start//鏈接屬性改爲外部
_start:
//配置GPJ0_3 ~ GPJ0_5爲輸出模式
ldr r0, =0xE0200240
ldr r1, =0x00111000
str r1, [r0]
//配置GPD0_1爲輸出模式
ldr r0, =0xE02000A0
ldr r1, =0x00000010
str r1, [r0]
loop_led:
//配置GPJ0_3爲低電平
ldr r0, =0xE0200244
ldr r1, =((0<<3) | (1<<4) | (1<<5))
str r1, [r0]
//延時
bl delay
//配置GPJ0_4爲低電平
ldr r0, =0xE0200244
ldr r1, =((1<<3) | (0<<4) | (1<<5))
str r1, [r0]
//延時
bl delay
//配置GPJ0_5爲低電平
ldr r0, =0xE0200244
ldr r1, =((1<<3) | (1<<4) | (0<<5))
str r1, [r0]
//延時
bl delay
//配置GPJ0_3 ~ GPJ0_5爲高電平
ldr r0, =0xE0200244
ldr r1, =((1<<3) | (1<<4) | (1<<5))
str r1, [r0]
//配置GPD0_1爲低電平
ldr r0, =0xE02000A4
ldr r1, =(0<<1)
str r1, [r0]
//延時
bl delay
//配置GPD0_1爲高電平
ldr r0, =0xE02000A4
ldr r1, =(1<<1)
str r1, [r0]
b loop_led
// 延時功能
delay:
ldr r1, =0
ldr r2, =7777777
loop_delay:
sub r2, r2, #1
cmp r1, r2
bne loop_delay
mov pc, lr
7、C語言代碼實現流水燈
// 寄存器宏定義
#defineGPJ0CON(0xE0200240)
#defineGPJ0DAT(0xE0200244)
#define GPD0CON(0xE02000A0)
#define GPD0DAT(0xE02000A4)
#define rGPJ0CON(*(volatile unsigned int *)GPJ0CON)
#define rGPD0CON(*(volatile unsigned int *)GPD0CON)
#definerGPJ0DAT(*(unsigned volatile int *)GPJ0DAT)
#definerGPD0DAT(*(unsigned volatile int *)GPD0DAT)
// 延時函數
void delay_time(void)
{
volatile unsigned int i = 0;
for(i=0; i<40000; i++)
for(i=0; i<600000; i++);
}
void illumine_led(void)
{
// 配置爲輸出模式
rGPJ0CON = 0x00111000;
rGPD0CON = 0x00000010;
while(1)
{
//點亮LED1、延遲
rGPJ0DAT = ~(1 << 3);
delay_time();
//點亮LED2、延遲
rGPJ0DAT = ~(1 << 4);
delay_time();
//點亮LED3、延遲
rGPJ0DAT = ~(1 << 5);
delay_time();
//熄滅LED1~LED3
rGPJ0DAT = ((1<<3) | (1<<4) | (1<<5));
//點亮LED4、延遲
rGPD0DAT = ~(1<<1);
delay_time();
//熄滅LED4
rGPD0DAT = (1<<1);
}
}
參考資料:《ARM裸機全集---朱有鵬老師》