0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

使用MM32F0270 LPTIM从STOP模式唤醒

jf_pJlTbmA9 来源:灵动MM32MCU 作者:灵动MM32MCU 2023-10-26 16:46 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

许多的工业与消费类应用中,越来越多的需要使用低功耗功能,使用定时唤醒,停机减低功耗。灵动微电子推出的MM32F0270系列,支持多种灵活的低功耗模式,还支持LPTIM和LPUART的外设。

本文介绍了如何使用 MM32F0270的LPTIM来实现定时1s从STOP方式的低功耗模式中唤醒。实现使用LPTIM1,在低功耗stop模式下定时1s,1s后将MM32F0270从stop模式唤醒,并且点亮LED灯。

01、MM32F0270 LPTIM的简要介绍

LPTIM即低功耗定时器,得益于其定时器的低功耗。由于 LPTIM 的时钟源具有多样性,因此 LPTIM 能够在所有电源模式(待机模式除外)下保持运行状态。

即使没有内部时钟源, LPTIM 也能运行,可将其用作“脉冲计数器”,这种脉冲计数器在一些特定的应用中十分有用。

LPTIM 可以支持MCU从低功耗STOP模式唤醒,非常适合实现“超时功能”,而且功耗极低。

LPTIM是低功耗产品在低功耗功耗模式下定时的最佳选择。

wKgaomUD8YOASwPfAADJeldp6F0450.png 图1 LPTIM的功能框图

02、LPTIM 的功能特性

2.1 MM32的LPTIM具有以下特性:

16 位递增计数器

3-bit 异步时钟预分频器,对应的分频系数分别为 1、2、4、8、16、32、64、128

时钟源可选:

内部时钟源:LSI_CLK 和 PCLK

外部时钟源:LSE_CLK

16-bit 比较寄存器和目标值寄存器

触发源可选:硬件触发、软件触发

输入极性可选

外部脉冲计数(无时钟时)

低功耗超时唤醒功能

PWM 输出

2.2 MM32F0270 LPTIM中断

LPTIM 的中断包括:外部触发中断,比较匹配中断, 计数器溢出中断, 当相应的中断使能位打开,发生相应的事件时,产生相应的中断。

需要使用唤醒时,需要使能相应的中断外,还需配置EXTI使能相关的功能。

相关的寄存器与控制状态位的控制与查询,可以参考用户手册。

03、LPTIM 从STOP模式唤醒的软硬件设计

LPTIM是如何控制配置实现定时1s唤醒STOP 模式的呢?

3.1 在库函数版本的样例中可以通过如下顺序初始化LPTIM

a. 使能LPTIM外设时钟;

RCC_APB2PeriphClockCmd(RCC_APB2ENR_LPTIM1, ENABLE);

b. 配置LPTIM的LPTIM_TimeBaseInit_TypeDef结构体中指定的参数;

选择时钟源为LSE 32.768KHz;

选择计数模式为连续计数模式;

时钟分频为DIV1;

 LPTIM_TimeBaseStructInit( init_struct);
    //Setting LPTIM base
    init_struct.ClockSource            = LPTIM_LSE_Source;//LPTIM_PCLK_Source;//LPTIM_LSI_Source;//
    init_struct.CountMode              = LPTIM_CONTINUOUS_COUNT_Mode;
    init_struct.OutputMode             = LPTIM_NORMAL_WAV_Mode;
    init_struct.Waveform               = LPTIM_AdjustPwmOutput_Mode;
    init_struct.Polarity               = LPTIM_Positive_Wave;
    init_struct.ClockDivision          = LPTIM_CLK_DIV1;

c. 开启LSE 32.768KHz的时钟,等待稳定;

 if(init_struct.ClockSource == LPTIM_LSE_Source) {
        RCC_APB1PeriphClockCmd(RCC_APB1ENR_PWR | RCC_APB1ENR_BKP, ENABLE); //RCC->BDCR |= 1 << 24;
        PWR_BackupAccessCmd(ENABLE);
        RCC_LSEConfig(RCC_LSE_ON);
        DelayNop_Ms(1000);
        while(!RCC_GetFlagStatus(RCC_FLAG_LSERDY));
        LPTIM_CLKConfig(LPTIM1, LPTIM_LSE_Source);
    }

d. 调用函数LPTIM_TimeBaseInit设置参数及比较器值与目标值;

