zynq gpio mio emio簡介 gpio寄存器


 

ZYNQ由兩部分組成:PS 處理器系統,PL  可編程邏輯塊(直接理解成FPGA即可)

PS(處理器系統)是 SOC ZYNQ 的核心,相當於zynq芯片以PS為中心,PL(FPGA)是他的外設。

PS:以RAM為核心的SOC,PL也是SOC中的一個外設而已

PS分為以下4部分:  APU:應用處理單元,

             memory interface :存儲器接口

             IOP:I/O外設(包含很多常用的接口協議)  

           interconnect:內部的互連

 

 

 對架構進行划分,上為PS,下為PL。

 

 

GPIO 不針對某一特殊的設備進行連接,可連接一些通用的設備(按鍵,蜂鳴器,led這些簡單的通用的設備都可以通過GPIO來連接)。我們也可以用GPIO來模擬一些協議(IIC協議,這樣就可以連接一些IIC設備,uart不行,uart有一個串並轉換過程)

GPIO是一個外設最主要的功能:通過MIO觀測【input】(按鍵按下,引腳上電平的變化,從而觀測到按鍵的狀態)控制【output】(控制引腳上的高低電平從而控制LED的亮滅) 54個引腳(provides software with observation and control of up to 54 device pins via the MIO module)【MIO是上圖GPIO左邊連接的】

MIO(多路復用I/O):PS端這邊除去DDR的固定引腳外只有54個引腳可用,但是外設和存儲器接口所需的引腳大於54,所以需要一個多路復用來完成這個功能,即通過MIO來實現。(例如現在PS只有兩個空閑的引腳,此時UART和IIC都想使用這個引腳,僧多粥少。讓 UART 和 IIC 都不要直接連接到引腳上面去,讓它們先連接到MIO上,再通過MIO來連接到外部的引腳上去。)【目的是:實際上UART 和 IIC 連接到MIO 是可以通過軟件編程的,用戶可以通過軟件去控制MIO來具體給哪個外設去使用,選擇哪一個外設來連接外部的引腳,達到多路復用的功能】

MIO功能:把來自PS外設和靜態存儲器接口的訪問給多路復用到器件的引腳上面去。

 

 

 

 

EMIO:(E是擴展的意思)   可以看到I/O外設可以通過MIO連接到PS的引腳,也可以通過EMIO連接到PL,連接到FPGA模塊上或者直接連接到FPGA的引腳上。

EMIO更主要的功能:可以擴展PS端的引腳。PS端54個引腳,不夠,我們可以通過EMIO 把 PL端的引腳來給 PS 使用。

  不是所以io外設都可以通過EMIO擴展引腳,GPIO是可以的。

 

 

每一個GPIO都是動態可編程的,每一個GPIO都可作為輸入,輸出,或中斷,軟件可以通過一個LOAD指令來讀取gpio在引腳上的值,也可以通過一個獨立的store指令把數據寫到器件的引腳上面去(輸出)。 

GPIO 基地址(base address)0XE000_A000。

 

 

 

 

 

 

 

 

 

 軟件通過 一組 存儲映射寄存器(memory-mapped registers)控制GPIO。

 

存儲映射:如果一個讀寫操作(會話)是存儲映射的,那么無論是讀操作還是寫操作,其都會給定一個地址,這個地址相當於是存儲空間里面的地址。即我們在進行讀寫操作的時候都要指定一個地址來說明這個讀寫操作具體的寄存器的位置,這種操作方式成為存儲映射。存儲是指操作對象位於存儲空間里,映射是在讀寫操作的同時要給定一個地址。

 

 

在實際編程中,我們不會獨立操作寄存器,而是調用一個個函數,了解GPIO寄存器目的:首先了解各個寄存器可以大致了解各個功能模塊底層驅動的原理,包括這些寄存器之間的關系。在了解底層的寄存器之后,我們的上層編寫代碼的時候才更有邏輯性一些(不了解這些底層的寄存器,編寫過程的一些操作就會不知所以然,都不知道函數是干什么用的)。

 

 

 

