加入星計(jì)劃,您可以享受以下權(quán)益:

  • 創(chuàng)作內(nèi)容快速變現(xiàn)
  • 行業(yè)影響力擴(kuò)散
  • 作品版權(quán)保護(hù)
  • 300W+ 專業(yè)用戶
  • 1.5W+ 優(yōu)質(zhì)創(chuàng)作者
  • 5000+ 長(zhǎng)期合作伙伴
立即加入
  • 正文
    • 1. 認(rèn)識(shí)i.MX6ULL處理器GPIO
    • 2. 配置i.MX6ULL處理器GPIO
    • 3. GPIO配置總結(jié)
  • 相關(guān)推薦
  • 電子產(chǎn)業(yè)圖譜
申請(qǐng)入駐 產(chǎn)業(yè)圖譜

i.MX6ULL處理器GPIO寄存器配置原理

2022/06/16
1293
閱讀需 5 分鐘
加入交流群
掃碼加入
獲取工程師必備禮包
參與熱點(diǎn)資訊討論

公眾號(hào):嵌入式攻城獅(ID:andyxi_linux)

作者:安迪西

之前的文章中介紹了新舊字符設(shè)備驅(qū)動(dòng)開發(fā)的方式,并利用虛擬的字符設(shè)備來(lái)學(xué)習(xí)其開發(fā)流程,沒有涉及到操作Linux開發(fā)板上的硬件。對(duì)硬件的操作,究其本質(zhì)最終都是要操作處理器寄存器。因此在操作硬件之前,我們需要先了解有關(guān)GPIO的寄存器配置原理及方法

1. 認(rèn)識(shí)i.MX6ULL處理器GPIO

1.1 基本概念

以下是一些名詞縮寫及其含義:

IO:Input Output,用于CPU與外界進(jìn)行信息交互

GPIO:General Purpose IO ports,通用IO口

SNVS:Secure Non-Volatile Storage 安全的非易失性存儲(chǔ)

IOMUX:Input Output Multiplexer 輸入/輸出多路復(fù)用器

IOMUXC:Input Output Multiplexer Controller 輸入/輸出多路復(fù)用控制器

SW:Switch 開關(guān)

1.2 GPIO邏輯結(jié)構(gòu)

下圖為i.MX6ULL處理器的GPIO硬件結(jié)構(gòu)框圖,其中PAD1和PAD2表示i.MX6ULL芯片引出的GPIO引腳,其余部件均位于芯片內(nèi)部

上圖中各部分的功能和作用如下

? PAD1:GPIO引腳,其左側(cè)通過(guò)IOMUX復(fù)用選擇器連接到各種寄存器上

? IOMUX復(fù)用選擇器:用于將芯片引腳與最左側(cè)的各種寄存器連接起來(lái)

? IOMUXC復(fù)用控制器:IO通過(guò)MUX寄存器來(lái)配置復(fù)用功能,如GPIO、IIC等;通過(guò)PAD寄存器來(lái)配置引腳屬性,如驅(qū)動(dòng)能力,是否使用上下拉電阻

? Block外設(shè)功能控制塊:例如具有PWM輸出功能的引腳,它需要PWM外設(shè)的支持

? GPIO外設(shè):GPIO是每個(gè)IO都有的外設(shè),是IO控制的基本功能, 如輸出高低電平、 檢測(cè)電平輸入等。當(dāng)需要使用引腳的GPIO功能時(shí),就要配置GPIO外設(shè)中的各個(gè)寄存器

? PAD2:另一個(gè)引腳,它與PAD1有一根信號(hào)線連接,表示部分引腳的輸出可以作為另一個(gè)引腳的輸入

1.3 GPIO命名

i.MX6ULL處理器的GPIO被分為5組,且每組的數(shù)量不同,具體可查閱數(shù)據(jù)手冊(cè)

 

另外根據(jù)IO類別,可以分為兩大類:SNVS域IO和通用域IO,這兩類IO本質(zhì)上是一樣的

2. 配置i.MX6ULL處理器GPIO

下面以GPIO1_IO00引腳為例,介紹GPIO配置的步驟

2.1 時(shí)鐘配置

I.MX6ULL每個(gè)外設(shè)都有一個(gè)外設(shè)時(shí)鐘,使用GPIO時(shí),也必須先使能對(duì)應(yīng)的時(shí)鐘。CCM(Clock Controller Module)時(shí)鐘控制模塊寄存器用來(lái)使能外設(shè)時(shí)鐘。CMM一共有CCM_CCGR0~CCM_CCGR6這7個(gè)寄存器,控制著I.MX6U的所有外設(shè)時(shí)鐘開關(guān)

以CCM_CCGR0為例,它是個(gè)32位寄存器,每2位控制一個(gè)外設(shè)的時(shí)鐘,比如 bit31:30 控制著GPIO2 的外設(shè)時(shí)鐘,兩個(gè)位就有 4 種操作方式:

 

若要打開GPIO2的外設(shè)時(shí)鐘,只需要設(shè)置CCM_CCGR0的bit31和bit30為1即可,即 CCM_CCGR0=3 << 30

2.2 IO配置

? 配置MUX寄存器:配置復(fù)用功能

 

