许多的工业与消费类应用中,越来越多的需要使用低功耗功能,使用定时唤醒,停机减低功耗。灵动微电子推出的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的功能框图
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闪灯程序。

通过上述的步骤,简单的演示了MM32F0270的LPTIM 定时1s唤醒的功能。
下载MM32F0270 lib_Samples,工程路径如下:
~ MM32F0270_SamplesLibSamplesLPTIM
来源:灵动MM32MCU
免责声明:本文为转载文章,转载此文目的在于传递更多信息,版权归原作者所有。本文所用视频、图片、文字如涉及作品版权问题,请联系小编进行处理
审核编辑 黄宇
-
led
+关注
关注
242文章
23203浏览量
659649 -
mcu
+关注
关注
146文章
17077浏览量
350716 -
STOP模式
+关注
关注
0文章
9浏览量
3070
发布评论请先 登录
相关推荐
STM32U575为什么无法通过LPTIM3将MCU从STOP2模式唤醒?
LPTIM无法唤醒STOP1的原因?
使用stm32f0的STOP模式,通过WFE进入STOP后,被GPIO的INT唤醒了,不应该是被GPIO的EVENT唤醒吗?
STM32F107的OTG在stop模式下无法通过EXTI_18唤醒,没有中断产生是怎么回事?
STM32L152进入STOP模式,WAKEUP by RTC唤醒后ADC读取数值不变了怎么解决?
stm32外部中断不能唤醒stop休眠模式怎么解决?
STM32F030进入Stop模式后进行RTC唤醒,MCU没有进入STOP模式,这个是什么原因啊?
请问STM32L431 STOP2模式DEBUG如何才能好用?
STM32F070下载程序后必须掉电重启,进STOP模式才正常,为什么?
在stop模式下让LPTIM1和LPTIM2输出两路相同的PWM,不管是用LSI还是LSE都会有200us的相位差,为什么?
STM32L051C8T6 HAL进入STOP模式RTC唤醒后,ADC采样值不对怎么解决?
用STM32cube生成的lptim的例程只能运行在MCU的stop模式吗?
stm32进入stop模式后,为什么uart还能触发中断并唤醒stm32呢?
基于LL库实现STM32U5 LPTIM功能

使用MM32F0270 LPTIM从STOP模式唤醒
评论