【STM32H7教程】第38章 STM32H7的LPTIM低功耗定时器应用之超时唤醒

发布者:psi33最新更新时间:2023-07-11 来源: zhihu关键字:STM32H7  LPTIM  低功耗定时器 手机看文章 扫描二维码
随时随地手机看文章

38.1 初学者重要提示

学习本章节前,务必优先学习第36章,HAL库的几个常用API均作了讲解和举例。

使用LPTIM的好处是系统处于睡眠、停机状态依然可以正常工作(除了待机模式)。停机状态可以正常工作的关键是LSE,LSI时钟不会被关闭,同时也可以选择使用外部时钟源。

LPTIM的任何中断都可以唤醒停机模式。

STM32H7从停机模式唤醒后要重新配置系统时钟,这点跟F1,F4系列一样。

测试发现STM32H7的LPTIM1的中断可以唤醒停机模式,其它几个LPTIM2-5无法唤醒。详情记录看此贴:http://www.armbbs.cn/forum.php?mod=viewthread&tid=91064

38.2 低功耗定时器超时唤醒驱动设计

低功耗定时器超时唤醒驱动设计中有几个要注意的事项,下面逐一为大家做个说明。


38.2.1 低功耗定时器时钟选择

由前面的第36章节,我们知道LPTIM1的时钟可以由LSE,LSI,APB或者外部输入时钟提供。使用LSE,LSI或者外部输入的好处是停机状态下,LPTIM1也可以正常工作。


V7开发板使用的LSE晶振是32768Hz。

STM32H743的LSI频率约32KHz。

LPTIM1 – LPTIM5的频率都是100MHz。

System Clock source       = PLL (HSE)

SYSCLK(Hz)                = 400000000 (CPU Clock)

HCLK(Hz)                  = 200000000 (AXI and AHBs Clock)

AHB Prescaler             = 2

D1 APB3 Prescaler         = 2 (APB3 Clock  100MHz)

D2 APB1 Prescaler         = 2 (APB1 Clock  100MHz)

D2 APB2 Prescaler         = 2 (APB2 Clock  100MHz)

D3 APB4 Prescaler         = 2 (APB4 Clock  100MHz)


因为APB1 prescaler != 1, 所以 APB1上的TIMxCLK = APB1 x 2 = 200MHz; 不含这个总线下的LPTIM1

因为APB2 prescaler != 1, 所以 APB2上的TIMxCLK = APB2 x 2 = 200MHz;


APB4上面的TIMxCLK没有分频,所以就是100MHz;


APB1 定时器有 TIM2, TIM3 ,TIM4, TIM5, TIM6, TIM7, TIM12, TIM13, TIM14,LPTIM1

APB2 定时器有 TIM1, TIM8 , TIM15, TIM16,TIM17


APB4 定时器有 LPTIM2,LPTIM3,LPTIM4,LPTIM5

下面为大家讲解下使用LSE,LSI或者APB时钟的配置方法。


选择LSE的配置如下:


#define LPTIM_CLOCK_SOURCE_LSE     /* LSE 时钟32768Hz */


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);

特别注意程序中置红的地方,这几个地方很容易配置错。配置后LPTIM1就会将LSE作为系统时钟。


选择LSI的配置如下:


//#define LPTIM_CLOCK_SOURCE_LSI    /* LSI 时钟约32KHz */

RCC_PeriphCLKInitTypeDef   RCC_PeriphCLKInitStruct = {0};

RCC_OscInitTypeDef RCC_OscInitStruct = {0};


RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_LSI;

RCC_OscInitStruct.LSIState = RCC_LSI_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_LSI;

HAL_RCCEx_PeriphCLKConfig(&RCC_PeriphCLKInitStruct);

使用LSI作为LPTIM1的系统是要注意两点:


1、LSI的实现有一定的误差,具体范围在数据手册有给出,由于不支持温补,温度对其也是有影响的。

2、特别注意程序中置红的地方,这几个地方很容易跟LSE搞混淆(复制粘贴的时候容易搞错)。


选择APB时钟的配置如下:


RCC_PeriphCLKInitTypeDef   RCC_PeriphCLKInitStruct = {0};


RCC_PeriphCLKInitStruct.PeriphClockSelection = RCC_PERIPHCLK_LPTIM1;

