GPIO口的靈活操作

使用單片機,不得不和GPIO打交道。可以說是GPIO是操作單片機的重點之一。常用單片機機型都提供類似於STM32的固件庫函數包括對GPIO的操作。但這並不意味着對GPIO的控制寄存器的底層操作不用瞭解,下面我說明兩款常用的芯片nrf52832和STM32的GPIO引腳的操作。

這裏首先要明白GPIO和其他片內外(例如定時器,片內FLASH等)是一樣的,同樣是通過總線與內核連接,並不屬於內核.

首先是nrf52832:

NRF52832是我最近才接觸的,不過它的GPIO控制配置寄存器比STM32更加簡單,直接,明瞭。所以此處先介紹,

NRF52832總共一個端口也就是port,可通過32個外部引腳訪問。其配置寄存器包括:

1.輸出配置寄存器OUT

      此寄存器共32位用來爲32個引腳配置輸出狀態(高低),寫1高,寫0低。

2.輸出置位寄存器outset

      此寄存器用來對32引腳進行置位,也就是輸出1進行設置,對應爲寫1,則該引腳輸出高電平,寫0無效

3.輸出清除寄存器outclr

      此寄存器用來對32個引腳進行清除,也就是輸出0進行設置,對應爲寫1,則該引腳輸出低電平,寫0無效

      123寄存器都是對輸出電平的控制,23只是對1的詳細控制。

4.輸入寄存器

      輸入寄存器存儲32個引腳的輸入狀態(配置爲輸入的引腳),只讀。

5. 方向寄存器

      該寄存器控制32個引腳輸入還是輸出,對應位爲1是,引腳配置爲輸出。爲0時引腳配置成輸入。

6.方向置位寄存器

      向該寄存器引腳對應位寫1,則該引腳被配置爲輸出,寫0無效

7.方向清除寄存器

      向該寄存器引腳對應位寫1,則該引腳被配置爲輸入,寫0無效

      67寄存器同5寄存器的作用相同,只是更加詳細的控制。

8.引腳配置寄存器(共32個,各引腳對應一個本身的配置寄存器)

      該寄存器對對應引腳的配置,做出初始化。包括方向(輸入還是輸出,該位同方向寄存器是相同的物理寄存器)

是否打開輸入緩衝區。上拉下拉配置,輸出標準配置,感應配置。

 

stm32的GPIO:

STM32的GPIO同樣和上面的NRF52830擁有同樣功能的寄存器,只不過其名稱可能不同。(爲了節省空間,是STM32的一些寄存器可能位置方面比較混亂,必將32是一款IO口衆多的芯片)

STM32的GPIO口比較多,但每16個引腳被組織爲一個端口。這裏拿一個端口進行說明:

1.端口配置低位寄存器

   寄存器共32位,每兩位控制一個引腳的輸入輸出模式配置,所以分高位低位寄存器

2.端口配置高位寄存器

    同上

3.端口輸入數據寄存器

    寄存器(低16位)存儲對應引腳的輸入狀態

4.端口輸出數據寄存器

    寄存器(低16位)位置1對應引腳輸出高電平。寫0輸出低電平

5.端口設置/清除寄存器

    高16位用來清除引腳輸出值,寫1對應引腳輸出低電平,寫0無效

    低16位用來置位引腳輸出值,寫1對應引腳輸出高電平,寫0無效

    注意:同時使用高16位與低16時,高16無效

6.端口清除寄存器

    寄存器低16位用來清除引腳輸出值,寫1對應引腳輸出低電平,寫0無效

    此寄存器是爲解決5寄存器不能同時使用32位設計

使用上述寄存器可對GPIO進行簡單的高低電平控制

單個引腳輸出高電平:可用端口置位寄存器

單個引腳輸出低電平:用端口清除寄存器

多個引腳輸出:用輸出數據寄存器

若想翻轉輸出,最好使用異或操作控制輸出數據寄存器。例如

NRF_GPIO->OUT ^=  leds_mask

led_mask爲對應引腳置位後的二進制碼

使用^的好處是,只用一條語句便可保證在其他引腳狀態不改變的前提下,改變特定引腳輸出狀態。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章