六、nrf52832的PPI(可编程外设互联)
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(可编程外设互联)相关推荐
- oracle过滤器基础,Oracle培训(四十六)——Servlet第六章知识点总结——过滤器编程...
Oracle培训(四十六)--Servlet第六章知识点总结--过滤器编程 目标 编写一个过滤器 部署一个过滤器 了解请求和响应包装器 在请求分发器下的过滤器 知识点预览 过滤器 过滤器 1. 什么是 ...
- Python可以这样学(第六季:SQLite数据库编程)-董付国-专题视频课程
Python可以这样学(第六季:SQLite数据库编程)-1344人已学习 课程介绍 董付国老师系列教材<Python程序设计(第2版)>(ISBN:97873024365 ...
- C++ Primer Plus 第六版 所有章节课后编程练习答案
我的独立博客地址:www.blog4jimmy.com,欢迎大家关注 下面的是C++ Primer Plus 第六版所有章节的课后编程练习的答案,都是博主自己写的,有不对的地方请大家留言指出讨论讨论 ...
- 《C Prime Plus》(第六版) 第03章 编程练习 7 英寸转换成厘米
C Prime Plus 第六版 编译器版本:Mac Xcode 11.6 第03章 数据和C 编程练习 7 7. 1英寸相当于2.54厘米.编写一个程序,提示用户输入身高(/英寸),然后以厘米为单 ...
- 雷鸣的游戏人生(六) --- 如何开始学习编程?
雷鸣的游戏人生(六) --- 如何从开始学习编程(到放弃)? 前5篇文章算是前情交代和试水,不过鉴于大家的反馈,我觉得每篇文章还是提出一个问题解决一个问题会对大家帮助更大,同样的大家也 ...
- 《C Prime Plus》(第六版) 第03章 编程练习 8 品脱/盎司/大汤勺/茶勺单位换算
C Prime Plus 第六版 编译器版本:Mac Xcode 11.6 第03章 数据和C 编程练习 8 在美国的体积测量系统中,1品脱等于2杯,1杯等于8盎司,1盎司等于2大汤勺,1大汤勺等于 ...
- 多比矢量图开发手册(六)-Web高级图元编程
2019独角兽企业重金招聘Python工程师标准>>> 多比矢量图高级图元编程 自定义图元的可编辑属性 自定义数据对象是顶点或连线表示的后台数据.它可以是图形和形状相关的数据,也可以 ...
- (一二六)第十一章编程练习
这是我创建的专辑,所有学习笔记都以word格式上传,放在里面,相对更美观和直接.欢迎下载浏览. http://download.csdn.net/album/detail/2971 1.修改程序清单1 ...
- 数据结构(六)散列查找 —— 编程作业01 :电话聊天狂人
数据结构系列内容的学习目录→\rightarrow→浙大版数据结构学习系列内容汇总. 题目描述: 给定大量手机用户通话记录,找出其中通话次数最多的聊天狂人. 输入格式: 输入首先给出正整数N( ...
最新文章
- git ignore linux,为什么说.gitignore不能忽视
- python获取数据库用户名密码_在数据库中存储用户和密码
- JQuery - Sizzle选择器引擎原理分析
- Zabbix 2.4.5 自定义 key 监控 apache
- [Share].NET Reflector Add-Ins
- mysql union group by_Mysql UNION和GROUP BY
- 我的第一个可用的Windows驱动完成了
- 从相识到相惜:Redis与计算存储分离四部曲
- 车主吐槽某电动车保养割韭菜,却遭其总裁公开恐吓?车主:必须视频道歉
- oracle表空间总结,Oracle操作用户和表空间的总结
- js金额千分位显示_JavaScript 格式化数字、金额、千分位、保留几位小数
- 【SQL】结构化查询语言
- 安卓项目连接后台服务器,android云后端服务器
- arcgis怎么压缩tif文件_PDF文件怎么进行压缩?教你两招!
- 修改app名称后,分享到微信的app名称无变化问题
- 【网络攻防技术】实验九——嗅探与欺骗实验
- 苹果新专利:紧急情况下可用指纹或特定输入操作悄悄呼救
- erp框架 saas_基于SAAS的中小纺织加工企业ERP系统
- 澳洲移民监 盘点一下各国的移民监要求
- To Be Better |这个冬天,与CDA一起游学北卡罗莱纳州立大学(NCSU)