本着学习的态度,本人总结了网上诸多相关内容的博客,由于时间较久远,出处不能一一列举,如有侵权,please feel free to let me know.
一、 PPI
- PPI原理
PPI为nrf52832的可编程外设互连,可以提供一个硬件通道,将不同外设的事件和任务“连接”在一起,当事件产生时硬件自动触发事件“连接”的任务。PPI机制的设计,使得被"连接"的任务由硬件自动触发完成,省去了原本CPU需要参与的步骤。这一方面降低了CPU的负荷,另一方面保证了产生事件到执行任务的实时性。 - PPI的实现
- nRF52832共有32个通道(编号为031),其中,有12个通道(通道2031)已经被预编程,剩余20个通道(通道0~19)是用户可编程的;
- 每个PPI通道由3个端点寄存器组成,1个EEP(Event End-Point:事件端点)和2个TEP(Task End-Point:任务端点,次级任务端点)寄存器;
- 任务端点和次级任务端点同时被触发;
- 使用PPI连接外设事件和外设任务的时候,将外设事件寄存器的地址写入到PPI通道的EEP,将外设任务寄存器的地址写入到PPI通道的TEP,最后使能该PPI通道实现事件和任务间的连接;
- PPI组
如果需要一个事件能同时触发多个任务或者一个任务能同时被多个事件触发,可以通过PPI组来实现。 - PPI寄存器
PPI只有任务寄存器和通用寄存器,它没有事件寄存器,所以PPI产生不了事件。
a. 任务寄存器- CHG[n].EN(n=0~5): 使能PPI通道组n
- CHG[n].DIS(n=0~5): 禁用PPI通道组n
b. 通用寄存器 - CHEN: 使能/禁用PPI通道
- CHENSET: 使能PPI通道
- CHENCLR: 禁用PPI通道
- CH[n].EEP(n=0~19): PPI通道n事件端点
- CH[n].TEP(n=0~19): PPI通道n任务端点
- CHGn: PPI通道组n
- FORK[n].TEP(n=0~31): PPI通道n次级任务端点
- PPI相关库函数
- nrf_drv_ppi_init(void);//初始化PPI模块
- nrfx_ppi_channel_alloc(nrf_ppi_channel_t * p_channel);//申请PPI通道
PPI通道是由驱动来分配的,而不是应用程序指定的,当需要一个PPI通道的时候,调用nrf_drv_ppi_channel_alloc()函数,该函数会查找空闲的PPI通道,并将查找到的第一个PPI通道传递给函数的输入参数p_channel。 - nrfx_ppi_channel_assign(nrf_ppi_channel_t channel, uint32_t eep, uint32_t tep);//配置通道的EEP和TEP
其中,eep为事件寄存器的地址,tep为任务寄存器的地址。地址的获得有两种方式:
从芯片的应用指南中查到ÿ