PPI,英文全称Programmable Peripheral Interconnect,是Nordic独有的外设,其设计目的是让CPU处于idle模式下外设与外设之间也能完成相应通信,从而降低系统功耗。为此,很多人会把PPI类比成DMA,的确PPI和DMA两者在设计最终目的上有一定的相似性,但两者的功能和原理完全不相同。讲解PPI原理之前,先大概阐述一下Nordic芯片一个独特的设计理念。

Nordic芯片每个外设都可以看做一个状态机,所以每个外设都有输入(task),输出(event)以及状态。比较常见的task比如启动外设,清0寄存器等,常见的event比如数据发送完毕,外设关闭等。实现上,每个task和event都是一个独立的32-bit寄存器,这跟传统的芯片不一样,传统的芯片都是用寄存器的某一个bit来启动,或者某一个bit来显示状态。换句话说,Nordic把传统芯片1bit要做的事情换成一个完整的32-bit寄存器来实现。这样做的好处是,每个task和event都是一个寄存器,他们都可以用一个独立而唯一的地址来标识,这就为PPI打下了坚实的基础。比如Timer模块的寄存器列表如下所示,里面就包含了各种task和event寄存器:

再比如ADC模块的寄存器列表如下所示,里面也包含了各种task和event寄存器:

现在开始讲PPI,首先PPI也是一个外设,因此PPI也有自己的寄存器定义,如下图所示,其主要用来配置PPI通道等。简言之,PPI就是一个数字逻辑系统,它可以通过某一个PPI通道把外设1的event跟外设2的task相连,这样一旦外设1的event置起(相关寄存器为1),将会自动触发外设2的task(将相关寄存器自动置1)。

下面以一个实际例子来加深大家对PPI的理解,假设我们要实现如下功能:启动timer,定时10ms,10ms到后启动ADC模块。这里我们以两种方式来实现该例子要求:传统方式和PPI方式,大家仔细比较两者的区别,以理解PPI的积极作用。

传统方式

传统方式大致需要如下步骤:

  1. 初始化Timer模块和ADC模块——(CPU工作)
  2. 启动Timer——(CPU工作)
  3. 等待Timer中断——(CPU不工作)
  4. 10ms到,进入Timer timeout handler,启动ADC——(CPU工作)

PPI方式

PPI方式大致需要如下步骤:

  1. 初始化Timer模块,ADC模块,以及PPI模块,将Timer模块的timeout event和ADC模块的start task相连——(CPU工作)
  2. 启动Timer——(CPU工作)
  3. 等待Timer timeout,10ms到,PPI将自动启动ADC——(CPU不工作)

通过比较传统方式和PPI方式,PPI方式可以少进入一次timeout handler,从而减少CPU工作时间,降低系统功耗。由于不需要进入timeout handler,因此启动ADC的操作就不存在被其他高优先级中断打断的可能,这是PPI带来的第二个好处:系统实时性更好。

除了一个event对应一个task,PPI通过fork机制可以让一个event同时启动2个task,即把一个event同时和一个task以及task对应的fork相连,以实现一个event到来,2个task同时启动的目的。

大家可以参考SDK自带例子(Keil5工程):

SDK安装目录\examples\peripheral\ppi\pca10040\blank\arm5_no_packs

或者

SDK安装目录\examples\peripheral\gpiote\pca10040\blank\arm5_no_packs

来进一步理解PPI的工作原理和编程注意事项。

下面为一段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);

