IMX6ULL的GPIO操作方法
文章目錄
- 1 IMX6ULL的GPIO模塊結(jié)構(gòu)
- 2 CCM用于設(shè)置是否向GPIO模塊提供時(shí)鐘
- 3 IOMUXC:引腳的模式(Mode、功能)
- 4 GPIO模塊內(nèi)部
- 5 如何編程
- 5.1 讀GPIO
- 5.2 寫GPIO
CCM: Clock Controller Module (時(shí)鐘控制模塊)。
IOMUXC : IOMUX Controller,IO 復(fù)用控制器。
GPIO: General-purpose input/output,通用的輸入輸出口。
1 IMX6ULL的GPIO模塊結(jié)構(gòu)
參考資料:芯片手冊(cè)《Chapter 26: General Purpose Input/Output (GPIO)》。
有 5 組 GPIO(GPIO1~GPIO5),每組引腳最多有 32 個(gè),但是可能實(shí)際上并沒有那么多。
GPIO1 有 32 個(gè)引腳:GPIO1_IO0~GPIO1_IO31;
GPIO2 有 22 個(gè)引腳:GPIO2_IO0~GPIO2_IO21;
GPIO3 有 29 個(gè)引腳:GPIO3_IO0~GPIO3_IO28;
GPIO4 有 29 個(gè)引腳:GPIO4_IO0~GPIO4_IO28;
GPIO5 有 12 個(gè)引腳:GPIO5_IO0~GPIO5_IO11;
GPIO 的控制涉及 3 大模塊:CCM、IOMUXC、GPIO 模塊本身,框圖如下:
2 CCM用于設(shè)置是否向GPIO模塊提供時(shí)鐘
參考資料:芯片手冊(cè)《Chapter 18: Clock Controller Module (CCM)》。
GPIOx 要用 CCM_CCGRy 寄存器中的 2 位來(lái)決定該組 GPIO 是否使能。哪組 GPIO用哪個(gè) CCM_CCGR 寄存器來(lái)設(shè)置,請(qǐng)看上圖紅框部分。
CCM_CCGR 寄存器中某 2 位的取值含義如下:
① 00:該 GPIO 模塊全程被關(guān)閉。
② 01:該 GPIO 模塊在 CPU run mode 情況下是使能的;在 WAIT 或 STOP 模式下,關(guān)閉。
③ 10:保留。
④ 11:該 GPIO 模塊全程使能。
GPIO2 時(shí)鐘控制:
GPIO1、GPIO5 時(shí)鐘控制:
GPIO3 時(shí)鐘控制:
GPIO4 時(shí)鐘控制:
3 IOMUXC:引腳的模式(Mode、功能)
參考資料:芯片手冊(cè)《Chapter 32: IOMUX Controller (IOMUXC)》。
對(duì)于某個(gè)/某組引腳,IOMUXC 中有 2 個(gè)寄存器用來(lái)設(shè)置它:
① 選擇功能:
IOMUXC_SW_MUX_CTL_PAD_ :Mux pad xxx,選擇某個(gè) pad 的功能。
IOMUXC_SW_MUX_CTL_GRP_:Mux grp xxx,選擇某組引腳的功能。
某個(gè)引腳,或是某組預(yù)設(shè)的引腳,都有 8 個(gè)可選的模式(alternate (ALT) MUX_MODE)。
比如:
② 設(shè)置上下拉電阻等參數(shù):
IOMUXC_SW_PAD_CTL_PAD_<PAD_NAME>:pad pad xxx,設(shè)置某個(gè) pad 的參數(shù)。
IOMUXC_SW_PAD_CTL_GRP_:pad grp xxx,設(shè)置某組引腳的參數(shù)。
比如:
4 GPIO模塊內(nèi)部
框圖如下:
我們暫時(shí)只需要關(guān)心 3 個(gè)寄存器:
① GPIOx_GDIR:設(shè)置引腳方向,每位對(duì)應(yīng)一個(gè)引腳,1-output,0-input。
② GPIOx_GDIR:設(shè)置輸出引腳的電平,每位對(duì)應(yīng)一個(gè)引腳,1-高電平,0-低電平。
③ GPIOx_PSR:讀取引腳的電平,每位對(duì)應(yīng)一個(gè)引腳,1-高電平,0-低電平。
5 如何編程
5.1 讀GPIO
翻譯一下:
① 設(shè)置 CCM_CCGRx 寄存器中某位使能對(duì)應(yīng)的 GPIO 模塊 // 默認(rèn)是使能的,上圖省略了。
② 設(shè)置 IOMUX 來(lái)選擇引腳用于 GPIO。
③ 設(shè)置 GPIOx_GDIR 中某位為 0,把該引腳設(shè)置為輸入功能。
④ 讀 GPIOx_DR 或 GPIOx_PSR 得到某位的值(讀 GPIOx_DR 返回的是 GPIOx_PSR 的值)。
5.2 寫GPIO
翻譯一下:
① 設(shè)置 CCM_CCGRx 寄存器中某位使能對(duì)應(yīng)的 GPIO 模塊 // 默認(rèn)是使能的,上圖省略了。
② 設(shè)置 IOMUX 來(lái)選擇引腳用于 GPIO。
③ 設(shè)置 GPIOx_GDIR 中某位為 1,把該引腳設(shè)置為輸出功能。
④ 寫 GPIOx_DR 某位的值。
需要注意的是,你可以設(shè)置該引腳的 loopback 功能,這樣就可以從 GPIOx_PSR 中讀到引腳的有實(shí)電平;你從 GPIOx_DR 中讀回的只是上次設(shè)置的值,它并不能反應(yīng)引腳的真實(shí)電平,比如可能因?yàn)橛布收蠈?dǎo)致該引腳跟地短路了,你通過(guò)設(shè)置 GPIOx_DR讓它輸出高電平并不會(huì)起效果。
參考資料:
總結(jié)
以上是生活随笔為你收集整理的IMX6ULL的GPIO操作方法的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 普适的GPIO引脚操作方法
- 下一篇: 燃气热水器出水量如何计算?