開始第二課!
1 跑馬燈
對于學(xué)習(xí)單片機(jī)編程的人來說,“跑馬燈”這個詞再熟悉不過了,它基本是我們?nèi)腴T的第一個例子。
本章我們就以“跑馬燈”為例子,講解nRF51822軟件編程的第一課:GPIO。
開始前還要嘮叨一句,記得用nRFgo Studio擦除整個芯片哦,因?yàn)樵瓉沓鰪S有藍(lán)牙程序的,不擦除不能下新的程序。
1.1 nRF51822 AK board硬件介紹
1.1.1 AK board (PCA10001)的LED資源
AK board PCA10001上有兩個按鍵和五個用戶可編程的LED,它們被連接到nRF51822芯片的特定引腳上。請看 Table 1(或者開發(fā)板背面).
Part GPIO Short
Button0 P0.16
Button1 P0.17
LED 0 P0.18 SB6
LED 1 P0.19 SB7
LED 2 P0.20 SB8
LED 3 P0.21 SB9
LED 4 P0.22 SB10
Table 1 按鍵和 LED 連接
注意:此SB非彼SB,這里應(yīng)該是short bridge的意思。板子上的某些GPIO被連到了特點(diǎn)的設(shè)備上(比如用于串口),但是同時也通過插針引出來了,如果你不想使用板載的功能,可以手動割斷這個SB。
這里再賣個關(guān)子,nRF51822有個很牛X的功能,類似于FPGA,這顆芯片的任意一個引腳可以配置成任意一個功能。以后的課程中會提到。
1.1.2 AK board LED原理圖
按鍵是低電平有效的,就是說按下按鍵后,IO的輸入端會被連接到地。按鍵沒有外部的上拉電阻,所以如果要使用P0.16 和 P0.17 引腳上的兩個按鍵,需要使能引腳的內(nèi)部上拉電阻。
LED是高電平有效的,就是說寫一個邏輯的 (‘1’) 到相應(yīng)的輸出引腳,將點(diǎn)亮LED。
可能了解電子的朋友看到下面這個圖都會問:為什么是“共陰極”設(shè)計(jì),而不是一般的“共陽極”設(shè)計(jì)呢?
其實(shí)因?yàn)槲覀儗W(xué)習(xí)的這顆nRF51822芯片最大的一個特性就是低功耗,而這種低功耗必定是芯片經(jīng)常處于“睡眠”狀態(tài)。在“睡眠”狀態(tài)下,引腳電平都是低,LED只有設(shè)計(jì)成“共陰極”設(shè)計(jì)才能更省電。
1.1.3 AK board (PCA10001)LED三維圖
1.2.1 nRF51822的GPIO框圖
1.3.1 nRF51822的GPIO寄存器簡介
Register Offset Description
保留 0x000 保留位[321]
OUT 0x504 寫GPIO端口,bit0對應(yīng)pin0,bit1對應(yīng)pin1...
OUTSET 0x508 set單一GPIO端口,寫“1”到0x00只能將pin0拉高,對其他pin無效
OUTCLR 0x50C clear單一GPIO端口,寫“1”到0x00只能將pin0拉低,對其他pin無效
IN 0x510 讀GPIO端口,bit0對應(yīng)pin0,bit1對應(yīng)pin1...
DIR 0x514 設(shè)置GPIO端口方向,類同于OUT
DIRSET 0x518 設(shè)置GPIO端口方向,類同于OUTSET
DIRCLR 0x51C 設(shè)置GPIO端口方向,類同于OUTCLR
保留 0x520 保留位[120]
PIN_CNF[0] 0x700 pin0的配置,詳見后續(xù)內(nèi)容
....
PIN_CNF[31] 0x77C pin31的配置,詳見后續(xù)內(nèi)容
1.3.3 GPIO的PIN_CNF[x]寄存器簡介
ID Field Description
A DIR 設(shè)置pin[x]的方向,與DIR(0x514)等寄存器關(guān)聯(lián),修改其中一個另外一個自動改變
B INPUT 設(shè)置pin[x]的INPUT緩沖,為了省電可以寫“1”斷開緩沖,但是使用前必須寫“0”連接上
C PULL 設(shè)置pin[x]的上下拉電阻,使用標(biāo)準(zhǔn)值為13kΩ的內(nèi)部電阻
D DRIVE 設(shè)置pin[x]的驅(qū)動強(qiáng)度,std. drive, 0.5 mA,high-drive, 5 mA
E DRIVE 設(shè)置pin[x]的電平感知,寫“1”感知高電平,寫“0”感知低電平
1.4 官方blink代碼樣例
使用官方例程即可點(diǎn)亮LED0和LED1的blink程序(安裝SDK后,源代碼位于<keil path>\ARM\Device\Nordic\nRF51822\Board\PCA10001\blinky_example\)
main函數(shù)請看:
- int main(void)
- {
- uint8_t output_state = 0;
- // Configure LED-pins as outputs
- // 設(shè)置LED_START到LED_STOP的引腳為輸出
- nrf_gpio_range_cfg_output(LED_START, LED_STOP);
- while(true)
- {
- // 點(diǎn)亮LED
- nrf_gpio_port_write(LED_PORT, 1 << (output_state + LED_OFFSET));
- output_state = (output_state + 1) & BLINKY_STATE_MASK;
- nrf_delay_ms(100);
- }
- }
相關(guān)宏定義位于頭文件"pca10001.h"內(nèi):
- #ifndef PCA10001_H
- #define PCA10001_H
- #define LED_START 18
- #define LED0 18
- #define LED_STOP 19
- #define LED1 19
- #define LED_PORT NRF_GPIO_PORT_SELECT_PORT2
- #define LED_OFFSET 2
- #define BUTTON_START 16
- #define BUTTON0 16
- #define BUTTON_STOP 17
- #define BUTTON1 17
- #define RX_PIN_NUMBER 11
- #define TX_PIN_NUMBER 9
- #define CTS_PIN_NUMBER 10
- #define RTS_PIN_NUMBER 8
- #define HWFC true
- #define BLINKY_STATE_MASK 0x01
- #endif
1.5 編譯、下載與演示
1. 在Keil μVision中打開 Blinky 工程, 或者 雙擊blinky.uvproj 文件。
2. 從 Select Target 下拉列表中選擇 nRF51822_xxaa(256K),然后點(diǎn)擊Build 或者按鍵盤上的F7編譯 Blinky 工程。
3. 點(diǎn)擊Load 圖標(biāo), 下載并運(yùn)行 Blinky 演示程序。 LED 0 和 LED 1 應(yīng)該開始連續(xù)的閃爍了。
|
|