如何理解nRF5芯片外设PPI的更多相关文章

  1. nRF5芯片外设GPIO和GPIOTE介绍

    nRF51/nRF52同时包含GPIO和GPIOTE两种外设,经常有人将两者搞混,今天我们就来介绍一下这2种外设有什么不同,及使用注意事项. GPIO和GPIOTE都属于芯片外设,但两者功能完全不一样 ...

  2. Nordic nRF5 SDK和softdevice介绍

    SDK和Softdevice的区别是什么?怎么选择SDK和softdevice版本?芯片,SDK和softdevice有没有版本兼容问题?怎么理解SDK目录结构?SDK帮助文档在哪里?Softdevi ...

  3. 如何调试nRF5 SDK

    本文将讲述Nordic nRF5 SDK的主要调试手段,以帮助大家快速定位问题,并解决问题.一般来说,你可以通过打log方式,IDE的debug模式,SDK自带的app_error_check函数,以 ...

  4. 【STM32学习笔记1】基于固件库的STM32_MDK工程模版

    文章包含STM32固件库介绍和工程模板搭建两方面内容. 一.STM32固件库介绍 要建立工程模板,首先要对STM32的固件库有所了解.STM32的固件可以从ST官网下载,网址为:http://www. ...

  5. 豹哥嵌入式讲堂:ARM开发中有用的文件(1)- source文件

    大家好,我是豹哥,猎豹的豹,犀利哥的哥.今天豹哥给大家讲的是嵌入式开发里的source文件种类. 众所周知,嵌入式开发属于偏底层的开发,主要编程语言是C和汇编.所以本文要讲的source文件主要指的就 ...

  6. 痞子衡嵌入式:ARM Cortex-M文件那些事(1)- 源文件(.c/.h/.s)

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家讲的是嵌入式开发里的source文件. 众所周知,嵌入式开发属于偏底层的开发,主要编程语言是C和汇编.所以本文要讲的source文件主要指的就是 ...

  7. 手把手教你开发BLE数据透传应用程序

    如何开发BLE数据透传应用程序?什么是BLE service和characteristic?如何开发自己的service和characteristic?如何区分ATT和GATT?有没有什么工具可以对B ...

  8. Raw-OS源代码分析之同优先级任务切换

    分析的内核版本号截止到2014-04-15,基于1.05正式版,blogs会及时跟进最新版本号的内核开发进度,若源代码凝视出现"???"字样,则是未深究理解部分. Raw-OS官方 ...

  9. Android Bluetooth模块学习笔记

    一.蓝牙基础知识 1.蓝牙( Bluetooth )是一种无线技术标准,可实现固定设备.移动设备和楼宇个人域网之间的短距离数据交换.蓝牙基于设备低成本的收发器芯片,传输距离近.低功耗. 2.微波频段: ...

随机推荐

  1. 分类,logistic回归

    1. 使用回归进行分类 机器学习中分类是指输入一个样本点,输出这个样本点所属的类别,预测的是一个离散值,如类别(1,2). 而回归问题是输入一个样本点,预测一个值,这个值是连续值,可以介于\([1,2 ...

  2. 需求用例分析之五:业务用例之Rational系

    版权声明:作者:张克强.未经作者允许不得转载. https://blog.csdn.net/zhangmike/article/details/28134897 作者:张克强    作者微博:张克强- ...

  3. Node.js REST 工具 Restify

    Restify 是一个 Node.JS 模块,可以让你创建正确的 REST web services.它借鉴了很多 express 的设计,因为它是 node.js web 应用事实上的标准 API. ...

  4. PHP代码编写的优化

    // $b 会新创建一个内存空间 $a = array('a'=>'aa','b'=>'bb'); $b = $a; $a['c'] = 'cc'; // $b 会引用 $a 的内存空间 ...

  5. EXPORT_SYMBOL使用

    EXPORT_SYMBOL只出现在2.6内核中,在2.4内核默认的非static 函数和变量都会自动导入到kernel 空间的, 都不用EXPORT_SYMBOL() 做标记的.2.6就必须用EXPO ...

  6. PKU 2513 Colored Sticks(并查集+Trie树+欧拉路径(回路))

    题目大意: 给定一些木棒,木棒两端都涂上颜色,求是否能将木棒首尾相接,连成一条直线,要求不同木棒相连接的一端必须是同颜色的. 解题思路: 可以用图论中欧拉路的知识来解这道题,首先可以把木棒两端看成节点 ...

  7. 64. Minimum Path Sum(最小走棋盘 动态规划)

    Given a m x n grid filled with non-negative numbers, find a path from top left to bottom right which ...

  8. 3.1.7. Cross validation of time series data

    3.1.7. Cross validation of time series data Time series data is characterised by the correlation bet ...

  9. 金融即服务(FaaS),将开启场景化金融新格局

    转自: https://www.iyiou.com/p/28494/fs/1 [ 亿欧导读 ] 金融即服务揭示了场景金融的实现路径,通过双向连接做一个开放的系统,按需给客户提供金融服务. 本文系作者在 ...

  10. 对于近阶段公司代码 review 小结

    来新公司,给公司的SDK review了一下.发现了不少小问题,在此总结一下. (我下面说明问题可能是很简单,但是搞清楚某些问题还是花了些时间的,大家引以为戒吧) 先谈谈处理的问题: 1.某天QA说有 ...