历史上的今天
返回首页

历史上的今天

今天是:2025年08月20日(星期三)

正在发生

2021年08月20日 | 【玩转STM32】:低功耗定时器LPTIM应用

2021-08-20 来源:eefocus

目标实现:使用LPTIM1,在低功耗stop模式下定时1s,1s后将STM32从stop模式唤醒,并且点亮LED灯


1 LPTIM 介绍

LPTIM,顾名思义,即低功耗定时器的意思,与普通定时器的差别是LPTIM在睡眠或者停机模式下依然可以工作(待机模式除外),支持低速时钟 LSI、 LSE 或者外部输入时钟。LPTIM是低功耗产品在低功耗功耗模式下定时的不二之选

  • 支持芯片:并不是STM32的所有芯片都有LPTIM这个外设,,从官方资料可知,支持LPTIM的芯片有:STM32F410、STM32F413/423、STM32F7系列, STM32G0系列, STM32H7系列, STM32L0系列, STM32L4系列, STM32L4+系列, STM32L5系列, STM32WB系列图片

    图片

  • STM32L431芯片手册对LPTIM的介绍

    图片

图片

2 LPTIM 功能

LPTIM 低功耗定时器有以下 6 种模式:

  • 单脉冲模式

  • PWM 模式

  • 单次模式:在此模式下,当满足匹配条件时,输出可以切换高低电平(如果输出极性配置为高,则为低电平至高电平变化,反之亦然)

  • 编码器模式

  • 超时模式:有效的边沿触发输入可复位定时器。第一个触发事件将启动计时器,任何连续触发事件将重置计 数器并重新开始。

  • 计数器模式:计数器可用于计算来自 Input1 的外部事件或用于计算内部时钟周期

主要有以下三个使用场景,本文将介绍LPTIM超时唤醒的应用:

  • Asynchronous pulse counter in Stop mode(异步脉冲计数)

  • PWM generator in Stop mode(PWM输出)

  • Timeout wakeup mode(超时唤醒)

3 LPTIM初始化结构体

介绍下LPTIM初始化结构体各个参数的含义及配置

3.1 Clock

  • Clock用于设置时钟源和时钟分频

  • 其中,时钟源参数 Source 可以选择如下两种:

    • #define LPTIM_CLOCKSOURCE_APBCLOCK_LPOSC ((uint32_t)0x00U) 表示 LPTIM 由内部时钟源(APB 时钟或 APB 或 LSE、 LSI 和 HSI 等)提供时钟

    • #define LPTIM_CLOCKSOURCE_ULPTIM LPTIM_CFGR_CKSEL 表示 LPTIM 由外部时钟源通过 LPTIM 外部 Input1 提供时钟

  • Prescaler 时钟分频参数则可以选择八种,有1、2、4、8、16、32、64、128分频:

3.2 UltraLowPowerClock

  • UltraLowPowerClock参数仅在使用超低功耗时钟源时使用,用于设置所选择的外部时钟

  • 其中,时钟极性参数 Polarity 用于选择有效的时钟极性,如果使能了双边沿,Auxiliary Clock(一种低功耗振荡器)必须处于激活状态

  • SampleTime 参数用于配置时钟干扰滤波器

3.3 Trigger

  • Trigger 用于配置触发参数

  • 其中,Source 参数配置触发源,可选配置如下:

  • ActiveEdge 参数用于设置有效的触发边沿,可以选择上升沿,下降沿或者双边沿触发图片

  • SampleTime参数配置采样时间图片

3.4 OutputPolarity

  • OutputPolarity 用于配置输出极性,可选择高电平或者低电平输出图片

3.5 UpdateMode

  • UpdateMode用于配置是否立即更新自动重装寄存器和比较寄存器,可以选择立即更新,或者当前周期结束后更新图片

3.5 CounterSource

  • CounterSource用于配置定时器计数器在每个内部事件或者外部事件后递增计数,可以选择内部或者外部图片

3.6 Input1Source

  • Input1Source用于配置 Input1 的输入源,可以选择 GPIO,比较器输出或者 SAI FSA/FSB图片

3.7 Input2ource

  • Input2ource用于配置 Input2 的输入源,可以选择 GPIO 和比较器(注意:此参数仅用于编码器模式)图片

3 LPTIM 超时唤醒应用

需求:使用LPTIM1,在低功耗stop模式下定时1s,1s后将STM32从stop模式唤醒,并且点亮LED灯

3.1 LPTIM1时钟初始化

  • 配置LPTIM1时钟为LSE,即外部低速时钟32768Hz,也可配置为内部低速时钟LSI,修改对应配置即可

RCC_PeriphCLKInitTypeDef RCC_PeriphCLKInitStruct = {0};
RCC_OscInitTypeDef RCC_OscInitStruct = {0};
RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_LSE;
RCC_OscInitStruct.LSEState = RCC_LSE_ON;
RCC_OscInitStruct.PLL.PLLState = RCC_PLL_NONE;
if (HAL_RCC_OscConfig(&RCC_OscInitStruct)!= HAL_OK)
{
Error_Handler(__FILE__, __LINE__);
}
RCC_PeriphCLKInitStruct.PeriphClockSelection = RCC_PERIPHCLK_LPTIM1;
RCC_PeriphCLKInitStruct.Lptim1ClockSelection = RCC_LPTIM1CLKSOURCE_LSE;
HAL_RCCEx_PeriphCLKConfig(&RCC_PeriphCLKInitStruct);

3.2 LPTIM1初始化

  • 按上面概述的参数配置,对LPTIM1进行配置如下

LPTIM_HandleTypeDef hlptim1;


void MX_LPTIM1_Init(void)

{

  hlptim1.Instance = LPTIM1;

  hlptim1.Init.Clock.Source = LPTIM_CLOCKSOURCE_APBCLOCK_LPOSC;  //选择内部时钟源

  hlptim1.Init.Clock.Prescaler = LPTIM_PRESCALER_DIV64;           //设置LPTIM时钟分频

  hlptim1.Init.Trigger.Source = LPTIM_TRIGSOURCE_SOFTWARE;                        //设置软件触发

  hlptim1.Init.Trigger.ActiveEdge = LPTIM_ACTIVEEDGE_RISING;                      //设置上升沿触发

  hlptim1.Init.Trigger.SampleTime = LPTIM_TRIGSAMPLETIME_DIRECTTRANSITION;        //设置时钟干扰滤波器

  hlptim1.Init.OutputPolarity = LPTIM_OUTPUTPOLARITY_HIGH;     //设置输出高电平

  hlptim1.Init.UpdateMode = LPTIM_UPDATE_IMMEDIATE;            //比较寄存器和ARR自动重载寄存器选择更改后立即更新

  hlptim1.Init.CounterSource = LPTIM_COUNTERSOURCE_INTERNAL;   //LPTIM计数器对内部时钟源计数

  hlptim1.Init.Input1Source = LPTIM_INPUT1SOURCE_GPIO;         //外部输入1,本配置未使用

  hlptim1.Init.Input2Source = LPTIM_INPUT2SOURCE_GPIO;         //外部输入2,本配置未使用

  if (HAL_LPTIM_Init(&hlptim1) != HAL_OK)

  {

    while (1)

    {

      Error_Handler(__FILE__, __LINE__);

    }

  }

}


  • 当 HAL_LPTIM_Init()运行时会调用 HAL_LPTIM_MspInit()函数,这是一个虚函数,还需要我们重新定义,开启LPTIM时钟及 LPTIM1_IRQn 初始化

void HAL_LPTIM_MspInit(LPTIM_HandleTypeDef* hlptim)
{
  if(hlptim->Instance==LPTIM1)
  {
    /* Peripheral clock enable */
    __HAL_RCC_LPTIM1_CLK_ENABLE();

    /* Peripheral interrupt init */
    HAL_NVIC_SetPriority(LPTIM1_IRQn, 0, 0);
    HAL_NVIC_EnableIRQ(LPTIM1_IRQn);
  }
}

3.3 中断函数

  • 编写中断回调函数,当定时时间到,点亮LED灯

