完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
目标实现:使用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 |
|
|
|
只有小组成员才能发言,加入小组>>
调试STM32H750的FMC总线读写PSRAM遇到的问题求解?
1614 浏览 1 评论
X-NUCLEO-IHM08M1板文档中输出电流为15Arms,15Arms是怎么得出来的呢?
1541 浏览 1 评论
970 浏览 2 评论
STM32F030F4 HSI时钟温度测试过不去是怎么回事?
682 浏览 2 评论
ST25R3916能否对ISO15693的标签芯片进行分区域写密码?
1592 浏览 2 评论
1863浏览 9评论
STM32仿真器是选择ST-LINK还是选择J-LINK?各有什么优势啊?
644浏览 4评论
STM32F0_TIM2输出pwm2后OLED变暗或者系统重启是怎么回事?
515浏览 3评论
531浏览 3评论
stm32cubemx生成mdk-arm v4项目文件无法打开是什么原因导致的?
504浏览 3评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-21 22:46 , Processed in 0.622431 second(s), Total 76, Slave 59 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号