LPTIM_TimeBaseInit(LPTIM1,  init_struct);
    LPTIM_SetCompare(LPTIM1, arr / 2 - 1);
    LPTIM_SetTarget(LPTIM1, arr);

在这设定结合时钟源时钟,分频系数与Target值,得到定时1s的定时值。

e. 设定NVIC 参数与EXTI参数;

void NVIC_Configuration(void)
{
    NVIC_InitTypeDef NVIC_InitStructure;
    EXTI_InitTypeDef EXTI_InitStructure;

    EXTI_DeInit();     //set EXTI as WFI
    EXTI_InitStructure.EXTI_Line = EXTI_Line23 ;
    EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt ;
    EXTI_InitStructure.EXTI_Trigger =   EXTI_Trigger_Rising_Falling;
    EXTI_InitStructure.EXTI_LineCmd = ENABLE;
    EXTI_Init( EXTI_InitStructure);
    EXTI_ClearITPendingBit(EXTI_Line23);

    NVIC_InitStructure.NVIC_IRQChannel = LPTIMER1_IRQn;
    NVIC_InitStructure.NVIC_IRQChannelPriority = 0;
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    NVIC_Init( NVIC_InitStructure);
}

f. 中断相应处理函数

void LPTIMER1_IRQHandler(void)
{
    if(LPTIM_GetITStatus(LPTIM1, LPTIF_OVIF)) {
        LPTIM_ClearITPendingBit(LPTIM1, LPTIF_COMPIF | LPTIF_TRIGIF | LPTIF_OVIF);
        EXTI_ClearITPendingBit(EXTI_Line23);
        LPTIM_ITConfig(LPTIM1, LPTIE_COMPIE | LPTIE_TRIGIE | LPTIE_OVIE, DISABLE);
    }
}

3.2 实现Demo功能的主要函数代码:

void MCU_EnterSTOP_WFI(void)
{
    PWR_EnterSTOPMode(PWR_Regulator_ON, PWR_STOPEntry_WFI);
}
void LPTIM_Function_Demo(void)
{
    int i;
    DelayNop_Init();
    LPTIM1_Init(32768 - 1);
    NVIC_Configuration();
    LED1_OFF();
    LED1_TOGGLE();
    LED1_TOGGLE();
    for(i = 0; i < 10; i++) {
        __NOP();//
        DelayNop_Ms(2);
        LED1_TOGGLE();
    }
    LED1_OFF();    
    LPTIM_ITConfig(LPTIM1, LPTIE_OVIE, ENABLE);

    for(i = 0; i < 10; i++) {
        __NOP();//
        DelayNop_Ms(1);
        LED2_TOGGLE();
    }
    LED1_OFF();
    MCU_EnterSTOP_WFI();
    SystemInit();
    while (1) {
        LED3_TOGGLE();
        __NOP();//
        DelayNop_Ms(4);
    }
}

配置好初始化LPTIM与LED闪灯的初始化操作后,执行翻转5次LED灯的操作;

进入STOP 模式。

延时1S后,定时从STOP模式唤醒。

唤醒后继续执行LED闪灯程序。

wKgZomUD8YWAFeu8AACLvgglodw900.png

通过上述的步骤,简单的演示了MM32F0270的LPTIM 定时1s唤醒的功能。

下载MM32F0270 lib_Samples,工程路径如下:

~ MM32F0270_SamplesLibSamplesLPTIM

来源:灵动MM32MCU
免责声明:本文为转载文章,转载此文目的在于传递更多信息,版权归原作者所有。本文所用视频、图片、文字如涉及作品版权问题,请联系小编进行处理

