ARM裸機之點亮LED

聲明:本文由個人學習過程中整理而成,轉載請註明出處


實驗開發版:S5PV210

1、什麼是GPIO?

General Purpose Input Output (通用輸入/輸出)簡稱爲GPIO,屬於芯片引腳的一部分。

嵌入式系統中常常有數量衆多,但是結構卻比較簡單的外部設備/電路,對這些設備/電路有的需要CPU爲之提供控制手段,有的則需要被CPU用作輸入信號。而且,許多這樣的設備/電路只要求一位,即只要有開/關兩種狀態就夠了,比如燈亮與滅。對這些設備/電路的控制,使用傳統的串行口或並行口都不合適。所以在微控制器芯片上一般都會提供一個“通用可編程IO接口”,即GPIO。


2、點亮LED的原因

點亮LED要求正極與負極之間有一定的正向電壓差。

熄滅LED就是讓正極與負極之間沒有電壓差。


3、查詢原理圖

wKiom1juLmSAp5fWAADi28fFiF8225.png

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工作模式,使其能輸出電壓。

wKiom1juLsmAz9jDAAHCv5mufts070.png


設置GPJ0DAT數據寄存器,GPJ0_3、GPJ0_4、GPJ0_5引腳相應位爲0(低電平)。

wKiom1juLxjT73xRAACuQvo12tc267.png


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裸機全集---朱有鵬老師》


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