NRF52840學習歷程 五 PPI模組

2021-10-18 17:20:23 字數 3216 閱讀 8936

時間在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,很多...