审核编辑 黄宇

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • led
    led
    +关注

    关注

    244

    文章

    24754

    浏览量

    693021
  • mcu
    mcu
    +关注

    关注

    147

    文章

    19211

    浏览量

    405047
  • STOP模式
    +关注

    关注

    0

    文章

    9

    浏览量

    3352
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    什么是自动唤醒定时器

    CW32F030 内部集成 1 个自动唤醒定时器 (AWT),AWT 包含一个 16bit 向下计数器,并由一个可编程预分频器驱动。AWT 可选 5 种计数时钟源,可工作于定时模式或计数模式
    发表于 12-11 07:24

    PY32MD320单片机,内置NN型电机驱动,性能优异

    工作频率为48MHz。内置64KB Flash存储器和8KB SRAM。工作温度范围为-40℃~105℃,工作电压范围2.0~5.5V。芯片支持sleep和stop两种低功耗模式,其中stop
    发表于 12-06 13:18

    CW32L083低功耗项目休眠后无法唤醒怎么解决?

    配置STOP模式后GPIO中断唤醒失效,RTC闹钟唤醒倒是正常,电路设计遵循了手册建议,求排查思路...
    发表于 11-21 07:47

    CW32L010DeepSleep模式唤醒后时钟启动不稳定什么原因?

    CW32L010DeepSleep模式唤醒后时钟启动不稳定什么原因?
    发表于 11-18 06:24

    AT32F系列 PWC待机唤醒唤醒Standby

    、WDT复位均能将Standby模式唤醒。 注:本应用笔记对应的代码是基于雅特力提供的V2.x.x 板级支持包(BSP)而开发,对于其他版本BSP,需要注意使用上的区别。 支持型号: AT32F
    发表于 11-05 14:08

    AT32F系列 PWC USART接收唤醒SLEEP

    AT32F系列 PWC USART接收唤醒SLEEP 示例目的演示AT32F系列 PWC USART接收唤醒SLEEP的使用方法。通常任意一个被嵌套向量中断控制器响应的外设中断都能
    发表于 11-05 14:06

    【NCS随笔】如何进入system_off深度睡眠模式以及配置GPIO中断唤醒

    【NCS随笔】如何进入system_off深度睡眠模式以及配置GPIO中断唤醒 本文章主要是讲解NCS下面使用nRF54L15如何进入system_off模式,以及如何配置通过按键唤醒
    的头像 发表于 09-29 00:56 990次阅读
    【NCS随笔】如何进入system_off深度睡眠<b class='flag-5'>模式</b>以及配置GPIO中断<b class='flag-5'>唤醒</b>

    V5.1.0版本,启用PM组件后进入stop模式无法正常唤醒怎么解决?

    正常的drv_pm.c低功耗代码出错了,进入stop模式后,就无法被软定时器唤醒,经过检查,pm.c在进入低功耗模式前会选择计算下一个定时器的超时时间,然后设置lptimer,但我调试
    发表于 09-10 08:14

    请问是否可以将所有 GPIO 设置为断电或空闲模式唤醒系统?

    是否可以将所有 GPIO 设置为断电或空闲模式唤醒系统?
    发表于 08-28 06:00

    是否可以将所有 GPIO 设置为断电或空闲模式唤醒系统?

    是否可以将所有 GPIO 设置为断电或空闲模式唤醒系统?
    发表于 08-25 06:55

    求助,关于STM32F030进入Stop模式后RTC唤醒问题求解

    HAL_PWR_EnterSTOPMode(PWR_LOWPOWERREGULATOR_ON, PWR_STOPENTRY_WFI)进入STOP模式正常,但是RTC唤醒后第二次调用HAL_PWR_EnterSTOPMode函数发
    发表于 07-23 06:59

    STM32L152进入STOP模式,WAKEUP by RTC唤醒后ADC读取数值不变了是什么原因导致的?

    ),进入STOP,RTC唤醒后读出来的ADC没有变化(依然是4.10V)。以前没有进入STOP模式,连续读取是OK的。 请问大虾,这大概是什么问题?
    发表于 07-23 06:09

    STM32L433VCT6进入STOP模式2之后,功耗依然和正常运行模式没有差别,为什么?

    STM32CubeMX上配置power savinf mode 2、系统电源供电时LDO 结果: 1、运行是10mA,进入STOP模式时是9.9mA; 2、挂仿真,没有任何唤醒的中断产生,应该是进入
    发表于 07-21 06:42

    求助,关于TLE9893 stop模式唤醒问题求解

    我正在使用 TLE9893 的STOP模式以降低功耗,靠外部电平信号唤醒,希望2ms内能转到Active模式,然后接收外部数据。我尝试了两种方案,好像都不正常。 一种是用P2端口下降沿
    发表于 07-14 07:39

    请问 CYW20829 深度睡眠模式是否可以通过远程 BLE 唤醒,还是必须主机唤醒

    请问 CYW20829 深度睡眠模式是否可以通过远程 BLE 唤醒,还是必须主机唤醒? 谢谢!
    发表于 07-01 07:55