LPC2103學習之GPIO
不寫作業寫部落格
直接切入正題
LPC2103關於引腳的暫存器有兩個PINSEL0與PINSEL1,都是32位寬度。
PINSEL0與PINSEL1暫存器的每兩位控制一個引腳的功能,則一個腳最多有4種功能。其中PINSEL0控制著P0.0到P0.15的引腳。PINSEL1控制著P0.16到P0.31的引腳。
PINSEL暫存器的設定只需兩個步驟。一找到要設定的引腳。二是選擇引腳的功能。
如圖所示:
下面舉例說明
1.設定P0.0為GPIO功能
PINSEL0 = 0x00 /*設定P0.0到P0.15都為GPIO*/
2.設定P0.0為TxD0功能
PINSEL0 = (PINSEL0 & 0xFFFFFFFC) | 0x01; /*設定P0.0的功能為TxD0*/
當然如果為了不改變原來引腳的功能。你應該採取“讀取——修改——回寫”的方式進行。即先讀取暫存器值,然後進行一些邏輯的與、或等操作,最後把修改值再寫回暫存器。
比如:
PINSEL0 = (PINSEL0 & 0xFFF0FFFF) | (0x05 << 16); /*設定P0.8與P0.9功能為TxD1/RxD1*/
關於LPC2103的GPIO
LPC2103只有一個32位的通用IO口。由於引腳的功能複用,使用前必須進行相關引腳設定,再進行操作。比如P0.27到P0.31就是JTAG除錯引腳。LPC2103的GPIO模式有低速與高速模式。
高速GPIO的控制暫存器位於CPU的區域性總線上,而低速GPIO的控制暫存器是掛在VPB總線上。P0口作為高速GPIO使用時,將不能在除錯環境下觀察在VPB總線上的暫存器。
下面是一些暫存器的描述。直接上圖好些。
剩餘的以後需要時再補充,現在只需要用到這些。參考資料來自於《EasyARM2103教材》
每天進步一點,以後可不就是一點咯。
補註:就在剛才寫流水燈程式時發現一個問題
#define LED1 1<<17
for(i=0;i<4;i++)
{
IO0CLR = (LED1<<i);
// IO0CLR |= (LED1<<i);
Delay(100);
}
我發現這裡用=與|=得到的都是相同的結果。這是為什麼呢?我想的是等於應該是會把以前的值擦除,那麼每次應該是一個燈亮。但是實際是4個燈依次亮。希望知道的告訴我一下啊,不勝感激。