RCC_PeriphCLKInitStruct.Lptim1ClockSelection = RCC_LPTIM1CLKSOURCE_D2PCLK1;

HAL_RCCEx_PeriphCLKConfig(&RCC_PeriphCLKInitStruct);

使用APB作为LPTIM系统时钟注意以下两点:


1、 LPTIM1 – LPTIM5的最高主频都是100MHz。


2、 注意参数RCC_LPTIM1CLKSOURCE_D2PCLK1。


LPTIM1使用的RCC_LPTIM1CLKSOURCE_D2PCLK1。


LPTIM2使用的RCC_LPTIM2CLKSOURCE_D3PCLK1。


LPTIM3-LPTIM5使用的RCC_LPTIM345CLKSOURCE_D3PCLK1。


38.2.2 低功耗定时器超时模式配置

下面使用LSE做低功耗定时器的系统时钟,做了8分频,并开启LPTIM1的超时中断。


1.    /* 选择LPTIM的时钟源 */

2.    #define LPTIM_CLOCK_SOURCE_LSE     /* LSE 时钟32768Hz */

3.    //#define LPTIM_CLOCK_SOURCE_LSI   /* LSI 时钟32768Hz */ 

4.    //#define LPTIM_CLOCK_SOURCE_PCLK  /* PCLK 时钟100MHz */ 

5.    

6.    LPTIM_HandleTypeDef     LptimHandle = {0};

7.    

8.    /*

9.    ******************************************************************************************************

10.    *    函 数 名: bsp_InitLPTIM

11.    *    功能说明: 初始化LPTIM

12.    *    形    参: 无

13.    *    返 回 值: 无

14.    ******************************************************************************************************

15.    */

16.    void bsp_InitLPTIM(void)

