ARM學習之GPIO實現流水燈
阿新 • • 發佈:2019-02-17
今天在學習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)、暫存器特定位取反用~