PPI

1.PPI的作用:提供一个硬件通道,连接事件和任务。当事件触发时,不需要cpu的参与,硬件自行完成任务的驱动。
2.PPI通道:1.EEP:事件端点(1个)2.TEP:任务端点(2个,主任务+从任务)
3.PPI共有32个PPI通道(0~31),其中有12已经被预编译(20~31),其他由用户自主编程。预编译的通道也可进行分组,使用和禁止。
4.每一个PPI通道的信号都被同步到16M的时钟上。
5.nrf52832共有6个PPI分组(CHG(0)~CHG(5))

PPI常用函数

1.PPI初始阿化函数:nrf_drv_ppi_init(void)
2.PPI通道申请函数:nrfx_ppi_channel_alloc(nrf_ppi_channel* channel)
3.PPI通道配置函数:nrfx_ppi_channel_assign(channel,eep,tep)
4.PPI通道次级任务配置函数:nrfx_ppi_channel_fork_assgin(channel,ftep)
5.PPI通道使能函数:nrfx_ppi_channel_enable(channel)
6.PPI组申请函数:nrfx_ppi_group_alloc(p_group)
7.PPI组通道使能函数:nrfx_ppi_group_enable(group)
8.PPI加入通道组函数:nrfx_ppi_channel_include_in_group(channel,group)
9.多个PPI通道加入组函数:nrfx_ppi_channels_include_in_group(mask,group)

PPI示例程序

