ST BlueNRG-LP、BlueNRG-LPS 定时器模块

关键字 :STWirelessBLE
BlueNRG-LP、BlueNRG-LPS 是超低功耗的 BLE 单模片上系统,符合 Bluetooth®规范。其架构核心是 32 位的 Cortex[1]M0+。 本文档介绍管理 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 链路控制器提供定时器计数器,用于唤醒处于低功耗模式阶段的设备(而非用于触发无线操作)。定时器模块利用单个定时器的硬件资源,实现多个虚拟定时器的分配。对虚拟定时器数量的唯一限制是设备上的可用内存空间。

虚拟定时器类似于普通定时器。例如,用户可以对虚拟定时器进行编程,以便在特定的时间执行某些动作。从应用程序的角度来看,虚拟定时器是一个软件结构,除了到期时间外,还包含指向某些用户数据和回调的指针。回调是在时间耗尽时执行的例程。该软件抽象允许在应用程序定义的虚拟定时器之间共享硬件定时器的功能。

虚拟定时器启动后,其实例将被放置在按到期时间排序的队列中。如果虚拟定时器先于队列中的其他事件运行,则将其置于顶部,并对硬件定时器进行编程。否则,当轮次达到时,虚拟定时器会在其他已经启动的定时器之间发生。当一个虚拟定时器到期后,内部状态机负责执行链接到刚刚到期的虚拟定时器的回调,并为队列中的下一个定时器保留硬件计数器。虚拟定时器的超时被视为绝对时间。这意味着,它像日历上某个特定时间的事件一样发生。

       除了由虚拟定时器共享的定时器之外,另一个定时器能够触发无线电活动。在大多数情况下,无线事件的定时是一个关键方面,必须保证一定的准确性。

低速振荡器为 BlueNRG-LP、BlueNRG-LPS 链路控制器定时器馈送信号。根据配置,低速振荡器源可以是外部XO或内部 RO。与外部振荡器不同,内部振荡器的速度可以改变,因其会受到温度的影响。这意味着,如果由内部振荡器计时,则定时器可以根据不固定的周期进行计数。

在所有利用 BlueNRG-LP、BlueNRG-LPS 链路层定时器的应用程序内部,总是调用三个 API。 HAL_VTIMER_Init()。它根据低速振荡器的类型和高速时钟的启动时间来初始化定时器模块。此外,它还启 动负责触发校准过程和虚拟时基维护操作的虚拟定时器。 该信息包含在下面定义的专用结构中:

typedef struct HAL_VTIMER_InitS {

 /* XTAL startup in 2.44 us unit */

uint16_t XTAL_StartupTime;

 /* Enable initial estimation of the frequency of the Low Speed Oscillator */

BOOL EnableInitialCalibration;

/* Periodic calibration interval in ms, to disable set to 0 */

uint32_t PeriodicCalibrationInterval; } HAL_VTIMER_InitType;



XTAL_StartupTime 是高速时钟稳定下来所需的时间。该值以系统时间单位表示,

对于无线电操作的定时特别有用。标志 EnableInitialCalibration 允许在初始化期间估算低速振荡器的频率。一般情况下,如果采用外部晶体振荡器,则可将该标志置零以禁用初始估算。 PeriodicCalibrationInterval 以毫秒为单位,表示低速振荡器的测量频率(视温度变化)。同样在这种情况下, 如果采用外部晶体振荡器,则可选择等于零的校准间隔来禁用定期校准。

HAL_VTIMER_Tick():该 API 在应用程序主循环中调用。它负责管理虚拟定时器队列,检查虚拟定时器是否 到期,管理硬件定时器资源的共享机制以及到期定时器的用户回调执行。 如果 PeriodicCalibrationInterval 不等于零,则会在校准定时器到期后定期启动校准过程。如果校准定时器尚 未到期,但设备处于活动状态,则可提前启动校准过程。

HAL_VTIMER_TimeoutCallback():该 API 在专用定时器 IRQ 处理程序中调用。它在硬件定时器到期时执行, 向应用程序发出信号。注意,该 API 不属于用户定义的回调。
void CPU_WKUP_IRQHandler(void)

{
    HAL_VTIMER_TimeoutCallback();
}

      BlueNRG-LP、BlueNRG-LPS 提供另一个定时器,专门用于触发无线电事务(可以是发送或接收)。特别是, 定时器模块库提供了一种可能性 - 对与无线电操作相关的两个不同事件进行编程:

1.通过空中传输的第一个传输比特

2.接收窗口的开始

注意,定时器模块只编程无线电定时器,而不为传输或接收配置无线电。此外,定时器模块没有对背靠背通信 的超时进行编程。一个专用的软件库可以完成这两项任务。若需更多信息,请参考无线电驱动程序用户手册。 无线电定时器不像虚拟定时器那样在定时器队列中虚拟化(无必要性),但即使在这种情况下,用户也必须将 前述两事件之一的到期时间(以 STU 为单位)表示为将来的绝对时间。此外,无线电定时器在软件结构中被 抽象出来,但无需用户的任何动作。如果超时时间太近,则对定时器进行编程的请求将被拒绝并返回错误代码。

更多详细信息请参考:AN5469。

★博文内容参考自 网站,与平台无关,如有违法或侵权,请与网站管理员联系。

★文明上网,请理性发言。内容一周内被举报5次,发文人进小黑屋喔~

参考来源

ST: https://www.st.com/content/ccc/resource/technical/document/application_note/group1/7e/96/8f/0c/96/d2/4d/5b/DM00692325/files/DM00692325.pdf/jcr:content/translations/zh.DM00692325.pdf

评论