前言
可编程外围互连(PPI)使不同的外围设备能够自主交互彼此使用任务和事件,而无需使用CPU。PPI提供了一种机制,可以作为事件的结果自动触发一个外围设备中的任务发生在另一个外围。任务通过PPI通道连接到事件。PPI通道为由两个端点寄存器组成,事件端点(EEP)和任务端点(TEP)。一个接口任务通过使任务寄存器的地址与任务关联实现连接到任务端点。类似地,外围事件使用事件寄存器的地址连接到事件端点实现与事件相关联。
启用和禁用PPI通道的方法有两种:
•使用CHEN、CHENSET和CHENCLR分别启用或禁用PPI通道寄存器。
•通过组的Enable和,在PPI通道组中启用或禁用PPI通道禁用任务。
在触发这些任务之前,必须触发PPI通道组配置为定义哪些PPI通道属于哪些组。
PPI任务(例如CHG0EN)可以像其他任务一样通过PPI触发,这意味着它们可以作为TEP连接到PPI通道。一个事件可以通过使用多个通道和触发多个任务一个任务可以由多个事件以相同的方式触发。
上图是PPI的结构,其中EEP: 是 EVENT END POINT 的缩写。每个PPI通道拥有一个EEP。EEP是用来存放 EVENT 寄存器地址的,如上面说的条件,当 EVENT 产生的时候, 它会马上知道。TEP:是 TASK END POINT 的缩写,每个PPI通道有一个TEP。TEP是用来存放TASK 寄存器地址的,如上面说的要执行的动作。
每个 nRF5x 芯片有31个PPI通道, 而这31个通道被编成组(GROUP)。多个PPI通道编成组以后,我们可以用一个TASK 执行组里面所有的 PPI 通道的使能或者关闭,很方便使用。PPI是nRF5X 系列芯片特有的一个功能,它减轻了CPU的负担,提高了外设之间交互响应的速度,用途非常广泛。我们可以把 PPI 看成一根导线,导线的一端接要执行的动作,导线的另一端接动作执行的条件。当条件满足的时候,自动执行预设好的动作。
CH[n] : 单个通道, nRF51 系列有31个PPI 通道,
CHG[m]: 通道组, 1个以上通道构成一个组。
CHEN:是个总开关,所有的PPI 通道的允许或者禁止都可以在这里操作。
本节将利用PPI模块,实现不使用中断,也不需要CPU介入,实现按键控制LED操作。
示例详解
基于硬件平台: nrf51822ek_tm开发板。
本示例所用的最小系统板原理图:
-
- 工程创建:
- 打开KEIL,新建一个空工程:Project->New uVision Project
- 工程创建:
工程名为nrfxx-ppi确认后按下图选择芯片为nrf51822_xxAA->ok
在弹出的对话框中勾选CMSIS中的CORE;Device中的Startup(后面有nrf51 Series字样的);在nrf_device中勾选nrf_gpio, nrf_gpiote,nrf_delay,nrf_ppi.
OK之后工程自动生成如下代码:
新建一个空白文档,保存为main.c,并加入工程中:
配置工程,选择使用MicroLIB库,可以减小程序体积:
加入NRF51定义,并选择化等级3,可以减小程序体积,但仿真运行时可能会出现与代码顺序不一致现象:
调试工具选择J-LINK,并将接口设置为SW口勾选下载程序后自动复位及运行:
-
- 工程代码
- OK之后在man.c中加入如下代码,为了对比说明这一点实现是的PPI功能,我们把上一节的中断部分代码给全部屏蔽掉:
- 工程代码
关于PPI的更多接口函数可以查看nrf_ppi.h文件,里面的函数名字与功能很好理解。
-
- 编译工程,下载程序,按按键试试,是不是同样可以实现通过按键控制LED亮灭的功能,无需CPU介入,也无需中断处理。
OK,本期实验完成!下期见!同时如果大家有什么疑问或是有想了解的其它内容,也欢迎大家留言!!最后喜欢这个公众号的同学们记得加关注了,会有不定期技术干货推出!!
文中源码资料下载,在公众号里给十三发消息:
下载|一起学nRF51xx 5
关注十三公众号