引腳配置IOCON


通過前面的例子我們知道,輸入/輸出端口(即I/O口)是LPC824所能依賴進行控制的唯一通道,如果把芯片的CPU內核比作人的大腦,那芯片的I/O口就相當於人的五官和四肢,負責信息的獲取和動作的執行,如果芯片沒有I/O口那CPU本身會變得毫無意義,因此很有必要了解它們的內部結構及其詳細配置。LPC824標准I/O引腳的內部結構如下圖所示。

在內部結構圖中,PIN是輸入/輸出端口中的一位,也就是GPIO的某個引腳,其上連接的ESD為靜電阻抗器,用於釋放引腳上的靜電干擾。上半部分的邏輯門及MOS管用於控制數字輸出,其中的MOS管受控於開漏使能、輸出使能及CPU輸出等三個信號,用來確定引腳的強上拉、強下拉及輸出電平。中間部分的邏輯門及MOS管用於控制中繼模式,在中繼使能時,當引腳處於高電平時,中繼模式會啟用上拉電阻,而當引腳處於低電平時,則會啟用下拉電阻。這樣當引腳配置為輸入且不由外部驅動時,會使引腳保持其上一已知狀態。如果暫時不驅動引腳,通常使用中繼模式來防止引腳懸空(因為引腳處於不確定狀態時,可能會消耗大量電能)。下半部分的邏輯門用於整形並讀取引腳上的電平狀態,還可控制輸入電平是否取反。圖的最下方則是控制引腳的模擬輸入,用於讀取模擬信號。 

在LPC824中,各個引腳可以配置以下電氣屬性:
1.可配置上拉/下拉電阻
2.可編程開漏模式
3.遲滯模式
4.輸入反相器
5.毛刺數字濾波器,帶可編程時間常數
6.模擬模式

其中,引腳PIO0_10和PIO0_11還是真正的開漏引腳,可針對不同的I2C總線速度配置。

在LPC824中,每個端口引腳PIO0_x都為其分配了一個IOCON寄存器,用來控制該引腳的功能及電氣特性。下表列出了所有29個引腳用到的IOCON寄存器及其偏移地址。

在MDK環境中,針對以上29個IOCON寄存器,定義了如下的結構體,用來描述IOCON寄存器組的類型。

typedef struct {
__IO uint32_t PIO0_17;
__IO uint32_t PIO0_13;
__IO uint32_t PIO0_12;
__IO uint32_t PIO0_5;
__IO uint32_t PIO0_4;
__IO uint32_t PIO0_3;
__IO uint32_t PIO0_2;
__IO uint32_t PIO0_11;
__IO uint32_t PIO0_10;
__IO uint32_t PIO0_16;
__IO uint32_t PIO0_15;
__IO uint32_t PIO0_1;
__I uint32_t RESERVED0;
__IO uint32_t PIO0_9;
__IO uint32_t PIO0_8;
__IO uint32_t PIO0_7;
__IO uint32_t PIO0_6;
__IO uint32_t PIO0_0;
__IO uint32_t PIO0_14;
__I uint32_t RESERVED1;
__IO uint32_t PIO0_28;
__IO uint32_t PIO0_27;
__IO uint32_t PIO0_26;
__IO uint32_t PIO0_25;
__IO uint32_t PIO0_24;
__IO uint32_t PIO0_23;
__IO uint32_t PIO0_22;
__IO uint32_t PIO0_21;
__IO uint32_t PIO0_20;
__IO uint32_t PIO0_19;
__IO uint32_t PIO0_18;
} LPC_IOCON_Type;

同前面GPIO討論的一樣,IOCON寄存器組的基址為0x40044000,要將基址指針強制轉換為上述結構體,還得加上下面的定義。

#define LPC_IOCON_BASE 0x40044000UL
#define LPC_IOCON ((LPC_IOCON_Type *) LPC_IOCON_BASE)

這樣一來,就可以使用“LPC_IOCON->PIO0_x”的形式來引用某個引腳的IOCON寄存器了。 由於IOCON寄存器有29個之多,而每個的結構基本相同,所以下面就例舉兩個進行討論,其他的可參照使用。

下面給出的是PIO0_17引腳配置寄存器的全部位結構,其字節地址為0x40044000。

