打開該手冊(cè)的 32 章節(jié)“Chapter 32 IOMUX Controller (IOMUXC)”,我們看到 32 章節(jié)的目錄如下圖所示:
圖中的“IOMUXC_SW_MUC_CTL_PAD_GPIO1_IO00”就是 GPIO 的命名。其命名格式是
“IOMUXC_SW_MUC_CTL_PAD_XX_XX”,其中的 XX_XX 就是 GPIO 的命名。例如:JTAG_MOD,GPIO1_IO00,
UART4_TX_DATA 等。I.MX6ULL 的 GPIO 命名是根據(jù) IO 所擁有的功能來(lái)命名的,比如我們看到 GPIO1_IO00,
就可以知道這個(gè)是 GPIO 功能,看到 UART4_TX_DATA 就知道這個(gè)是串口 4 的發(fā)送功能。在參考手冊(cè)的 32 章
節(jié)列出了 i.MX6 ULL 的所有 IO 引腳,我們可以看到具有 GPIO 功能的引腳只有“GPIO1_IO00~GPIO1_IO09”
這 10 路 GPIO,實(shí)際上 i.MX6 ULL 的 IO 口都是具有復(fù)用功能的(一個(gè) IO 口可以配置成好幾種功能,如果不
做配置,會(huì)有一種默認(rèn)的功能)。下面我們看看 i.MX6 ULL 的 IO 引腳復(fù)用功能。
我們以“IOMUXC_SW_MUX_CTL_PAD_GPIO1_IO00”這個(gè) IO 為例,打開手冊(cè)的 32.6.7(1568 頁(yè))如下圖所示
上圖可以看到該 IO 對(duì)應(yīng)的配置寄存器“SW_MUX_CTL_PAD_GPIO1_IO00”,寄存器地址是 0X20E005C,
寄存器為 32 位,其中的 bit0-bit3(MUX_MODE)這四位是設(shè)置 IO 引腳復(fù)用功能的。從表中我們可以看到
GPIO1_IO00 有 9 種復(fù)用功能,分別對(duì)應(yīng) ALT0-ALT8,其中 ALT5 就是作為 GPIO1_IO00,如下圖所示:
從上圖中我們可以看到 GPIO1_IO00 這個(gè)引腳還可以配置成 ENET2_REF_CLK2,I2C2_SDA 等功能,這就是 IO
的復(fù)用功能。
下面我們?cè)賮?lái)看下“IOMUXC_SW_MUX_CTL_PAD_UART4_TX_DATA”這個(gè) IO 引腳。這個(gè)引腳的描述在 32.6.29
章節(jié)(1590 頁(yè)),如下圖所示:
從上圖可以看到該引腳可以復(fù)用成 7 種不同的模式。其中 ALT5(0101)表示可以復(fù)用為 GPIO1_IO28。
所以我們可以看到 i.MX6 ULL 的 GPIO 不止 GPIO1_IO00-GPIO1_IO09 這 10 個(gè),其它的 IO 也可以復(fù)用為 GPIO。
在第四章節(jié)我們可以看到 i.MX6 ULL 的 GPIO 一共有 5 組:GPIO1、GPIO2、GPIO3、GPIO4、GPIO5,其中 GPIO1
有 32 個(gè) IO(IO0-IO31),GPIO2 有 22 個(gè) IO(IO0-IO21),GPIO3 有 29 個(gè) IO(IO0-IO28),GPIO4 有 29個(gè) IO(IO0-IO28),GPIO5 有 12 個(gè) IO(IO0-IO11),這樣 i.MX6 ULL 一共有 124 個(gè) GPIO。如果我們想要
查看每個(gè) IO 能復(fù)用成什么功能,可以查看第 4 章,如果我們要設(shè)置某個(gè) IO 的功能,需要查看第 32 章。
9 92 .2 IO 引腳配置 引腳配置
IO 引腳的配置我們需要參考第 32 章節(jié),在 9.1 章節(jié)我們看到每個(gè) IO 都有一個(gè)“SW_MUX_CTL_PAD_XX_XX”
的寄存器,例如 SW_MUX_CTL_PAD_GPIO1_IO00。該寄存器在 6.1 章節(jié)我們介紹了,主要是用來(lái)配置 IO 引腳
的模式。然后我們?cè)谠撜鹿?jié)看到還有一個(gè)“SW_PAD_CTL_PAD_XX_XX”的寄存器,例如
“SW_PAD_CTL_PAD_GPIO1_IO00”寄存器,如下圖所示:
從上圖可以看到 SW_PAD_CTL_PAD_GPIO1_IO00 寄存器的地址是 0X20E02E8,他也是一個(gè) 32 位的寄存器,我
們可以看到改寄存器按照位劃分成了幾種功能設(shè)置,如下:
HYS(bit16):用來(lái)使能遲滯
比較器,當(dāng) IO 作為輸入功能的時(shí)候有效,用于設(shè)置輸入接收器的施密特觸發(fā)
器是否使能。如果需要對(duì)輸入波形進(jìn)行整形的話可以使能此位。此位為 0 的時(shí)候禁止遲滯比較器,為 1 的
時(shí)候使能遲滯比較器。PUS(bit15-bit14)用來(lái)設(shè)置上下拉
電阻的。
PUE(bit13)當(dāng) IO 作為輸入的時(shí)候,這個(gè)位用來(lái)設(shè)置 IO 使用上下拉還是狀態(tài)保持器。狀態(tài)保持器在 IO 作
為輸入的時(shí)候才有用,當(dāng)外部
電路斷電以后此 IO 口可以保持住以前的狀態(tài)。
PKE(bit12)用來(lái)使能或者禁止上下拉/狀態(tài)保持器功能。
ODE(bit11)IO 作為輸出的時(shí)候,此位用來(lái)禁止或者使能開路輸出。
SPEED(bit7-bit6)當(dāng) IO 用作輸出的時(shí)候,此位用來(lái)設(shè)置 IO 速度。
DSE(bit5-bit3)當(dāng) IO 用作輸出的時(shí)候用來(lái)設(shè)置 IO 的驅(qū)動(dòng)能力。
SRE(bit0)設(shè)置壓擺率。
9 93 .3 GPIO 配置 配置
在 9.1 和 9.2 章節(jié)我們介紹了這兩個(gè)寄存器“SW_MUX_CTL_PAD_XX_XX”和“SW_PAD_CTL_PAD_XX_XX”
用來(lái)配置 IO 引腳,在本章我們來(lái)學(xué)習(xí)一下 GPIO 功能的配置(GPIO 屬于 IO 引腳中的一種復(fù)用功能)。比如
GPIO1_IO00 這個(gè) IO 可以復(fù)用為 I2C2_SCL、ENET1_REF_CLK1、GPIO1_IO00、WDOG3_WDOG_B 等 9 種復(fù)用功能,
GPIO1_IO00 只是其中的一種,具體配置成哪種復(fù)用功能,需要看下我們的硬件設(shè)計(jì)中這個(gè) IO 是作為哪種功
能來(lái)設(shè)計(jì)的。如果我們把該引腳用來(lái)控制
LED 發(fā)光二極管,那我們的程序就要把這個(gè) IO 配置成 GPIO 模式,
然后我們還需要對(duì) GPIO 的功能進(jìn)行配置,我們可以參考手冊(cè)的第 28 章“General Purpose Input/Output
(GPIO)”。在該章節(jié)我們可以看到 GPIO 的結(jié)構(gòu)如下圖所示所示:
在上圖中我們可以看到兩個(gè)地方用紅色方框標(biāo)注了(1、2),其中 1 處里面有兩個(gè)寄存器,這就是我
們 6.2 章節(jié)介紹的配置 IO 復(fù)用和 IO 功能屬性的寄存器。2 處表示當(dāng) IO 作為 GPIO 使用的時(shí)候,需要配置的
寄存器(共有 8 個(gè)),分別是:GPIO.DR、GPIO.GDIR、GPIO.PSR、GPIO.ICR1、GPIO.ICR2、GPIO.EDGE_SEL、
GPIO.IMR、GPIO.ISR,前面 6.2 章節(jié)我們介紹了 i.MX6 ULL 一共有 5 組 GPIO,每組 GPIO 分別有這 8 個(gè)寄存
器,下面我們分別看下這些寄存器:
首先是 GPIOx_DR 寄存器,如下圖所示:
此寄存器是數(shù)據(jù)寄存器,32 位,每一位對(duì)應(yīng)一個(gè) GPIO,當(dāng) GPIO 配置成輸出以后,向?qū)?yīng)的位寫 1,GPIO
就會(huì)輸出高電平,寫 0,GPIO 就會(huì)輸出低電平。如果 GPIO 設(shè)置成輸入,那讀取這個(gè)寄存器對(duì)應(yīng)的位,就可
以獲取到對(duì)應(yīng) GPIO 的狀態(tài)(0 或 1)。
然后是 GPIOx_GDIR 寄存器,如下圖所示:
該寄存器也是 32 位的,每一位對(duì)應(yīng)一個(gè) GPIO,該寄存器是用來(lái)設(shè)置 GPIO 是輸入還是輸出的。(對(duì)應(yīng)
的位設(shè)置成 0,對(duì)應(yīng)的 GPIO 設(shè)置成輸入模式;對(duì)應(yīng)的位設(shè)置成 1,對(duì)應(yīng)的 GPIO 就配置成輸出模式了)。
然后是 GPIOx_PSR 寄存器,如圖 6.3.4 所示:
該寄存器也是 32 位的,每一位對(duì)應(yīng)一個(gè) GPIO,該寄存器是用來(lái)讀取對(duì)應(yīng) GPIO 的狀態(tài)(高低電平)。
然后是 GPIOx_ICR1 寄存器,如下圖所示:
該寄存器是中斷控制寄存器,每組 GPIO 最多有 32 個(gè) GPIO,該寄存器用來(lái)配置低 16 個(gè) GPIO,此寄存
器是 32 位的,每?jī)晌槐硎疽粋(gè) GPIO,這兩位用來(lái)配置中斷的觸發(fā)方式:
00 低電平出發(fā)
01 高電平觸發(fā)
10 上升沿觸發(fā)
11 下降沿觸發(fā)
以 GPIO1_IO3 為例,如果設(shè)置成高電平觸發(fā),GPIO1.ICR1=1<<6。
然后是 GPIOx_ICR2 寄存器,如下圖所示:
該寄存器也是中斷控制寄存器,每組 GPIO 最多有 32 個(gè) GPIO,該寄存器用來(lái)配置高 16 個(gè) GPIO,此寄
存器是 32 位的,每?jī)晌槐硎疽粋(gè) GPIO,這兩位用來(lái)配置中斷的觸發(fā)方式:
00 低電平出發(fā)
01 高電平觸發(fā)
10 上升沿觸發(fā)
11 下降沿觸發(fā)
以 GPIO1_IO7 為例,如果設(shè)置成高電平觸發(fā),GPIO1.ICR1=1<<2。
然后是 GPIOx_IMR 寄存器,如下圖所示:
該寄存器是中斷屏蔽寄存器,每一位對(duì)應(yīng)一個(gè) GPIO,如果使能某個(gè) GPIO 的中斷,那么設(shè)置這個(gè)寄存器
對(duì)應(yīng)的位為 1 即可。如果禁止某個(gè) GPIO 的中斷,那么設(shè)置這個(gè)寄存器的對(duì)應(yīng)位為 0。
然后是 GPIOx_ISR 寄存器,如下圖所示:
該寄存器是中斷狀態(tài)寄存器,共有 32 位,每位對(duì)應(yīng)一個(gè) gpio,只要某個(gè) GPIO 的中斷產(chǎn)生,那么對(duì)應(yīng)
的位就會(huì)被置 1,我們可以通過(guò)讀取該寄存器來(lái)判斷 GPIO 的中斷是否產(chǎn)生了。當(dāng)我們處理完中斷后,必須
要清除對(duì)應(yīng)的中斷標(biāo)志位(像該寄存器相應(yīng)的位寫 1,就是清除中斷標(biāo)志位)。
然后是 GPIOx_EDGE_SEL,如下圖所示:
該寄存器用來(lái)設(shè)置邊沿中斷,這個(gè)寄存器會(huì)覆蓋 ICR1 和 ICR2 的設(shè)置,同樣一個(gè) GPIO 對(duì)應(yīng)一位。相應(yīng)
的位被置 1,那么就相當(dāng)于設(shè)置了對(duì)應(yīng)的 GPIO 是上升沿和下降沿(雙邊沿)觸發(fā)。
至此關(guān)于 GPIO 的所有寄存器我們就介紹完了。
其他部分關(guān)注:使用迅為IMX6ULL開發(fā)板第一個(gè)匯編實(shí)驗(yàn)(二)更多內(nèi)容關(guān)注公眾號(hào):迅為
電子