目錄
手冊對應章節
1.GPIO 復用(引腳功能選擇)- IOMUXC_SW_MUX_CTL_PAD_xxx
2.GPIO 電氣特性 - IOMUXC_SW_PAD_CTL_PAD_xxx
3.GPIO 數據與控制寄存器
3.1.數據 - DR
3.2.輸入/輸出選擇 - GDIR
3.3.狀態 - PSR
3.4.中斷觸發控制 - ICR
3.5.中斷使能 - IMR
3.6.中斷狀態 - ISR
3.7.邊沿中斷 - EDGE_SEL
手冊對應章節
// GPIO:28 General Purpose Input/Output (GPIO)
// IOMUX:32 IOMUX Controller (IOMUXC)
IMX 提供了多個 GPIO 組,每個 GPIO 組包含多個 GPIO 接口(IO0~IOx),這些接口用于連接 Ethernet、SPI 等
IO 接口可以用于不同的模塊,但其數量有限,因此不可避免的需要進行 IO 復用,即多個設備通過 PAD 連接在一個 IO 接口上,IMX 通過 IOMUXC(IOMUX Controller)控制 GPIO 復用
1.GPIO 復用(引腳功能選擇)- IOMUXC_SW_MUX_CTL_PAD_xxx
以 GPIO1 組中的 IO03 為例:
IOMUXC_SW_MUX_CTL_PAD_GPIO1_IO03 寄存器控制 GPIO1_IO03 引腳的功能復用:
該寄存器包含兩個字段,其功能如下:
-
SION[4]:Software Input On,強制引腳功能為 GPIO1_IO03(可通過軟件設置,忽略該引腳的功能復用):
-
1:使能,引腳功能強制為 GPIO1_IO03,從而忽略 MUX_MODE 配置的功能復用;
-
0:禁用,引腳功能由 MUX_MODE 字段定義;
-
-
MUX_MODE[3:0]:MUX Mode Select,設置引腳功能:
-
0b0000:ALT0,i2c1 模塊的 I2C1_SDA 引腳;
-
0b0001:ALT1,gpt1 模塊的 GPT1_COMPARE3 引腳;
-
0b0010:ALT2,usb 模塊的 USB_OTG2_OC 引腳;
-
0b0100:ALT4,usdhc1 模塊的 USDHC1_CD_B 引腳;
-
0b0101:ALT5,gpio1 模塊的 GPIO1_IO03 引腳;
-
0b0110:ALT6,ccm 模塊的 CCM_DI0_EXT_CLK 引腳;
-
0b0111:ALT7,src 模塊的 SRC_TESTER_ACK 引腳;
-
0b1000:ALT8,uart1 模塊的 UART1_RX 引腳;
-
注意:當 SION 位置 1 后,引腳功能會被強行設置為 GPIO1_IO03,此時通過 MUX_MODE 設置引腳功能無效
2.GPIO 電氣特性 - IOMUXC_SW_PAD_CTL_PAD_xxx
IOMUXC_SW_PAD_CTL_PAD_xxx 寄存器控制引腳的電氣特性,以 IOMUXC_SW_PAD_CTL_PAD_GPIO1_IO03 為例:
寄存器中各字段的含義如下:
-
HYS[16]:Hyst. Enable,使能遲滯比較器,當 IO 作為輸入功能時有效,用于設置輸入接收器的施密特觸發器是否使能,如果需要對輸入波形進行整形可以使能此位:
-
1:HYS_0_Hysteresis_Disabled,禁用施密特觸發器;
-
0:HYS_1_Hysteresis_Enabled,使能施密特觸發器;
-
-
PUS[15:14]:Pull Up / Down Config,上拉/下拉電阻設置:
-
00:PUS_0_100K_Ohm_Pull_Down,100K 下拉;
-
01:PUS_1_47K_Ohm_Pull_Up,47K 上拉;
-
10:PUS_2_100K_Ohm_Pull_Up,100K 上拉;
-
11:PUS_3_22K_Ohm_Pull_Up,22K 下拉;
-
-
PUE[13]:Pull / Keep Select,上拉/下拉 or 狀態保持器,當 IO 作為輸入時,用于設置 IO 使用上拉/下拉還是狀態保持器控制引腳:
-
0:PUE_0_Keeper,狀態保持器;
-
1:PUE_1_Pull,上拉/下拉;
-
注意:狀態保持器在 IO 作為輸入時有效,當外部電路斷電后此 IO 口可以保持住以前的狀態;
-
-
PKE[12]:Pull / Keep Enable,是否使能狀態保持器:
-
0:PKE_0_Pull_Keeper_Disabled,禁用;
-
1:PKE_1_Pull_Keeper_Enabled,使能;
-
狀態保持器的作用是持續輸出設定的電平,而非脈沖信號,例如,引腳配置輸出高電平,同時使用了狀態保持器,觸發引腳輸出后,引腳將持續輸出高電平,而非一個高電平脈沖;
-
-
ODE[11]:Open Drain Enable,開漏輸出使能:
-
0:ODE_0_Open_Drain_Disabled,禁用開漏輸出;
-
1:ODE_1_Open_Drain_Enabled,使能開漏輸出;
-
-
SPEED[7:6]:Speed,設置 IO 口的速率:
-
00:SPEED_0_low_50MHz_,低速率 50MHz;
-
01:SPEED_1_medium_100MHz_,中等速率 100MHz;
-
10:SPEED_2_medium_100MHz_,中等速率 100MHz;
-
11:SPEED_3_max_200MHz_,高速率 200MHz;
-
-
DSE[5:3]:Drive Strength,設置 IO 口的驅動能力:
-
000:DSE_0_output_driver_disabled_,禁用輸出驅動;
-
001:DSE_1_R0_260_Ohm___3_3V__150_Ohm_1_8V__240_Ohm_for_DDR_,3.3V 下 R0 是 260Ω,R0,1.8V 時 R0 為 150Ω,接 DDR 時 R0 為 240Ω;
-
010:DSE_2_R0_2,R0/2;
-
011:DSE_3_R0_3,R0/3;
-
100:DSE_4_R0_4,R0/4;
-
101:DSE_5_R0_5,R0/5;
-
110:DSE_6_R0_6,R0/6;
-
111:DSE_7_R0_7,R0/7;
-
-
SRE[0]:Slew Rate,設置壓擺率,壓擺率就是 IO 電平跳變所需的時間,比如從 0 到 1 需要多少時間,時間越小波形越陡,說明壓擺率越高,反之,時間越大波形越緩,壓擺率越低,如果產品要過 EMC 則可以使用較低的壓擺率,因為波形緩和,如果使用 IO 做高速通信則可以使用高壓擺率:
-
0:SRE_0_Slow_Slew_Rate,低壓擺率;
-
1:SRE_1_Fast_Slew_Rate,高壓擺率;
-
3.GPIO 數據與控制寄存器
每個 GPIO 組都有對應的數據和控制寄存器,用于操作該 GPIO 組內的每個 GPIO 引腳,以 GPIO1 組為例:
3.1.數據 - DR
其中,GPIOx_DR 寄存器用于控制該 GPIO 組內具體引腳的輸出值、以及該 GPIO 組內引腳讀取到的輸入值:
每個 GPIO 組最多可擁有 32 個引腳,這些引腳可以配置為輸入引腳或輸出引腳
GPIOx_DR 寄存器的每一位都對應于該 GPIO 組內的一個引腳,當引腳配置為輸出模式后,向對應的位寫 1 就可以控制該引腳輸出高/低電平,當引腳被配置為輸入模式后,讀取對應的位即可獲得該引腳讀取到的電平值,例如,要設置 GPIO1_IO03 輸出高電平,則需要設置 GPIO1.DR = 0x8,當 GPIO1_IO03 引腳接地的話,則 GPIO1.DR 寄存器 bit-4 的值為 0,若 GPIO1_IO03 配置為輸入引腳,則讀取 GPIO1.DR 寄存器的 bit-4 即可獲取該引腳目前的電平
3.2.輸入/輸出選擇 - GDIR
當 GPIO 組中某個引腳的功能選擇為通用 GPIO 后(通過 IOMUX Controller),通過 GPIOx_GDIR 寄存器設置該 GPIO 組中,各引腳為輸入模式還是輸出模式:
-
0:INPUT,引腳配置為輸入引腳;
-
1:OUTPUT,引腳配置為輸出引腳;
同樣的,GPIOx_GDIR 寄存器中的每一位對應該 GPIO 組內的一個引腳,例如,GPIO1_GDIR 的 bit-4 對應 GPIO1_IO03
3.3.狀態 - PSR
GPIOx_PSR 寄存器為只讀寄存器,其每個位對應該 GPIO 組內的一個引腳:
讀取對應的位即讀取該引腳當前的電平狀態,其功能與 GPIOx_DR 讀取輸入引腳的功能一樣,其區別在于,GPIOx_PSR 只會在訪問該寄存器時才會讀取引腳的輸入值
3.4.中斷觸發控制 - ICR
GPIOx_ICR1 寄存器控制 GPIO 組內 0~15 引腳的中斷觸發信號:
GPIOx_ICR2 寄存器控制 GPIO 組內 16~31 引腳的中斷觸發信號:
每個引腳對應兩個位,控制中斷為高/低電平、上升沿/下降沿觸發:
-
00:LOW_LEVEL,低電平觸發;
-
01:HIGH_LEVEL,高電平觸發;
-
10:RISING_EDGE,上升沿觸發;
-
11:FALLING_EDGE,下降沿觸發;
以 GPIO1_IO15 為例,如果要設置 GPIO1_IO15 為上升沿觸發中斷,則應該設置 GPIO1.ICR1 = 2 << 30, 如果要設置 GPIO1 的 IO16~31 則需要設置 ICR2 寄存器
3.5.中斷使能 - IMR
GPIOx_IMR 寄存器控制對應引腳的中斷是否使能:
-
0:MASKED,禁止該引腳觸發中斷;
-
1:UNMASKED,允許該引腳觸發中斷;
例如,要使能 GPIO1_IO00 的中斷,則應該設置 GPIO1.MIR |= 0x1
3.6.中斷狀態 - ISR
中斷狀態寄存器 GPIOx_ISR 指示對應引腳是否產生了中斷請求:
例如,如果 GPIO1_ISR 寄存器的 bit-4 為 1,則表示 GPIO1_IO03 產生了中斷信號(中斷請求)
處理完中斷后必須清除中斷標志位,清除方法是向 ISR 寄存器中相應的位寫 1(即寫 1 清零)
3.7.邊沿中斷 - EDGE_SEL
該寄存器的每一位對應該 GPIO 組內的一個引腳:
對應位置 1 后,該引腳的上升沿和下降沿(雙邊沿)均會觸發中斷請求,該寄存器中的設置會覆蓋引腳對應的 ICR 寄存器中的設置