(1)第0~2位為保留位。
(2)第3、4兩位(MODE)用於選擇功能模式,值從0x0到0x3分別對應選擇無效、上拉、下拉和中繼4種模式,默認為上拉。
(3)第5位(HYS)用於選擇引腳是否使用遲滯作用,置0時禁止,置1時使能,默認為禁止。
(4)第6位(INV)用於選擇引腳在輸入時是否反向,置0時不反向,置1時反向,默認為不反向。
(5)第7~9位為保留位。
(6)第10位(OD)用於選擇引腳是否開漏,置0時禁止,置1時使能,默認為禁止。注意:這里的開漏並非真正的開漏模式。
(7)第11、12兩位(S_MODE)用於選擇數字濾波采樣模式,值從0x0到0x3分別對應選擇旁路、1個、2個、3個時鍾周期,默認為旁路。
(8)第13~15位(CLK_DIV)用於選擇外設時鍾分頻,該時鍾用於輸入濾波器采樣時鍾,值從0x0到0x6分別對應選擇0~6分頻,默認為不分頻。
(9)第16~31位為保留位。 

雖然上面只給出了PIO0_17引腳的配置寄存器,但其余的引腳配置寄存器和它基本上是一樣的,所以就不一一例舉了。但有兩個寄存器稍有不同,它們是PIO0_10和PIO0_11兩個引腳配置寄存器,下面就給出PIO0_10引腳配置寄存器的全部位結構。

 

(1)第0~5位為保留位。
(2)第6位(INV)用於選擇引腳在輸入時是否反向,置0時不反向,置1時反向,默認為不反向。
(3)第7位為保留位。
(4)第8、9兩位(I2CMODE)用於選擇引腳I2C模式,值從0x0到0x3分別對應選擇標准/快速I2C模式、標准GPIO功能模式(需要外部上拉)、超快速I2C模式、保留,默認為標准/快速I2C模式。
(5)第10位為保留位。
(6)第11、12兩位(S_MODE)用於選擇數字濾波采樣模式,值從0x0到0x3分別對應選擇旁路、1個、2個、3個時鍾周期,默認為旁路。
(7)第13~15位(CLK_DIV)用於選擇外設時鍾分頻,該時鍾用於輸入濾波器采樣時鍾,值從0x0到0x6分別對應選擇0~6分頻,默認為不分頻。
(8)第16~31位為保留位。

可以看出,由於GPIO0_10、GPIO0_11兩根引腳默認就被用來接I2C設備,所以它們都為真正的開漏結構,也就不需要上下拉選擇和開漏選擇了。但在實際連接I2C設備時,兩根引腳上必須外接上拉電阻, 具體將在I2C模塊部分再作詳細討論。

至此可以總結一下LPC824在默認時的引腳狀態,PIO0_2、PIO0_3和PIO0_5為非GPIO引腳,GPIO0_10、GPIO0_11為真開漏的I2C標准/快速引腳,除此以外的其他引腳均為GPIO引腳,狀態為數字模式,輸入方向,上拉使能,禁止遲滯特性。在配置IOCON寄存器時還要注意一點,在IOCON寄存器中復位值為1的保留位必須寫1。此外,在配置IOCON之前必須把IOCON時鍾(位於SYSAHBCLKCTRL寄存器中的第18位)打開,否則不能進行配置,配置完畢再把該時鍾關閉,以節約電能。

前面的第一個示例中使用的外部晶振函數就是這樣配置的,這里再來回顧一下:

void Ext_osc(void)
{
LPC_SYSCON->SYSAHBCLKCTRL |= (1 << 18); //使能IOCON時鍾
LPC_IOCON->PIO0_8 &= ~(3 << 3); //把P0_8引腳配置為無上下拉電阻方式
LPC_IOCON->PIO0_9 &= ~(3 << 3); //把P0_9引腳配置為無上下拉電阻方式
LPC_SWM->PINENABLE0 &= ~(3 << 6); //把P0_8、P0_9引腳配置為XTALIN、XTALOUT引腳
LPC_SYSCON->SYSAHBCLKCTRL &= ~(1 << 18); //禁止IOCON時鍾
}

通過前面的討論,該函數內容就應該可以完全理解了。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM