低功耗定时器(LPTIMER)

LPTIM是一个16位低功耗定时计数器,工作在Always-On电源域,支持多种低功耗模式。它可以使用内部或外部时钟,在无时钟条件下计数,并提供外部触发的超时唤醒功能。LPTIM具有多种工作模式,如普通定时、触发脉冲计数、外部异步脉冲计数和超时模式,以及16位PWM支持。软件工作流程包括配置时钟源、模式、比较和目标寄存器,然后启用中断和计数器。
摘要由CSDN通过智能技术生成

概述
LPTIM 是运行在Always-On 电源域下的16bits 低功耗定时/计数器模块。通过选择合适的工作时钟,LPTIM 在在各种低功耗模式下保持运行,并且只消耗很低的功耗。LPTIM 甚至可以在没有内部时钟的条件下工作,因此可实现休眠模式下的外部脉冲计数功能。此外,与外部输入的触发信号结合,可以实现低功耗超时唤醒功能。LPTIM 的主要特性有:
➢ 16bit upcounter
➢ 3bit 异步时钟预分频器,8 种分频系数(1、2、4、8、16、32、64、128)
➢ 可选工作时钟:

  • 内部时钟源:LSCLK、RCLP、系统时钟
  • 外部时钟源:LPTI(带有模拟滤波)
    ➢ 16bit 比较寄存器
    ➢ 16bit 目标值寄存器
    ➢ 软件/硬件触发
    ➢ 输入极性选择
    ➢ 无时钟外部脉冲计数
    ➢ 外部触发的休眠超时唤醒
    ➢ 支持16bit PWM

结构框图
在这里插入图片描述
工作模式

普通定时器
⚫ 使用内部时钟或外部时钟输入工作
⚫ 使能后有两个计数时钟的同步过程
⚫ 使能后即开始工作,不需要trigger 触发

Trigger脉冲触发计数
⚫ 使用内部时钟工作
⚫ 内部时钟采样外部输入的异步 trigger 信号
⚫ 可以对 trigger 的上升、下降、双边沿计数
⚫ 使能后有两个计数时钟的同步过程

外部异步脉冲计数
⚫ 直接使用外部输入脉冲作为计数工作时钟
⚫ 输入极性可配置,实现上升沿计数或下降沿计数
⚫ 不需要 trigger 触发
⚫ 使能后无同步过程

Timeout模式
⚫ 使用内部时钟或外部输入时钟工作
⚫ 采样外部输入的异步 trigger 信号
⚫ 首次 trigger 启动计数器,启动后采样到 trigger 则清零并重启计数器
⚫ 计数器溢出前没有出现新的 trigger ,则产生溢出中断并 停止计数,清除使能
⚫ 使能后有两个计数时钟的同步过程

计数模式
LPTIM有两种计数模式。
连续计数模式:计数器被触发后保持运行,直到被关闭为止。计数器达到目标值后回到0重新开始计数,并产生溢出中断。
单次计数模式:计数器被触发后计数到目标值后回到0,并自动停止,产生溢出中断。
单次计数模式自动停止并关闭使能信号的波形如下,由于溢出信号和lpten使能信号位于不同的时钟域,关闭使能信号采用异步复位同步释放的方式实现。

外部触发的超时唤醒
LPTIM可以由外部输入的trigger信号触发使能。在Timeout模式下,第一个外部触发输入的有效沿将启动计数器,而后续触发信号将清零计数器。如果在计数器达到比较值之前没有有效触发信号到来,则产生超时中断,唤醒MCU。
外部输入trigger信号的有效沿可以由寄存器配置,外部trigger信号被认为是一个异步输入,因此有效沿的采样和判决有至少2个计数时钟的latency。

16bit PWM
使能PWM模式后LPTIM从0x0000开始计数,计数值等于比较值时输出置高,计数值等于终值寄存器时输出变低;PWM周期由终值寄存器决定,占空比由比较值寄存器决定。

软件工作流程
1:选择时钟源,设置分频值,设置工作模式和计数模式。
2:设置高低位比较寄存器的值。
3:设置高低位目标寄存器的值
4:打开中断标志使能。
5:打开LPTEN使能位,启动计数器。

要在nRF52832上启用低功耗定时器(Low Power Timer),你需要进行以下步骤: 1. 配置低功耗定时器 首先,你需要配置低功耗定时器的时钟源和预分频器。你可以选择使用低频时钟(LFCLK)源,例如内部RC振荡器或外部晶体振荡器。然后,选择适当的预分频器来设置定时器的时钟速度。 2. 初始化低功耗定时器 使用nRF SDK或直接操作寄存器来初始化低功耗定时器。你需要设置定时器的模式(定时器模式或计数器模式)、位宽(8位或16位)、比较值(如果需要)等。 3. 启动低功耗定时器 在初始化完成后,启动低功耗定时器以开始计时或计数。你可以使用相应的函数或操作寄存器来启动定时器。 下面是一个示例代码片段,展示了如何在nRF52832上启用低功耗定时器: ```c #include <stdbool.h> #include "nrf.h" #include "nrf_drv_clock.h" #include "nrf_delay.h" void lptimer_init(void) { // 配置LFCLK源为内部RC振荡器 NRF_CLOCK->LFCLKSRC = CLOCK_LFCLKSRC_SRC_RC << CLOCK_LFCLKSRC_SRC_Pos; NRF_CLOCK->EVENTS_LFCLKSTARTED = 0; NRF_CLOCK->TASKS_LFCLKSTART = 1; // 等待LFCLK稳定 while (NRF_CLOCK->EVENTS_LFCLKSTARTED == 0) { // 等待 } // 配置低功耗定时器 NRF_LPTIMER->PRESCALER = 0; // 预分频器设置为1 NRF_LPTIMER->BITMODE = LPTIMER_BITMODE_BITMODE_16Bit; // 使用16位模式 // 初始化低功耗定时器 NRF_LPTIMER->TASKS_START = 1; // 启动低功耗定时器 } int main(void) { // 初始化时钟 nrf_drv_clock_init(); nrf_drv_clock_lfclk_request(NULL); // 初始化低功耗定时器 lptimer_init(); while (true) { // 主循环代码 } } ``` 在这个例程中,我们首先需要初始化时钟,然后调用`lptimer_init()`函数来配置和初始化低功耗定时器。最后,在主循环中,你可以添加自己的代码来处理定时器中断或检查定时器的当前值。 请注意,以上代码仅为示例,你可能需要根据自己的具体应用场景进行适当的修改和配置。在实际使用中,请参考nRF52832的技术参考手册和开发环境文档以获取更多详细信息。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小小菜鸡叶不凡

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值