IOMUXC_SW_MUX_CTL_PAD_GPIO1_IO00寄存器地址為:0x020E005C,只用到了最低的5位,bit0~bit3就是設(shè)置復(fù)用功能的,該引腳可復(fù)用為9種不同功能的IO

? 配置PAD寄存器:配置引腳屬性

 

IOMUXC_SW_PAD_CTL_PAD_GPIO1_IO00寄存器地址為:0x020E02E8,只用到了低17位,用于設(shè)置速度、驅(qū)動(dòng)能力、壓擺率等

2.3 GPIO配置

上面的MUX和PAD寄存器都是配置IO的,當(dāng)把IO配置為了GPIO功能后,還需要繼續(xù)對(duì)GPIO外設(shè)的各種寄存器進(jìn)行配置? 配置DR寄存器:數(shù)據(jù)寄存器,一個(gè)GPIO組最大只有32個(gè)IO,32位DR寄存器中的每一個(gè)位對(duì)應(yīng)一個(gè)GPIO

 

 

當(dāng)設(shè)置為輸出模式,向指定的位寫入數(shù)據(jù),相應(yīng)的IO就會(huì)輸出相應(yīng)的高低電平;當(dāng)設(shè)置為輸入模式,比如GPIO1_IO00引腳接地的話,GPIO1.DR的bit0就是0

? 配置GDIR寄存器:方向寄存器,設(shè)置GPIO的工作方向是輸入還是輸出,每個(gè)位對(duì)應(yīng)一個(gè)IO

 

若要設(shè)置GPIO1_IO00為輸入,則GPIO1.GDIR=0;反之GPIO1.GDIR=1

? 配置PSR寄存器:狀態(tài)寄存器,每個(gè)IO對(duì)應(yīng)一個(gè)位,用于獲取對(duì)應(yīng)的GPIO的狀態(tài)

 

是一個(gè)只讀寄存器,功能類似于輸入狀態(tài)下的DR寄存器

? 配置ICR1/ICR2寄存器:中斷控制寄存器,每?jī)晌粚?duì)應(yīng)一個(gè)GPIO,ICR1用于配置低16個(gè)GPIO,ICR2用于配置高16個(gè)GPIO

 

例如設(shè)置GPIO1_IO15為上升沿觸發(fā)中斷,則GPIO1.ICR1 = 2 << 30

? 配置IMR寄存器:中斷屏蔽寄存器,每個(gè)IO對(duì)應(yīng)一個(gè)位,用于控制GPIO的中斷使能和禁止

 

例如要使能GPIO1_IO00的中斷,則GPIO1.MIR=1

? 配置ISR寄存器:中斷狀態(tài)寄存器,每個(gè)IO對(duì)應(yīng)一個(gè)位,只要某個(gè)GPIO的中斷發(fā)生,ISR中相應(yīng)的位會(huì)被置1

 

可通過(guò)讀取ISR寄存器來(lái)判斷GPIO中斷是否發(fā)生,相當(dāng)于中斷標(biāo)志位。處理完中斷后,必須清除中斷標(biāo)志位

? 配置EDGE_SEL寄存器:邊沿選擇寄存器,每個(gè)IO對(duì)應(yīng)一個(gè)位,用來(lái)設(shè)置邊沿中斷, 并會(huì)覆蓋ICR1和ICR2的設(shè)置

 

若相應(yīng)位被置1,相當(dāng)于設(shè)置了對(duì)應(yīng)GPIO雙邊沿(上升沿和下降沿)觸發(fā)。例如,設(shè)置GPIO1.EDGE_SEL=1,則表示雙邊沿觸發(fā)中斷,無(wú)論 GFPIO1_CR1的設(shè)置為多少

3. GPIO配置總結(jié)

綜上所述,i.MX6ULL的IO作為GPIO使用,需要進(jìn)行以下幾個(gè)步驟的配置:

使能GPIO對(duì)應(yīng)的時(shí)鐘

配置MUX寄存器,設(shè)置IO的復(fù)用功能,使其復(fù)用為GPIO功能

配置PAD寄存器,設(shè)置IO的上下拉、速度等

配置GPIO的各種寄存器,設(shè)置輸入/輸出、是否使用中斷、默認(rèn)輸出電平等

裸機(jī)開發(fā)中,需要自已定義寄存器及其地址,通常代碼如下:

/* 寄存器物理地址 */
#define CCM_CCGR1_BASE              (0X020C406C) 
#define SW_MUX_SNVS_TAMPER3_BASE    (0X02290014)
#define SW_PAD_SNVS_TAMPER3_BASE    (0X02290058)
#define GPIO5_DR_BASE               (0X020AC000)
#define GPIO5_GDIR_BASE             (0X020AC004)

相關(guān)推薦

電子產(chǎn)業(yè)圖譜

公眾號(hào):嵌入式攻城獅;專注于分享和記錄嵌入式開發(fā)技術(shù),主要包含C語(yǔ)言、STM32、STM32CubeMX、lwIP、FreeRTOS、Linux、Zigbee、WIFI、BLE、LoRa、NB-loT、PCB電路設(shè)計(jì)、QT等等。