data_ro:寄存器不管GPIO是作為輸入還是作為輸出,一直反映GPIO引腳上的狀態。即使我們把GPIO設置成輸出來使用,data_ro仍然可以反應出當前引腳的狀態。 這個寄存器可以讓軟件去觀測器件引腳上的數值。該寄存器是只讀寄存器,往這里面寫數據是被忽略的。GPIO作為輸出時,該寄存器顯示期間引腳上的輸出值。【如果MIO沒有被配置成GPIO的引腳,那么該寄存器沒法顯示,就是用的UART或其他外設連引腳,沒用GPIO連】

 

DATA寄存器:作為輸出,我們可以往這里面寫數據,控制我們需要輸出到器件引腳的數值。(例如器件的引腳最終連接到led,那么通過往DATA寄存器里面寫1開燈,寫0關燈【這是抽象成1位的寄存器,實際上是32位的寄存器,相當於我們是一次性去操作一個32位的寄存器】)。  只有當GPIO被配置成輸出的時候,才可以控制輸出的數值。每次操作以32位為單位,不能單獨操作其中的某一位(后面講如何獨立的控制DATA寄存器中的某一位,從而控制器件上特定的某一個引腳)。   如果我們讀這個寄存器,它會返回上一次寫到這個寄存器里邊的數值,不會返回當前器件引腳的數值【如果我們想了解當前器件引腳什么狀態,我們可以通過讀DATA_RO寄存器】。

 

MASK_DATA_LSW寄存器(MASK 屏蔽【用mask這樣的數據去屏蔽某一些位】):用來屏蔽低16位。給軟件更多的選擇性,可以改變特定的輸出值。任何16位的組合都可以被寫到這個寄存器里邊去,沒有寫的那些位不會變,會保持先前的那些值。讀的話返回先前的值,不返回當前的值。  這個寄存器可以避免read_modify_write的過程對於不需要改變的值。    

  例如: DATA  :1010_0101_1010_0101 XXXX XXXX XXXX  XXXX 32位 A5A5XXXX  假設用這個數值控制16個led  亮滅亮滅——滅亮滅亮——~——~  如果我只想改變其中4個LED的狀態,其他不變。    MASK :1111_0000_1111_1111

     data    :0000_1010_0000_0000 只關心想改變的值,其他值都屏蔽掉了

每次需要往DATA寄存器里寫入32位的寄存器,當指向改變第8到第11位4個LED狀態時:  

  (1)先把DATA寄存器值讀出來  read

  (2)改變需要修改的數值      modify  1010_1010_1010_0101 XXXX XXXX XXXX  XXXX 

  (3)把改好的數據寫到DATA寄存器里  write

 用MASK 寄存器就可以避免 R-M-W過程。

 

 

MASK_DATA_MSW:用來屏蔽高16位。

  

 

DIRM寄存器:DIRECTION MODE(用來控制 I/O 作為輸入還是輸出)  DIRM[X]=0 那么關閉輸出驅動,此時作為輸出來使用。為1時使能輸出驅動。

 

OEN寄存器(OUTPUT ENABLE): 與DIRM類似的地方:只有當I/O被配置為輸出的時候,它才會控制輸出是否打開或是關閉。把DIRM配置為1配置為輸出,此時再由OEN控制是打開還是關閉輸出使能。當兩個寄存器同時配置為1,輸出使能信號才能打開,才能正常的輸出一個信號。

  區別 :DIRM:配置對應的I/O是作為輸入還是作為輸出。

      OEN:  打開或關閉輸出寄存器的使能,I/O配置成輸入這個就沒什么作用了

 

 

bank0的MIO[8],MIO[7] 是用來配置電壓模式的

MIO也是分組的 MIO 0~15分一組(bank 0),MIO 16~53分一組(bank 1)  用MIO[8]控制bank1電壓為多少。MIO[7]控制bank 0 電壓多少。 根據MIO bank的電壓 給輸入的值進行配置 0/1。

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM