nrf51822裸機教程 GPIO

2021-07-25 19:33:08 字數 2437 閱讀 9657

首先看看一下相關的暫存器說明

out暫存器 輸出設定暫存器

每個位元按順序對應每個引腳,bit0對應的就是 引腳0

該暫存器用來設定 引腳作為輸出的時候的 輸出電平為高還是低。

與輸出設定相關的 還有另外兩個暫存器

outset和outclr

outset用來設定某個引腳的輸出為高電平

outclr用來設定某個引腳的輸出為低電平

這兩個暫存器同out暫存器一樣 每個位按順序對應每個引腳。但有個特別的地方在於outset和outclr兩個暫存器的每個bit都是寫1有效,寫0無效。

比如在引腳都被設定為輸出的情況下:

將outset賦值為0x03那麼引腳0和引腳1將輸出高電平,其他引腳不收影響(輸出電平不變)

將outclr賦值為0x80那麼引腳7將輸出低電平,其他引腳電平不收影響。

這樣的特性也是為什麼有設設定輸出的暫存器 out後還要引入outset和outclr暫存器的原因。

比如你需要將引腳3的輸出電平設定為高,那麼如果只有out暫存器的情況下,你需要先讀出out暫存器然後修改值再寫會。原因在於你只需要修改引腳2而不需要改變其他引腳的狀態

a = out;

a |= 0x04;

out = a;

但是有outset暫存器的話就和方便,只需要outset = 0x04就可以設定引腳2輸出高電平同時不改變其他引腳的狀態。

同樣要單獨設定某個引腳輸出低電平時用outclr暫存器就可以了

dir暫存器用來設定引腳是作為輸入引腳還是輸出引腳

如上的輸出控制暫存器,dir 同樣也有兩個單獨設定輸入還是輸入的暫存器dirset和dirclr

作用和上面說的也是一樣,這裡不贅述

最後剩下 pin_cnf暫存器。 每個引腳都有其對應的 pin_cnf暫存器。

主要是設定一些 更具體的設定。像是最為輸入時的是否有上拉/下拉電阻。驅動的強度(我都是直接用s0s1,沒有單獨測試每個強度的區別),以及引腳作為輸入時設定的 input buffer。

有乙個比較特殊的設定是sense,這個是乙個深度睡眠喚醒機制。

深度睡眠時普通的中斷是無法將處理器從睡眠狀態喚醒的。51822從深度睡眠狀態喚醒可以通過 pin_cnf 中的這個sense來設定某個引腳可以產生detect signal來作為深度睡眠喚醒引腳。(另外的喚醒方式還有lpcomp模組產生的anadetect signal 以及復位)

比如,將pin_cnf[4]暫存器設定為輸入腳,並且其中的sense位的值設定3,那麼引腳4就作為深度睡眠的喚醒腳,並且在引腳4的電平變為低的時候就會將處理器從深度睡眠狀態中喚醒。

如果只是簡單的設定乙個引腳作為輸入可以直接使用dir相關的函式設定某個引腳作為輸出就可以了

比如如下實現

//pin_num從0開始

void config_pin_output(uint8_t pin_num)

}如果是設定引腳作為輸入引腳需要設定pin_cnf暫存器。

比如只是設定某個引腳作為簡單的輸入功能。

void config_pin_input(uint8_t pin_num)

}nordic 的sdk中提供了很多gpio相關的設定函式,均在nrf_gpio.h標頭檔案中以內聯函式形式定義了。

我是用的開發工具是keil5,用的sdk是9.0.下面演示建立乙個nrf51的工程的步驟

選擇keil中的project->new project

選擇你的裝置對應的晶元。我的板子是 51422_xxac的

之後會彈出如下介面。

這裡我們只是寫乙個很簡單的按鍵點燈程式,沒有用到sdk中提供的其他相關工程。所以下面勾選乙個cmsis下的core,device下的startup,以及nrf_drivers下的nrf_gpio就行了。這樣工程就會自動新增裝置的 .s啟動檔案以及相關配置

如果需要的話,可以設定工程產生  .hex

之後工程結構如下:

然後新建檔案 main.c 編寫如下**

#include "nrf_gpio.h"

//定義自己板子上的 按鍵 和 led燈 的引腳

#define button_pin      17

#define led_pin               21

int main(void)else

}return 0;

}

nrf51822 廣播間隔

1.目的 設定廣播間隔,已達到乙個功耗最佳的狀態 2.分析 廣播間隔,指每次藍芽廣播之間的間隔,間隔越大功耗越低,間隔越小功耗越大 3.平台 協議棧版本 sdk10.0.0 編譯軟體 keil 5.14 硬體平台 nrf51822最小系統 4.步驟 在main.c static void adver...

nrf51822 修改藍芽名字

1.目的 修改藍芽的名字 2.分析 藍芽名字最長設定為20個位元組,超過20個位元組為無效 3.平台 協議棧版本 sdk10.0.0 編譯軟體 keil 5.14 硬體平台 nrf51822最小系統 4.步驟 首先,要知道設定名字的api 在ble gap.h brief set gap devic...

nrf51822 設定傳送功率

1.目的 設定藍芽傳送功率,達到省電的目的 2.分析 實際應用當中,時常需要需改藍芽的發射功率,以達到省電的目的。在nrf51822中可以設定為9個發射等級,分別是 40,30,20,16,12,8,4,0,和4 dbm 3.平台 協議棧版本 sdk10.0.0 編譯軟體 keil 5.14 硬體平...