BlueNRG-LP、BlueNRG-LPS 是超低功耗的 BLE 单模片上系统,符合 Bluetooth®规范。其架构核心是 32 位的 CortexM0+。
本文档介绍管理 BlueNRG-LP、BlueNRG-LPS 链路控制器定时器的软件模块的特性和功能。不同硬件定时器的详细描述详见在无线电控制器参考手册。
定时器模块库由两层不同程度的抽象组成,允许应用程序对与设备唤醒、用户超时或预配置的无线电事务触发相关的事件进行编程。
因此,任何 BLE 和私有无线电应用均基于定时器模块库。
模块描述
模块包括四个文件 : rf_driver_hal_vtimer.c 、 rf_driver_hal_vtimer.h 、 rf_driver_ll_timer.c , 以 及rf_driver_ll_timer.h。这些文件代表将应用程序与硬件分开的两个层。
第一层通过允许虚拟化设备上可用资源的软件结构抽象硬件计时器。第二层直接连接到硬件,可将以“不依赖于硬件的单位”表示的时间转换为“依赖于硬件的单位”,反之亦然。这些转换考虑了硬件定时器的计数速率。
虚拟定时器
BlueNRG-LP、BlueNRG-LPS 链路控制器提供定时器计数器,用于唤醒处于低功耗模式阶段的设备(而非用于触发无线电操作)。
定时器模块利用单个定时器的硬件资源,实现多个虚拟定时器的分配。
对虚拟定时器数量的唯一限制是设备上的可用内存空间。
虚拟定时器类似于普通定时器。例如,用户可以对虚拟定时器进行编程,以便在特定的时间执行某些动作。
从应用程序的角度来看,虚拟定时器是一个软件结构,除了到期时间外,还包含指向某些用户数据和回调的指针。回调是在时间耗尽时执行的例程。
该软件抽象允许在应用程序定义的虚拟定时器之间共享硬件定时器的功能(如下所述)。
虚拟定时器启动后,其实例将被放置在按到期时间排序的队列中。如果虚拟定时器先于队列中的其他事件运行,则将其置于顶部,并对硬件定时器进行编程。否则,当轮次达到时,虚拟定时器会在其他已经启动的定时器之间发生。
当一个虚拟定时器到期后,内部状态机负责执行链接到刚刚到期的虚拟定时器的回调,并为队列中的下一个定时器保留硬件计数器。
虚拟定时器的超时被视为绝对时间。这意味着,它(例如)像日历上某个特定时间的事件一样发生。
虚拟时基
在定时器模块内部,时间根据系统时间单位(STU)进行测量。它与硬件振荡器的变化无关,并直接暴露给用户。各超时事件均以 STU 表示。一个 STU 等于 625/256µs(约 2.4414µs),可以轻松表达蓝牙协议规定的时间。只有在对真正的计数器进行编程,以 STU 表示的时间才会在硬件定时器计数单元中进行转换。
以 STU 为单位的时间累积在一个 64 位长的全局变量上。如果一个数字手表每 24 小时溢出清零一次,则定时器模块的时基需要一百多万年才会溢出清零。
而从不溢出清零的时基由于能够显示事件的先后顺序,以及判断某事件是否为过去事件,因而具有相当高的实用性。
然而,此类时基必须处理硬件定时器的有限长度,因此也被称为“虚拟时基”。为了正确地累积时间,必须在每次硬件定时器溢出清零之前至少更新一次虚拟时基变量。
这一重要机制存在于内部,不对用户负责,由一个专用的虚拟定时器保持活动状态,且该定时器在初始化阶段由模块自动待命。
此类特殊的虚拟定时器通过定时器硬件容量允许的最大可能值定期进行编程。这意味着,处于低功耗模式的设备会被周期性唤醒,以执行时基维护。BlueNRG-LP、BlueNRG-LPS 大约每 138 分钟唤醒一次。