轉: i.MX的GPIO控制

i.MX25 系列的 GPIO 口大多是複用口,如果我們想將某 IO 口設置爲輸入或輸出,首先需通過複用配置寄存器將該 IO 口配置爲 GPIO ,然後再配置 GPIO 的相關寄存器。

通過配置 SW_MUX_CTL 寄存器選擇 IO 口的工作模式,每一個管腳都對應一個 SW_MUX_CTL 寄存器,具體通過如下描述:

IOMUXC_SW_MUX_CTL_PAD_<Pin_Name>

這裏 <Pin_Name> 爲管腳名。寄存器對應描述見表 1

 

 

1 SW_MUX_CTL 寄存器描述

通過配置 SW_PAD_CTL 設置 IO 口的驅動電壓,迴轉率,驅動強度,開漏,上拉, DDR 類型等。有些管腳需要通過 SW_PAD_CTL_GRP 設置一組 IO 口。 SW_PAD_CTL 寄存器通過如下描述:

IOMUXC_SW_PAD_CTL_PAD_<Pin_Name>

這裏 <Pin_Name> 爲管腳名。寄存器對應描述見表 2 及表 3

 

2 SW_PAD_CTL 寄存器描述 ( )

 

3 SW_PAD_CTL 寄存器描述 ( )

這裏 DDR 相關管腳比較特殊,其寄存器描述有所不同,見表 4 所示:

 

4 DDR 對應 SW_PAD_CTL 寄存器描述

有些 IO 口需要成組設置,具體各自寄存器設置可查看 i.MX25 手冊。

關於各 IO 口具體複用的功能,以及如何設置 SW_MUX_CTL 來決定 IO 口模式,可查看 i.MX25 手冊的表 4-18[IMX25RM.pdf]

例如我們需要設置某 IO 口爲輸入或輸出,首先通過上面的方法設置完複用功能相關寄存器,接着要設置 GPIO 的相關寄存器。每個 GPIO 都對應有 8 個寄存器設置,在程序中通過結構體封裝如下:

typedef struct

{

    UINT32 DR;                           // lqm:Data register

    UINT32 GDIR;             // lqm:GPIO Direction register.       0:input 1:output

    UINT32 PSR;                         // lqm:Pad sample register. read only

    UINT32 ICR1;              // lqm:interrupt control register1

    UINT32 ICR2;              // lqm:interrupt control register2

    UINT32 IMR;                         // lqm:interrupt mask register

    UINT32 ISR;                          // lqm:interrupt state register

    UINT32 EDGE_SEL;   // lqm:edge select register

} CSP_GPIO_REGS, *PCSP_GPIO_REGS;

其中 DR 表示數據寄存器,也就是 IO 口的高低電平。 GDIR 表示方向寄存器, 0 表示輸入, 1 表示輸出。 PSR 爲只讀寄存器,用戶通過讀取該寄存器值獲取 IO 口的狀態。 ICR1 ICR2 爲中斷控制寄存器,表明了中斷觸發方式; IMR 爲中斷屏蔽寄存器, ISR 爲中斷狀態寄存器, EDGE_SEL 爲邊沿選擇寄存器。

GPIO 口設置爲 GPIO 模式時,若設置爲輸出,則 DR[n] 返回該寄存器本身設置的值,若設置爲輸入,則 DR[n] 返回該腳外部輸入的信號值。

GPIO 設置爲非 GPIO 模式時,若設置爲輸出,則 DR[n] 返回該寄存器本身設置的值,若設置爲輸入,則 DR[n] 固定返回 0

ICR1 描述了 GPIO[0:15] 的中斷觸發方式,具體見表 5

 

5 :中斷觸發方式

ICR2 描述了 GPIO[16:31] 的中斷觸發方式,具體見表 6

 

6 :中斷觸發方式

IMR 對應位爲 0 時,表示屏蔽對應 GPIO 的中斷功能,爲 1 時表示使能對應中斷功能。 ISR 對應位爲 1 時,表示對應 GPIO 中斷產生,需要通過軟件清零相應位。爲 0 時表示中斷未產生。

EDGE_SEL 用於設置 GPIO 是否使用邊沿觸發,若對應 GPIO 口設置爲 1 ,表示相應 GPIO 採用上下沿觸發,前面的 ICR1 ICR2 的設置將變得無效。當 EDGE_SEL 的對應位恢復爲 0 時, ICR1 ICR2 的相應位纔會變得有效。

不論 GPIO 設置爲輸入還是輸出,在讀取 GPIO 對應的電平值時,都讀取 PSR 的值,儘量不要讀取 DR 的值。而設置 IO 口的電平時通過設置 DR 的值來實現

發佈了1 篇原創文章 · 獲贊 0 · 訪問量 10萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章