打印
[MM32软件]

使用MM32F0270 LPTIM从STOP模式唤醒

[复制链接]
1380|17
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
在许多的工业与消费类应用中,越来越多的需要使用低功耗功能,使用定时唤醒,停机减低功耗。灵动微电子推出的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是低功耗产品在低功耗功耗模式下定时的最佳选择。

图1 LPTIM的功能框图
02LPTIM 的功能特性
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使能相关的功能。

相关的寄存器与控制状态位的控制与查询,可以参考用户手册。
03LPTIM 从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的定时值。



使用特权

评论回复
沙发
两只袜子|  楼主 | 2022-1-11 15:31 | 只看该作者
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闪灯程序。

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

Demo程序可登录MindMotion的官网:https://www.mindmotion.com.cn/pr ... instream/MM32F0270/
下载MM32F0270 lib_Samples,工程路径如下:
~ MM32F0270_Samples\LibSamples\LPTIM\

使用特权

评论回复
板凳
八层楼| | 2022-2-3 19:25 | 只看该作者
还有更加低的功耗模式吗

使用特权

评论回复
地板
tpgf| | 2022-2-3 19:31 | 只看该作者
这个波形是仿真出来的吧

使用特权

评论回复
5
观海| | 2022-2-3 19:35 | 只看该作者
这个延时时间是如何计算得到的呢

使用特权

评论回复
6
guanjiaer| | 2022-2-3 19:52 | 只看该作者
nop是不是就跟机器周期有关系啊

使用特权

评论回复
7
heimaojingzhang| | 2022-2-3 19:59 | 只看该作者
不是啊 应该是指令周期

使用特权

评论回复
8
keaibukelian| | 2022-2-3 20:05 | 只看该作者
代码的排版有些看不习惯啊

使用特权

评论回复
9
liu96jp| | 2022-4-9 12:20 | 只看该作者
灵动这个低功耗操作不错哦

使用特权

评论回复
10
suw12q| | 2022-4-9 12:33 | 只看该作者
感觉不错,有机会试试吧,现在很多场景都是需要低功耗了

使用特权

评论回复
11
liu96jp| | 2022-4-9 12:52 | 只看该作者
这个是用定时器来唤醒吗?跟RTC定时唤醒有啥区别?

使用特权

评论回复
12
w2nme1ai7| | 2022-4-9 13:35 | 只看该作者
低功耗串口唤醒不错,这个很有意义

使用特权

评论回复
13
ex7s4| | 2022-4-9 13:46 | 只看该作者
其实外部中断唤醒就够用了,一般应用是够用了

使用特权

评论回复
14
g0d5xs| | 2022-4-9 17:57 | 只看该作者
期待这个芯片的低功耗能很强

使用特权

评论回复
15
lamanius| | 2022-4-9 18:12 | 只看该作者
这种低功耗感觉不是很强呢

使用特权

评论回复
16
q1ngt12| | 2022-4-9 18:23 | 只看该作者
低功耗定时器属实很有意义,这个可以在低功耗状态运行很不错

使用特权

评论回复
17
zhizia4f| | 2022-4-9 18:42 | 只看该作者
有人测试过么?这种方式低功耗怎么样呢?

使用特权

评论回复
18
p0gon9y| | 2022-4-9 19:13 | 只看该作者
很不错呢,MM32也往低功耗方面走了

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1890

主题

6581

帖子

8

粉丝