void LPTIM1_IRQHandler(void)
{
  HAL_LPTIM_IRQHandler(&hlptim1);
}

void HAL_LPTIM_CompareMatchCallback(LPTIM_HandleTypeDef *hlptim)
{
  /* Timeout was reached, turn on LED */
  BSP_LED_On();
}

3.4 开启定时器

  • 开启定时器及进入stop模式

#define PERIOD  65535
#define PULSE  32767 
HAL_LPTIM_TimeOut_Start_IT(&hlptim1, PERIOD, PULSE);

HAL_PWREx_EnterSTOP2Mode(PWR_STOPENTRY_WFI);
  • 第1个参数是 LPTIM_HandleTypeDef 类型结构体指针变量

  • 第2个参数是低功耗定时器的周期配置,范围 0 – 0xFFFF。

  • 第3个参数是低功耗定时器的超时时间配置,范围 0 -0xFFFF。

  • 返回值,返回 HAL_ERROR 表示配置失败,HAL_OK 表示配置成功,HAL_BUSY 表示忙(操作中),HAL_TIMEOUT 表示时间溢出

  • 超时时间由 Compare 寄存器决定,即第3个参数,超时配置用不到第2个参数

  • 超时时间计算方式:timeout = (Compare + 1) / LSE_Frequency,如配置Compare = 32767,LSE = 32768Hz,则超时时间为1s

4 踩坑记录

  • 在使用官方例程的时候,不能触发定时中断,将触发源由 LPTIM_TRIGSOURCE_0 改为 LPTIM_TRIGSOURCE_SOFTWARE

  • 移植官方例程时,未在 stm32l4xx_hal_conf.h 文件内打开LPTIM 外设的宏定义,导致一直报错图片

    图片

  • 配置定时时间时候,未注意到参数范围是 0 -0xFFFF ,导致达不到自己想要的定时时间,最大可配置为65535,在Prescaler参数配置为 LPTIM_PRESCALER_DIV1 1分频的时候,超时时间最大为(65535+1)/32768 = 2s


推荐阅读

史海拾趣

Exclara Inc公司的发展小趣事

随着技术的不断成熟和产品的日益完善,Exclara开始将目光投向全球市场。公司积极拓展海外市场,通过参加国际展会、与当地合作伙伴建立战略合作关系等方式,不断提升品牌知名度和市场份额。同时,公司也在全球范围内建立了完善的销售网络和售后服务体系,以确保客户能够享受到优质的产品和服务。

Dresden Elektronik公司的发展小趣事

在技术和产品的双重驱动下,Dresden Elektronik公司开始积极拓展市场。他们不仅在国内市场上取得了显著的成绩,还积极开拓国际市场。通过参加国际展会、与跨国企业合作等方式,公司的知名度和影响力逐渐提升,市场份额也不断扩大。

Ferranti Electric Inc公司的发展小趣事

Ferranti Electric Inc公司的历史可追溯到1880年,由Sebastian Ziani de Ferranti(塞巴斯蒂安·齐亚尼·德·费兰蒂)在英国创立。作为发电机及壳式变压器的发明者之一,费兰蒂博士不仅拥有交流发电机、高压电缆、断路器等176项专利,而且他的创新精神也为公司的创立和发展奠定了坚实的基础。初创时期,公司就专注于电气产品的研发和生产,逐渐在电气行业崭露头角。

Bombardier Inc公司的发展小趣事

除了航空领域,庞巴迪公司在铁路运输方面也取得了重要进展。其生产的CITYFLO系列自动列车控制系统在全球范围内得到了广泛应用。该系统采用了先进的电子技术和算法,实现了列车的自动驾驶和精确控制,大大提高了铁路运输的安全性和效率。此外,庞巴迪还生产了各种铁路车辆和相关电子设备,为全球铁路运输业的发展做出了重要贡献。

以上五个故事展示了庞巴迪公司在电子行业发展中的关键历程和成就。从水上飞机到现代商用喷气客机,从航空电子系统到铁路运输控制系统,庞巴迪凭借其卓越的技术实力和创新能力,在电子行业中树立了杰出的品牌形象。

Everspin公司的发展小趣事