通道组只是提供一种方式管理控制多个ppi通道的方式而已(去除不影响)
#include <stdbool.h>
#include <stdint.h>
#include "nrf_delay.h"
#include "boards.h"#include "nrf_log.h"
#include "nrf_log_ctrl.h"
#include "nrf_log_default_backends.h"#include "nrf_drv_gpiote.h"
#include "nrf_drv_ppi.h"//定义ppi通道
nrf_ppi_channel_t ppi_channel_1;
nrf_ppi_channel_t ppi_channel_2;
//定义ppi通道组
nrf_ppi_channel_group_t ppi_group;static void log_init(void)
{ret_code_t err = NRF_LOG_INIT(NULL);APP_ERROR_CHECK(err);NRF_LOG_DEFAULT_BACKENDS_INIT();
}/*** ppi通道初始化函数*/
void ppi_config(void)
{uint32_t err = NRF_SUCCESS;err = nrf_drv_ppi_init();                                 //ppi通道初始化配置APP_ERROR_CHECK(err);/* ppi通道1 */err = nrf_drv_ppi_channel_alloc(&ppi_channel_1);          //申请ppi通道,系统自动配置APP_ERROR_CHECK(err);/* 主任务 */err = nrfx_ppi_channel_assign(ppi_channel_1,nrfx_gpiote_in_event_addr_get(13),nrfx_gpiote_out_task_addr_get(17));                                                         APP_ERROR_CHECK(err);                                       //使用ppi通道连接事件和任务/* 次级任务 */err = nrfx_ppi_channel_fork_assign(ppi_channel_1,nrfx_gpiote_out_task_addr_get(18));APP_ERROR_CHECK(err);                                        //使用ppi通道连接次级任务err = nrfx_ppi_channel_enable(ppi_channel_1);               //使能ppi通道APP_ERROR_CHECK(err);/* ppi通道2 */err = nrf_drv_ppi_channel_alloc(&ppi_channel_2);         //申请ppi通道,系统自动配置APP_ERROR_CHECK(err);err = nrfx_ppi_channel_assign(ppi_channel_2,nrfx_gpiote_in_event_addr_get(14),nrfx_gpiote_out_task_addr_get(17));                                                          APP_ERROR_CHECK(err);                                       //使用ppi通道连接事件和任务err = nrfx_ppi_channel_enable(ppi_channel_2);              //使能ppi通道APP_ERROR_CHECK(err);/* ppi通道组 */err = nrfx_ppi_group_alloc(&ppi_group);                              //申请ppi通道组APP_ERROR_CHECK(err);err = nrfx_ppi_channel_include_in_group(ppi_channel_1,ppi_group);   //将通道1加入通道组中//nrfx_ppi_channels_include_in_group()这个函数是多个ppi通道加入PPI组,注意区分(channel有无带s)APP_ERROR_CHECK(err);err = nrfx_ppi_channel_include_in_group(ppi_channel_2,ppi_group);  //将通道2加入通道组中APP_ERROR_CHECK(err);err = nrfx_ppi_group_enable(ppi_group);                               //使能ppi通道组APP_ERROR_CHECK(err);
}int main(void)
{log_init();//gpiote初始化ret_code_t err;err = nrf_drv_gpiote_init();                                                         //只能初始化一次(共享资源)//输出任务APP_ERROR_CHECK(err);nrf_drv_gpiote_out_config_t task_config = GPIOTE_CONFIG_OUT_TASK_TOGGLE(true);         //定义gpiote电平翻转任务结构体/* 主任务 */err = nrf_drv_gpiote_out_init(17,&task_config);                                            //配置gpiote引脚17APP_ERROR_CHECK(err);nrf_drv_gpiote_out_task_enable(17);                                                      //gpiote任务使能/* 次级任务 */err = nrf_drv_gpiote_out_init(18,&task_config);                                          //配置gpiote引脚18APP_ERROR_CHECK(err);nrf_drv_gpiote_out_task_enable(18);                                                      //gpiote任务使能//输入事件nrf_drv_gpiote_in_config_t    event_config = GPIOTE_CONFIG_IN_SENSE_HITOLO(true);            //设置为下降沿模式触发,配置为port事件时为falseevent_config.pull = NRF_GPIO_PIN_PULLUP;                                               //设置gpio为上拉模式/* 事件1 */err = nrf_drv_gpiote_in_init(13,&event_config,NULL);                                 //使用ppi通道连接事件和任务,不需要创建事件回调函数APP_ERROR_CHECK(err);nrf_drv_gpiote_in_event_enable(13,true);                                                //gpiote事件使能/* 事件2 */err = nrf_drv_gpiote_in_init(14,&event_config,NULL);                                  //使用ppi通道连接事件和任务,不需要创建事件回调函数APP_ERROR_CHECK(err);nrf_drv_gpiote_in_event_enable(14,true);                                                //gpiote事件使能ppi_config();                                                                           //ppi通道初始化nrf_gpio_cfg_input(15,NRF_GPIO_PIN_PULLUP);                                               //设置gpio输入模式,作为ppi组的开关nrf_gpio_cfg_input(16,NRF_GPIO_PIN_PULLUP);NRF_LOG_INFO("GPIOTE example started");NRF_LOG_FLUSH();while(1){if(nrf_gpio_pin_read(15) == 0){nrf_delay_ms(10);if(nrf_gpio_pin_read(15) == 0)nrfx_ppi_group_enable(ppi_group);}else if(nrf_gpio_pin_read(16) == 0){nrf_delay_ms(10);if(nrf_gpio_pin_read(16) == 0)nrfx_ppi_group_disable(ppi_group);}    }
}

