GPIO 原理#
GPIO 透過 MIO 提供 54 路介面,其中 16 路位於 bank 500,剩餘位於 bank 501。還透過 EMIO 介面提供從 PL 來的 64 路輸入和 128 路輸出。GPIO 控制和狀態寄存器內存映射在基址 $0xE000_A000$。
ZYNQ 的 GPIO 引腳分為 4 個 bank,共有 118 個 GPIO。
GPIO 內部結構#
從圖中可以看到 GPIO 有三個功能:輸入、輸出、中斷。
其中 MIO 7 和 9 只能做輸出。
一組寄存器只能控制一個 GPIO bank 的所有引腳。
器件引腳的 GPIO 控制#
輸入 / 輸出寄存器#
寄存器名稱 | 说明 |
---|---|
DATA_RO | GPIO 引腳的值存儲在此寄存器中,無論 GPIO 被配置為輸入或輸出,都可以通過讀此寄存器得到 GPIO 引腳的值。 因為是只讀寄存器(對軟體來說),軟體向此寄存器的寫入操作將被忽略。 |
DATA | 輸出數據寄存器,當 GPIO 被配置為輸出才起作用,此寄存器中的值就是輸出到引腳的值。 向此寄存器寫入就是在設置 GPIO 的輸出值, 讀此寄存器將返回 GPIO 前一時刻的輸出值,而不是現在的值。 |
MASK_DATA_LSW | Mask Data Least Significant Words,輸出數據低 16 位掩碼寄存器,此寄存器只有低 16 位有效, 對應位為 1 表示 DATA 寄存器低 16 位中對應位的值可以更改, 若不為 1,則表示 DATA 寄存器低 16 位中對應位保持原值 |
MASK_DATA_MSW | Mask Data Most Significant Words,輸出數據高 16 位掩碼寄存器, 功能同 MASK_DATA_LSW,只是它對應 DATA 寄存器高 16 位 |
DIRM | Direction Memory,方向寄存器,默認為 0 表示輸入,設為 1 表示輸出 注意,即使 DIRM 為 1,軟體也可以像輸入一樣去讀此引腳的電平 |
OEN | Output Enable,輸出使能寄存器, 僅當 DIRM 為 0 時有效,為 1 表示輸出使能, 為 0 表示輸出不使能,此時對應引腳上的值為三態值 |
中斷控制寄存器#
寄存器名稱 | 说明 |
---|---|
INT_TYPE | Interrupt Type 中斷類型寄存器, 控制 GPIO 中斷是電平觸發還是邊緣觸發 |
INT_POLARITY | Interrupt Polarity 中斷極性寄存器 控制 GPIO 中斷是低電平 / 下降沿有效,還是高電平 / 上升沿有效 |
INT_ANY | Interrupt Any,雙邊沿寄存器, 僅當 INT_TYPE 為邊沿觸發時,此寄存器才有效,控制是否雙沿均可觸發中斷 |
INT_STAT | Interrupt State,中斷狀態寄存器, 此寄存器的值會被與之相連的 INT State D 觸發器讀取 D 觸發器存儲中斷狀態,軟體通過讀此 D 觸發器輸出來判斷中斷是否發生, 清除此 D 觸發器來清除中斷狀態 |
INT_MASK | Interrupt Mask,中斷掩碼寄存器, 顯示當前哪些位被屏蔽,哪些位啟用 |
INT_DIS | Interrupt Disable,中斷失效寄存器, 向該寄存器的任何位寫入 1 都會屏蔽該中斷信號。 從該寄存器讀取會返回不可預測的值 |
INT_EN | Interrupt Enable,中斷使能寄存器 向該寄存器的任何位寫入 1,可以啟用 / 解除中斷信號的掩碼。 從該寄存器讀取將返回一個不不可預測的值 |
GPIO 的中斷號為 ==52==,中斷優先級是固定的,無需配置 GPIO 的中斷優先級。GPIO 所有引腳共享同一個中斷,即使能兩個引腳的中斷的話,軟體無法判斷中斷來自哪個引腳。
EMIO 和 MIO#
MIO,Multiuse I/O,複用輸入 / 輸出,對應 PS 端的可配置的多功能引腳。
EMIO,Extent MIO,對應 PL 端的可配置多功能引腳。
MIO 是外設的基本引腳,由於 MIO 的引腳數量較少,ZYNQ 也提供 EMIO 介面作為 MIO 的擴展,外設通過 EMIO 介面連接到 PL 端的引腳,來實現和 MIO 幾乎相同的功能。
MIO 和 EMIO 的不同點如下:
- MIO 對於 PL 端是透明的,PL 無法讀取 MIO 引腳上的電平;PS 端可以通過 EMIO 與 PL 端通信。
- 外設與 MIO 是固定搭配的,初始化時要根據開發板原理圖來選擇引腳約束。EMIO 相對靈活,引腳可以任意指定,通過 xdc 文件約束指定到 PL 端的某個引腳。
- 因為 MIO 引腳更靠近外圍電路,相較於 EMIO,一些外設使用 MIO 的性能更好,還有一些外設只能使用 MIO。
MIO bank 和封裝的 bank 的區別與聯繫#
MIO 分為 Bank 0 和 Bank 1,Bank 0 是封裝 Bank 500 中的部分引腳,Bank 1 是封裝的 bank 501 的部分引腳。
Bank 0 包含 MIO 0~15 共 16 個 MIO,bank 1 包括 MIO 16~53 共 38 個 MIO,總共有 54 個 MIO。EMIO 一共有 64 個。