1. 程式人生 > >ARM學習之GPIO實現流水燈

ARM學習之GPIO實現流水燈

今天在學習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)、暫存器特定位取反用~