六、nrf52832的PPI(可编程外设互联)相关推荐

  1. oracle过滤器基础,Oracle培训(四十六)——Servlet第六章知识点总结——过滤器编程...

    Oracle培训(四十六)--Servlet第六章知识点总结--过滤器编程 目标 编写一个过滤器 部署一个过滤器 了解请求和响应包装器 在请求分发器下的过滤器 知识点预览 过滤器 过滤器 1. 什么是 ...

  2. Python可以这样学(第六季:SQLite数据库编程)-董付国-专题视频课程

    Python可以这样学(第六季:SQLite数据库编程)-1344人已学习 课程介绍         董付国老师系列教材<Python程序设计(第2版)>(ISBN:97873024365 ...

  3. C++ Primer Plus 第六版 所有章节课后编程练习答案

    我的独立博客地址:www.blog4jimmy.com,欢迎大家关注 下面的是C++ Primer Plus 第六版所有章节的课后编程练习的答案,都是博主自己写的,有不对的地方请大家留言指出讨论讨论 ...

  4. 《C Prime Plus》(第六版) 第03章 编程练习 7 英寸转换成厘米

    C Prime Plus 第六版 编译器版本:Mac Xcode 11.6  第03章 数据和C 编程练习 7 7. 1英寸相当于2.54厘米.编写一个程序,提示用户输入身高(/英寸),然后以厘米为单 ...

  5. 雷鸣的游戏人生(六) --- 如何开始学习编程?

        雷鸣的游戏人生(六) --- 如何从开始学习编程(到放弃)?     前5篇文章算是前情交代和试水,不过鉴于大家的反馈,我觉得每篇文章还是提出一个问题解决一个问题会对大家帮助更大,同样的大家也 ...

  6. 《C Prime Plus》(第六版) 第03章 编程练习 8 品脱/盎司/大汤勺/茶勺单位换算

    C Prime Plus 第六版 编译器版本:Mac Xcode 11.6  第03章 数据和C 编程练习 8 在美国的体积测量系统中,1品脱等于2杯,1杯等于8盎司,1盎司等于2大汤勺,1大汤勺等于 ...

  7. 多比矢量图开发手册(六)-Web高级图元编程

    2019独角兽企业重金招聘Python工程师标准>>> 多比矢量图高级图元编程 自定义图元的可编辑属性 自定义数据对象是顶点或连线表示的后台数据.它可以是图形和形状相关的数据,也可以 ...

  8. (一二六)第十一章编程练习

    这是我创建的专辑,所有学习笔记都以word格式上传,放在里面,相对更美观和直接.欢迎下载浏览. http://download.csdn.net/album/detail/2971 1.修改程序清单1 ...

  9. 数据结构(六)散列查找 —— 编程作业01 :电话聊天狂人

    数据结构系列内容的学习目录→\rightarrow→浙大版数据结构学习系列内容汇总.   题目描述: 给定大量手机用户通话记录,找出其中通话次数最多的聊天狂人.   输入格式: 输入首先给出正整数N( ...

最新文章

  1. git ignore linux,为什么说.gitignore不能忽视
  2. python获取数据库用户名密码_在数据库中存储用户和密码
  3. JQuery - Sizzle选择器引擎原理分析
  4. Zabbix 2.4.5 自定义 key 监控 apache
  5. [Share].NET Reflector Add-Ins
  6. mysql union group by_Mysql UNION和GROUP BY
  7. 我的第一个可用的Windows驱动完成了
  8. 从相识到相惜:Redis与计算存储分离四部曲
  9. 车主吐槽某电动车保养割韭菜,却遭其总裁公开恐吓?车主:必须视频道歉
  10. oracle表空间总结,Oracle操作用户和表空间的总结
  11. js金额千分位显示_JavaScript 格式化数字、金额、千分位、保留几位小数
  12. 【SQL】结构化查询语言
  13. 安卓项目连接后台服务器,android云后端服务器
  14. arcgis怎么压缩tif文件_PDF文件怎么进行压缩?教你两招!
  15. 修改app名称后,分享到微信的app名称无变化问题
  16. 【网络攻防技术】实验九——嗅探与欺骗实验
  17. 苹果新专利:紧急情况下可用指纹或特定输入操作悄悄呼救
  18. erp框架 saas_基于SAAS的中小纺织加工企业ERP系统
  19. 澳洲移民监 盘点一下各国的移民监要求
  20. To Be Better |这个冬天,与CDA一起游学北卡罗莱纳州立大学(NCSU)

热门文章

  1. 红米3 android 版本,红米3四款手机有什么不同?红米3系列手机各版本区别详解
  2. 手机APP对接支付功能总结
  3. 当前计算机技术的发展趋势,当前计算机技术与gis发展趋势
  4. 浮点数的表示范围 规格化和非规格化
  5. 如何删除旧网卡驱动,释放旧网卡的配置
  6. 用户角色权限功能实现
  7. 如何利用手机实现中日翻译在线
  8. android svg 线条动画教程,SVG之旅:SVG线条动画实现原理
  9. 计算机作业批改反思,作业批改的反思
  10. 目前Java开发前景还好吗 Java工资待遇怎么样