Everspin与众多知名企业和机构建立了合作伙伴关系,如戴尔电脑、Koyo Electronics Industries等。这些合作伙伴的认可和支持不仅为Everspin带来了更多的商业机会,也进一步提升了其在行业中的影响力。同时,Everspin还积极与客户沟通合作,根据客户需求提供定制化的解决方案,赢得了客户的广泛赞誉。

DEVCON公司的发展小趣事

随着电子行业的快速发展,对材料性能的要求也越来越高。DEVCON公司不断投入研发力量,通过技术创新,成功开发出了一系列具有高性能、高可靠性的新材料。其中,甲基丙烯甲酸甲酯、环氧类、改性硅烷密封胶等产品,因其优异的性能和广泛的应用前景,成为了电子行业的明星产品。这些技术突破不仅提升了DEVCON公司的竞争力,也为整个电子行业的发展做出了重要贡献。

问答坊 | AI 解惑

我国广播电视直播卫星 中星9号

中星九号广播电视直播卫星点火发射| “中星九号”广播电视直播卫星(腾讯科技配图) 2008年6月9日20时15分,“中星九号”广播电视直播卫星点火发射。 中新网西昌六月九日电(唐振宇 齐彬)北京时间六月九日晚八时十五分,中国在西昌用“长征三号 ...…

查看全部问答>

小型变压器的绕制

本帖最后由 paulhyde 于 2014-9-15 09:26 编辑 小型变压器的绕制  …

查看全部问答>

哪位大虾了解EM78P458单片机

在网上很少有其资料。还有这种51内核20引脚的单片机如果用40引脚的开发办可以烧写程序么?…

查看全部问答>

今天做了个网口转串口模块

郁闷的是我只能做到双向9600bps,单向115200bps,人家8位单片机都能做到双向56000bps,受打击了,我再优化算法。。。。       2011.1.8总结汇报,这个模块已经完成了很久了,当时主要问题不是8962或者算法的问题,而是上位机测试 ...…

查看全部问答>

printf 和 RETAILMSG 打印出来的消息不一致?

wince6.0 下win32 api 写的代码。 char inFilename[128]; memset(inFilename, 0x00, sizeof(inFilename)); wcscpy(inFilename,_T(\"\\\\Temp\\\\test_420_1599_1198.jpg\")); DNW串口打印消息: RETAILMSG(1,(TEXT(\"[RETAILMSG] inFilename : ...…

查看全部问答>

Linux下如何检测SATA热插拔?

我们的程序需要时钟保持着对SATA硬盘的检测,当硬盘被拔掉或者插上时,都应该要有提示信息。那么在Linux下面,我需要去读取、检测哪儿才能获取该信息呢?如果有人对USB的热插拔也比较了解的,欢迎过来帮我扫盲!(我大致看了驱动层,整个SATA的中断 ...…

查看全部问答>

ADS scatter描述文件

在ADS的“ARM Link”中设置 “-info totals -info unused -entry 0x40000000 -mangled -map -symbols -scatter D:\\work-wincetest\\uC-GUI\\ucosforphilips\\scatter.scf -info veneers -info sizes -xref  -callgraph” 生成了EXET_E ...…

查看全部问答>

PDA图像显示问题

在EVC4下做图像显示当图像大小大于1M时,图片无法加载,请问高手怎么解决~ 格式是JPG…

查看全部问答>

关于vxworks中网络的问题?

小弟最近研究vxworks时遇到一个问题,请大侠们多指教! 我的板子把ip地址设置成192.168.1.135,子网掩码设置为255.255.0.0,主机ip为192.168.1.45,子网掩码是255.255.0.0,我从板子上去ping主机,出现问题,ping不通,而相同情况下板子跑linux系统 ...…

查看全部问答>

关于PROTEL封装的问题

LPC2131,AD9833,AD5231三款芯片,技术文档上面说它们的封装形式分别为LQFP64,uSOIC10,uSOIC16,但将这些直接填到元件footprint一栏并生成网表后,装载网表时却全部报错,说没有这种封装形式! 请问如何解决?…

查看全部问答>