如何理解nRF5芯片外设PPI
如何理解nRF5芯片外设PPI
Nordic Semiconductor的nRF5系列芯片中包含了一个独特的外设——可编程外设互连(PPI,Programmable Peripheral Interconnect)。PPI的设计目的是让CPU处于空闲模式时,外设之间仍能完成通信,从而降低系统功耗。虽然PPI和DMA在外设间通信的功能上有些相似,但它们的工作原理完全不同。
Nordic芯片的独特设计理念
在Nordic芯片中,每个外设都可以看作是一个状态机,具有输入(task)、输出(event)和状态。常见的task包括启动外设、清零寄存器等,而常见的event则包括数据发送完毕、外设关闭等。与传统芯片不同的是,Nordic将每个task和event都设计为独立的32位寄存器,而不是使用单个比特位。这种设计使得每个task和event都有一个独立且唯一的地址,为PPI的实现奠定了基础。
例如,Timer模块的寄存器列表中包含了各种task和event寄存器:
同样,ADC模块的寄存器列表中也包含了各种task和event寄存器:
PPI的工作原理
PPI本身也是一个外设,具有自己的寄存器定义。其主要功能是配置PPI通道,通过这些通道将一个外设的event与另一个外设的task连接起来。当某个外设的event被触发(相关寄存器为1)时,会自动触发连接的外设的task(将相关寄存器置1)。
实际应用对比
以一个简单的例子来说明PPI的优势:假设需要实现定时10ms后启动ADC模块的功能。
传统方式
- 初始化Timer模块和ADC模块(CPU工作)
- 启动Timer(CPU工作)
- 等待Timer中断(CPU不工作)
- 10ms到时,进入Timer timeout handler,启动ADC(CPU工作)
PPI方式
- 初始化Timer模块、ADC模块和PPI模块,将Timer的timeout event与ADC的start task相连(CPU工作)
- 启动Timer(CPU工作)
- 等待Timer timeout,10ms到时,PPI自动启动ADC(CPU不工作)
通过对比可以看出,PPI方式减少了CPU的工作时间,降低了系统功耗。此外,由于不需要进入中断处理程序,PPI还提高了系统的实时性。
PPI的高级功能
除了基本的event-task映射,PPI还支持fork机制,允许一个event同时触发两个task。这可以通过将一个event同时连接到一个task及其对应的fork来实现。
实践示例
读者可以参考SDK自带的例子工程:
- SDK安装目录\examples\peripheral\ppi\pca10040\blank\arm5_no_packs
- SDK安装目录\examples\peripheral\gpiote\pca10040\blank\arm5_no_packs
下面是一段PPI使用的代码示例,实现了定时时间到后通过PPI自动操作IO口的功能:
err_code = nrf_drv_ppi_init();
APP_ERROR_CHECK(err_code);
err_code = nrf_drv_ppi_channel_alloc(&ppi_channel);
APP_ERROR_CHECK(err_code);
compare_evt_addr = nrf_drv_timer_event_address_get(&timer, NRF_TIMER_EVENT_COMPARE0);
gpiote_task_addr = nrf_drv_gpiote_out_task_addr_get(GPIO_OUTPUT_PIN_NUMBER);
err_code = nrf_drv_ppi_channel_assign(ppi_channel, compare_evt_addr, gpiote_task_addr);
APP_ERROR_CHECK(err_code);
err_code = nrf_drv_ppi_channel_enable(ppi_channel);
APP_ERROR_CHECK(err_code);
通过以上内容,读者可以对Nordic nRF5芯片中的PPI功能有全面的了解,并能够开始在实际项目中应用这一特性。