使用單片機,不得不和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爲對應引腳置位後的二進制碼
使用^的好處是,只用一條語句便可保證在其他引腳狀態不改變的前提下,改變特定引腳輸出狀態。