17.    {

18.        RCC_PeriphCLKInitTypeDef   RCC_PeriphCLKInitStruct = {0};

19.        

20.    

21.        /* ## - 1 - 使能LPTIM时钟和GPIO时钟 ####################################### */

22.        __HAL_RCC_LPTIM1_CLK_ENABLE();

23.    

24.        /* ## - 2 - 配置LPTIM时钟,可以选择LSE,LSI或者PCLK ######################## */        

25.    #if defined (LPTIM_CLOCK_SOURCE_LSE)

26.        {

27.            RCC_OscInitTypeDef RCC_OscInitStruct = {0};

28.    

29.            RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_LSE;

30.            RCC_OscInitStruct.LSEState = RCC_LSE_ON;

31.            RCC_OscInitStruct.PLL.PLLState = RCC_PLL_NONE;

32.    

33.            if (HAL_RCC_OscConfig(&RCC_OscInitStruct)!= HAL_OK)

34.            {

35.                Error_Handler(__FILE__, __LINE__);        

36.            }

37.            

38.            RCC_PeriphCLKInitStruct.PeriphClockSelection = RCC_PERIPHCLK_LPTIM1;

39.            RCC_PeriphCLKInitStruct.Lptim1ClockSelection = RCC_LPTIM1CLKSOURCE_LSE;

40.            HAL_RCCEx_PeriphCLKConfig(&RCC_PeriphCLKInitStruct);

41.        }

42.    #elif defined (LPTIM_CLOCK_SOURCE_LSI)

43.        {

44.            RCC_OscInitTypeDef RCC_OscInitStruct = {0};

45.    

46.            RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_LSI;

47.            RCC_OscInitStruct.LSIState = RCC_LSI_ON;

48.            RCC_OscInitStruct.PLL.PLLState = RCC_PLL_NONE;

49.    

50.            if (HAL_RCC_OscConfig(&RCC_OscInitStruct)!= HAL_OK)

51.            {

52.                Error_Handler(__FILE__, __LINE__);        

53.            }

54.            

55.            RCC_PeriphCLKInitStruct.PeriphClockSelection = RCC_PERIPHCLK_LPTIM1;

56.            RCC_PeriphCLKInitStruct.Lptim1ClockSelection = RCC_LPTIM1CLKSOURCE_LSI;

57.            HAL_RCCEx_PeriphCLKConfig(&RCC_PeriphCLKInitStruct);

58.        }

59.    #elif defined (LPTIM_CLOCK_SOURCE_PCLK)

60.        RCC_PeriphCLKInitStruct.PeriphClockSelection = RCC_PERIPHCLK_LPTIM1;

61.        RCC_PeriphCLKInitStruct.Lptim1ClockSelection = RCC_LPTIM1CLKSOURCE_LSE;

62.        HAL_RCCEx_PeriphCLKConfig(&RCC_PeriphCLKInitStruct);

63.    #else

64.        #error Please select the LPTIM Clock source inside the bsp_lptim_pwm.c file

65.    #endif

66.    

67.        /* ## - 3 - 配置LPTIM ######################################################## */        

68.        LptimHandle.Instance = LPTIM1;

69.         /* 对应寄存器CKSEL,选择内部时钟源 */

70.        LptimHandle.Init.Clock.Source    = LPTIM_CLOCKSOURCE_APBCLOCK_LPOSC; 

71.         /* 设置LPTIM时钟分频 */

72.        LptimHandle.Init.Clock.Prescaler = LPTIM_PRESCALER_DIV8;  

73.         /* LPTIM计数器对内部时钟源计数 */      

74.        LptimHandle.Init.CounterSource   = LPTIM_COUNTERSOURCE_INTERNAL;

75.         /* 软件触发 */

76.        LptimHandle.Init.Trigger.Source  = LPTIM_TRIGSOURCE_SOFTWARE;

77.         /* 超时模式用不到这个配置 */ 

78.        LptimHandle.Init.OutputPolarity  = LPTIM_OUTPUTPOLARITY_HIGH;   

79.         /* 比较寄存器和ARR自动重载寄存器选择更改后立即更新 */

80.        LptimHandle.Init.UpdateMode      = LPTIM_UPDATE_IMMEDIATE;   

81.         /* 外部输入1,本配置未使用 */   

82.        LptimHandle.Init.Input1Source    = LPTIM_INPUT1SOURCE_GPIO;     

83.         /* 外部输入2,本配置未使用 */

84.        LptimHandle.Init.Input2Source    = LPTIM_INPUT2SOURCE_GPIO;     

85.    

86.        if (HAL_LPTIM_Init(&LptimHandle) != HAL_OK)

87.        {

88.            Error_Handler(__FILE__, __LINE__);

89.        }

90.    

91.        /* ## - 4 - 配置LPTIM ######################################################## */        

92.        /* 配置中断优先级并使能中断 */

93.        HAL_NVIC_SetPriority(LPTIM1_IRQn, 1, 0);

[1] [2] [3] [4]
关键字:STM32H7  LPTIM  低功耗定时器 引用地址:【STM32H7教程】第38章 STM32H7的LPTIM低功耗定时器应用之超时唤醒

上一篇:【STM32H7教程】第39章 STM32H7的DMAMUX基础知识(重要)
下一篇:【STM32H7教程】第37章 STM32H7的LPTIM低功耗定时器应用之PWM

推荐阅读最新更新时间:2024-11-08 19:54

信息安全专题 | 安全存储(1)STM32H7的密钥存储
使用STM32H7 安全新特性实现敏感数据(密钥)的安全存储与使用 密钥的安全存储与使用 安全通信、用户数据加密存储等都离不开密钥,密钥安全存储与使用是嵌入式系统中常见的安全功能需求之一。MCU上对于密钥的保护通常会从几个方面着眼 : 调试端口访问:避免通过调试端口获取密钥,通常通过调试端口保护机制来实现 软件代码访问:禁止任意软件直接读取密钥,避免由于软件漏洞可能带来的密钥被恶意代码获取的风险,可以通过隔离机制来实现 运行期间对密钥使用的保护:如果加解密操作通过软件实现,那么软件隔离机制是方法之一;如果加解密操作可以通过硬件单元完成,那么让密钥只能由硬件直接操作而不允许CPU/DMA访问也是一 种有效的方法 STM32H
[单片机]
信息安全专题 | 安全存储(1)<font color='red'>STM32H7</font>的密钥存储
STM32H7教程】第28章 STM32H7时间关键代码在ITCM执行的超简单方法
28.1 初学者重要提示 学习本章节前,务必优先学习第25章,了解TCM,SRAM等五块内存区的基础知识,比较重要。 TCM : Tightly-Coupled Memory 紧密耦合内存 。ITCM用于指令,DTCM用于数据,特点是跟内核速度一样(400MHz),而片上RAM的速度基本都达不到这个速度(200MHz)。很多时候我们希望将需要实时性的程序和变量分别放在ITCM和DTCM里面执行,本章就是解决这个问题。 实现方法比较简单,基于MDK的Option选项设置下即可,无需操作分散加载。使用分散加载的好处是灵活,在设置复杂工程的内存映射方面比较方便。 实现这个功能的关键是要把所有程序都下载到Flash,系统上电后让
[单片机]
【<font color='red'>STM32H7</font>教程】第28章 <font color='red'>STM32H7</font>时间关键代码在ITCM执行的超简单方法

推荐帖子

基于C2000内置12位ADC的电能计量方案
本应用笔记介绍了基于C2000内核和片内12位ADC实现软件电能计量的方案。C2000是德州仪器半导体有限公司生产的32位高性能实时微控制器,广泛应用于诸如马达驱动,数字电源等各种和功率控制相关的实时控制领域,而电能和功率的计算在以上应用中往往作为反馈控制的输入信号存在。因此,将软件电能计量算法集成到C2000平台上是实现各种实时控制SOC方案的关键。本文介绍了在C2000上实现软件计量算法的具体方法以及TI基于C2000的软件计量库的使用方法,同时给出了测试结果。1C2000计量库介
Aguilera 微控制器 MCU
变频器知识小结
什么叫变频器?变频器概念,变频器基本原理??VVVF是VariableVoltageandVariableFrequency的缩写,意为改变电压和改变频率,也就是人们所说的变压变频。??CVCF是ConstantVoltageandConstantFrequency的缩写,意为恒电压、恒频率,也就是人们所说的恒压恒频。??我们使用的电源分为交流电源和直流电源,一般的直流电源大多是由交流电源通过变压器变压,整流滤波后得到的。交流电源在人们使用电源中占总使
tiankai001 模拟电子
关于LPC1343开发板
今天管理员给我打电话了,要我分享相关的感想和资料,感到非常抱歉的是,由于一直忙于毕业答辩,没有来得及做相关的东西,今晚已经深夜,写点东西来弥补前一段的忙碌而带来的遗憾和歉意!既然电子工程世界赠送了开发板,就要用好它。但确实是太忙了,明天还要搬家,要离校了!!!一场场的散伙饭,一场场的酒场,也让我不得不放下手中的活和同学们一起。。。。。。毕竟将要分开了!废话不说了,说点关于LPC1343的东西,首先拿到板子之后来论坛里找了相关的资料和例程,迫不及待的点亮了板子上唯一的一个L
dxhuo NXP MCU
RC消火花电路的理解
最近,想研究一下rc电路,并阅读了不知道谁写的一本书《RC电路及其应用》,有了一点体会,描述如下.RC电路一大应用时消火花电路。产生火花电路大都是应用于感性负载,如电机、继电器线圈等如图所示,当开关k断开时候,根据楞次定律线圈两端产生感应电动势。他将和Vi叠加,其和加在开关两端,如果开关两端距离及其两端的电压达到一定的值,空气将被击穿放电,同时会伴有火花现象。这个时候,如果在下线圈两端加上rc电路以后,将减小甚至消灭火花现象的出现,也是我们希望得到的结果。原理是感应电动势形成原因是回路电流
wljmm 模拟电子
求助:输入是方波,输出如图变形,为什么?
输入是方波,输出如图变形,为什么求助:输入是方波,输出如图变形,为什么?这图画得……宽窄不一样,水平轴刻度不一。怎么看“变形”? 找到原因了,是其他支路干扰了
wensir 模拟电子
嘉楠K230 AI开发板测评2--GPIO、LED、按键、定时器
GPIO介绍 K230开发板总共引出了46个引脚,有常见的通用GPIO口、4路PWM、2路串口、1路SPI、I2C、I2S和4路的ADC,提供5V和3.3V的电源输出引脚对外供电,用常见的type-c引脚对开发板供电,方便简洁,GPIO引脚图如图1所示。 图1K230GPIO引脚图 点亮第一个LED CanMVK230有一个与GPIO直接连接的可控制LED蓝灯,其连接到GPIO52,其原理图如图2所示,从电路图可
dfjs 国产芯片交流
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved