ARM學習之GPIO實現流水燈

BLSxiaopanlaile發表於2017-08-06

今天在學習MMU時的時候,寫了一個流水燈程式。雖然很簡單,但是不怕大家笑話,由於學C語言的時候沒學位運算操作,再加上硬體實驗做的少,所以實現這個也費了不少力氣呢。

/*
 * leds.c: 迴圈點亮4個LED
 * 屬於第二部分程式,此時MMU已開啟,使用虛擬地址
 */ 

#define GPFCON      (*(volatile unsigned long *)0x56000050)     
#define GPFDAT      (*(volatile unsigned long *)0x56000054)     

#define GPF4_out    (1<<(4*2))
#define GPF5_out    (1<<(5*2))
#define GPF6_out    (1<<(6*2))


static inline void wait(volatile unsigned long dly)
{
    int i;
    for(; dly > 0; dly--)
        for(i = 0;i<100;++i)
            ;
}

int main(void)
{
    unsigned long i = 4;

    GPFCON = GPF4_out|GPF5_out|GPF6_out;        // 將LED1,2,4對應的GPF4/5/6三個引腳設為輸出

    while(1)
    {

        wait(30000);
        GPFDAT |= 0x70;      //每次迴圈關閉4,5,6三個燈
        GPFDAT &= ~(1<<i);    //0位每次迴圈4,5,6位

        if(++i == 7)
            i = 4;
    }

    return 0;
}
程式碼分析:在實現流水燈程式時,主要是配置GPF資料暫存器和GPF控制暫存器。在向GPFDAT中寫數的時候,就本人認為,應該保證不影響到其他的位(這裡是除了4,5,6的其他的位,因為你不知道其他的位有沒有用於其他的用途,在這裡雖然沒影響。)
 對於暫存器的操作,對暫存器特定位進行置 1 或者清 0 或者取反, 關鍵點在於要事先構建一個特別的數, 這個數和原來的值進行位與、 位或、 位異或等操作。
    (1)、暫存器特定位清零用&。
    (2)、暫存器特定位置 1 用|
    (3)、暫存器特定位取反用~

相關文章