版權聲明:本文為博主原創文章,轉載請注明作者和出處。 作者:強光手電[艾克姆科技-無線事業部]
1. nRF51822寄存器類型
nRF51822的寄存器和一般的單片機有所差別,nRF51822的寄存器分為下面的三種類型。
- Task :任務寄存器,可以由程序或事件觸發。
- Event:事件寄存器,事件可以產生中斷或觸發任務。
- Register:普通寄存器,和一般單片機的寄存器一樣。
Task和event使得操作片上外設十分方便簡潔,只需進行少量的配置,即可輕松運用各種外設。同時,Task和event能有效減少CPU的占用時間,降低CPU的負荷。
Task和Event更多的是用來和PPI(可編程外設互連)配合使用,通過PPI 將某個Event和Task連接起來,連接后,該Event即可觸發對應的Task執行相應的功能。
示例:實現每隔1S翻轉一次指示燈的狀態。
- 一般的做法:配置定時器定時時間為1S,每秒產生一次中斷,在中斷服務程序中通過軟件操作翻轉指示燈的狀態。在這個過程中,必須要通過軟件操作才能實現。
- 通過Task和Event實現:配置定時器的相關參數,配置GPIOTE的Task為翻轉管腳狀態,配置PPI的一個通道用於連接定時器的匹配事件和GPIOTE的Task。這樣,當定時器產生匹配事件時,會自動觸發GPIOTE的Task,在無需任何軟件干預的情況下實現指示燈狀態的翻轉。
2. GPIOTE(GPIO Tasks and Events)
2.1 功能描述
nRF51822在GPIO的基礎上引入了任務和事件(GPIOTE)的概念,nRF51822的GPIOTE共有4個通道,每個通道都可以選擇一個管腳,選擇的管腳可以配置為Task mode或Event mode。需要注意的是:不能將某個管腳同時分配給多個GPIOTE通道,否則會導致無法預料的錯誤。
GPIOTE通道的Task可以用來執行以下寫操作:
- 置位。
- 清除。
- 翻轉。
事件可以由以下的輸入狀態產生:
- 上升沿。
- 下降沿。
- 任意電平跳變。
2.1.1 管腳Tasks和Events
Tasks和Events通過CONFIG[n](n=0~3)配置,每個CONFIG[n]寄存器對應一組OUT[n] 任務寄存器和IN[n]事件寄存器。OUT[n]用於寫管腳,IN[n]由管腳狀態變化觸發。
當把某個管腳分配給OUT[n]任務或IN[n]事件后,該管腳就只能被GPIOTE模塊寫操作,正常的GPIO寫入無效。
一旦配置OUT[n]任務或IN[n]事件控制某個管腳,那么該管腳的輸出值只能通過GPIOTE模塊操作,使用GPIO的寄存器操作會被忽略。
當GPIOTE通道被配置用於操作一個任務管腳時,CONFIG[n]寄存器中的OUTINIT決定了該管腳腳的初始值。可以通過配置OUTINIT來設置管腳初始化狀態為高電平或是低電平。
2.1.2 PORT事件
GPIOTE除了4個通道外,還包含一個PORT事件。PORT事件由使用GPIO DETECT信號的多個管腳觸發,PORT中的任意一個管腳上的上升沿都會觸發PORT事件。
可以設置一個或多個GPIO DETECT用來產生PORT事件,PORT事件可以作為喚醒源,也可以作為中斷源產生中斷。
3. 按鍵實驗程序
本實驗使用的程序是:nrf51-app-button-example-master。
3.1 運行環境
- 編譯環境:MDK5。
- SDK版本:SDK 8.0.0
3.2 按鍵檢測原理
程序中對按鍵的處理如下:通過GPIOTE的PORT事件來檢測有無按鍵按下,當檢查到按鍵按下時,啟動定時器開始計時(程序中設置的位50ms),在定時器超時中斷中若檢測到該按鍵仍然為按下的狀態,則認為這是一個有效的按鍵。在這里使用定時器(軟件定時器)是為了消除按鍵抖動。
圖1:按鍵檢測和消抖
若在第一個按鍵檢測流程沒有處理完時(該按鍵的定時器還在運行),又有一個按鍵按下,這時,定時器會重新開始計時,如下圖所示。
圖2:多個按鍵處理
3.3 程序下載和驗證
3.3.1 程序下載
本實驗無需下載協議棧,如果開發板中已經下載了協議棧,需要通過nRF STUDIO進行擦除。
程序可以用nRFgo Studio下載,也可以在MDK中直接下載調試,在這里我們用nRFgo Studio下載。切換到“Program Application”選項卡。點擊“Browse…”按鈕打開應用程序的HEX文件(位於“…\ nrf51-app-button-example-master\pca10028 \arm5\_build”目錄下的 GPIOTE_BUTTON.hex)。點擊“Program”下載程序。
3.3.2 實驗現象
分別按下S1~S4按鍵,每按一次,對應的指示燈(D1~D4)狀態會翻轉一次。