時間在2023年2月2日,寒假放假在家好好學一學nrf52840
這幾天去醫院看病了,結果白跑,不過花錢買個心安也行
還有看了兩三天的**,美滋滋
開發板:初雪的100出頭那塊 nrf52840 eval kit
版本號: keil5程式設計環境,cmsis為5.3.0, nrf52840的cmsis為8.35.0
參考資料: nrf52840-eval-kit-schematic.pdf(原理圖)
nrf5_sdk_17.0.2_d674dde(官方例程)
nrf5_sdk_17.0.0_offline_doc(官方文件)
nrf52840_ps_v1.1.pdf(官方資料手冊)
實現功能:
1.ppi 介紹
ppi與dma差不多,不需要cpu干涉進行資料交換,搬完資料告訴cpu一聲(產生中斷)
ppi需要設定兩端才能用
ppi的兩端一端連線的是事件端點(eep),一端連線的是任務端點(tep)。因此 ppi 可以通過乙個外設上發生的事件自動的觸發另乙個外設上的任務。比如定時器觸發led進行翻轉
ppi 一共是 32 個通道,編號為 0~31,其中通道 20~31 通道,一共12 個為固定通道,也稱為預程式設計通道;通道 0~19 通道,一共 20 個為可程式設計通道,可程式設計通道可以通過程式配置事件終點和任務終點。
圖為固定通道,不能占用,功能已被固定(定時器,2.4g,rtc為32.768k晶振的實時計數器,不是實時時鐘)
2.fork 從任務機制:(tep終點,比如觸發作為翻轉led的)
fork 機制也稱為從任務機制。每個任務終點tep 都實現了乙個 fork 機制,可以在觸發任務終點tep 中指定的任務的同時觸發第二個任務。
3.group 分組機制:
ppi 通道可以進行分組,多個 ppi 通道可以分為一組,那麼該組內的 ppi 通道就可以統一進行管理,同時開啟或者關閉 group 內所有的 ppi 通道。
下面為gpiote中斷ppi應用:
ppi 作為觸發通道,兩端分別連線任務和事件,通過任務來觸發事件的發生,可以不通過 cpu進行處理,大大的節省了系統資源。
新增驅動檔案
大概在..\..\..\..\..\..\integration\nrfx\legacy\nrf_drv_ppi.c
在移植ppi的sdk_config
新增標頭檔案呼叫ppi
#include "nrf_drv_ppi.h"
按鍵配置**: (輸入事件)
nrf_drv_gpiote_in_config_t key_ex_config ; //按鍵中斷配置用
key_ex_config.hi_accuracy=true; //true使用輸入事件
key_ex_config.pull = nrf_gpio_pin_pullup ; //上啦
key_ex_config.sense = nrf_gpiote_polarity_toggle ;//下降沿
nrf_drv_gpiote_in_init(key0, &key_ex_config, null); //無中斷函式
nrf_drv_gpiote_in_event_enable(key0, true);//配置輸入事件使能
led配置**: (輸出任務)
nrf_drv_gpiote_init();//啟動gpiote時鐘,可以這麼說
nrf_drv_gpiote_out_config_t out_config ; //輸出任務
out_config.init_state = nrf_gpiote_initial_value_high ;// led狀態從1->0
out_config.task_pin = true; // 引腳由gpiote控制
out_config.action = nrf_gpiote_polarity_toggle ;
nrf_drv_gpiote_out_init(led3, &out_config);//繫結輸出埠
nrf_drv_gpiote_out_task_enable(led3); //使能led任務
下面初始化ppi模組: 繫結事件輸入和任務輸出
來乙個ppi通道配置變數
nrf_ppi_channel_t my_ppi_channel; //我的ppi通道
然後配置ppi
nrf_drv_ppi_init();//開啟ppi時鐘
nrfx_ppi_channel_alloc(&my_ppi_channel);//分配乙個ppi的通道
nrfx_ppi_channel_assign(my_ppi_channel, //繫結ppi事件輸入位址, 任務輸出位址
nrfx_gpiote_in_event_addr_get(key0),
nrfx_gpiote_out_task_addr_get(led3));
nrfx_ppi_channel_enable(my_ppi_channel);//使能ppi通道
完整**
#include #include #include "nrf_delay.h"
#include "nrf_gpio.h"
#include "nrf_drv_gpiote.h"
#include "nrf_uart.h"
#include "nrf_drv_timer.h"
#include "nrf_drv_ppi.h"
#include "nrfx_ppi.h"
uint32_t led0,led1,led2,led3;
uint32_t key0,key1,key2,key3;
nrf_ppi_channel_t my_ppi_channel; //我的ppi通道
int main(void)
}
後面看了一下 fork 和 group 都沒怎麼用到過, 所以就不學了 NRF52840的學習之路(三)
nrf sdh enable request需要選擇藍芽協議棧的低頻時鐘 由於藍芽協議棧的高頻時鐘必須為外部32m晶振,所以高頻時鐘無需配置 但協議棧需要這個低速晶振,需要配置成內部晶振,而低頻時鐘可以選擇為內部32k rc或者外部32k晶振 在sdk.config.件裡面設定巨集,設定如下 當選擇...
nRF52840(二)新建工程
本文旨在以盡可能減少操作的情況下,快速建立nrf52840晶元的工程。既然是要快速完成,就要堅持拿來主義,把官方提供的sdk盡可能完整的搬運過來,然後根據自己的使用做修改,這裡我選用的是從機藍芽串列埠服務的例程進行移植。driver兩個路徑,並在debug選項下配置除錯方式 注意調成swd,以及復位...
nRF52840晶元全面支援藍芽 5 0
隨著藍芽版本的不斷更新,大部分使用者都傾向於藍芽5.0。2018年3月28日,nordic semiconductor發布了nrf52840低功耗藍芽系統級晶元 soc 產品,這是同級領先的nrf52系列藍芽5認證系統級晶元,目前可批量提供。對於nordic剛推出的藍芽5.0 nrf52840,很多...