stm32l0_StudyNote

STM32L0系列 - LPTIM

LPTIM介绍

  • LPTIM是一个16位的定时器,可多个时钟源,可在所有电源模式下(除Standby模式下)可以保持运行状态,几遍没有内部时钟源,LPTIM已经可以运行。主要用于脉冲计数器、低功耗模式下唤醒、超时功能等。

LPTIM的主要特性

  • 16位的递增计数器

  • 3位预分频器,可以采用8种分频(1、2、4、8、16、32、64、128)

  • 可选时钟源

    • 内部时钟源:LSE、LSI、HSI16或者APB时钟
    • ULPTIM输入的外部时钟源(计数器使用)
  • 16位的ARR自动重载寄存器

  • 16位比较寄存器

  • 连续、单次触发模式

  • 可选软件、硬件输入触发

  • 可编程的数字干扰滤波器

  • 可 配置的输出:脉冲、PWM

  • 可配置I/O的极性

  • 编码器模式

LPTIM框图

LPTIM的工作模式

LPTIM支持以下两种工作模式:

  • 连续模式:定时器自由运行,由触发时间启动并且到禁止之后才会停止
  • 单触发模式:定时器由触发时间启动,当达到ARR值的时候停止

LPTIME 的Timeout模式

功能简介

  • 用于Stop模式下计数器保持&唤醒

    代码介绍与初始化过程

  • 1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    /* ## - 1 -  系统时钟初始化############################################ */
    SystemClock_Config();
    /* ## - 2 - 设置LPTIM输入时钟源为HSI ############################################ */
    PeriphClkInit.LptimClockSelection = RCC_LPTIM1CLKSOURCE_HSI;
    HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit);
    /* ## - 3 - 设置LPTIM相关参数############################################ */
    hlptim1.Instance = LPTIM1;//选择LPTIM
    hlptim1.Init.Clock.Source = LPTIM_CLOCKSOURCE_APBCLOCK_LPOSC;//选择时钟源
    hlptim1.Init.Clock.Prescaler = LPTIM_PRESCALER_DIV128;//设置分频系数
    hlptim1.Init.Trigger.Source = LPTIM_TRIGSOURCE_SOFTWARE;//设置触发源
    hlptim1.Init.OutputPolarity = LPTIM_OUTPUTPOLARITY_HIGH;//指定的输出电平
    hlptim1.Init.UpdateMode = LPTIM_UPDATE_IMMEDIATE;//更新模式:立即更新或者结束之后更新
    hlptim1.Init.CounterSource = LPTIM_COUNTERSOURCE_INTERNAL;//计数器源:内部或者外部
    HAL_LPTIM_Init(&hlptim1);
    /* ## - 4 - 使能LPTIME 外设时钟############################################ */
    __HAL_RCC_LPTIM1_CLK_ENABLE();
    /* ## - 5 - 设置LPTIM中断优先级############################################ */
    HAL_NVIC_SetPriority(LPTIM1_IRQn, 1, 0);
    HAL_NVIC_EnableIRQ(LPTIM1_IRQn);
    /* ## - 6 - 添加中断服务函数############################################ */
    void LPTIM1_IRQHandler(void);
    /* ## - 7 - 开启Timeout中断############################################ */
    /**
    * @brief 设置TimeOut中断,任意的一个翻转事件会重启计数器
    * @param LPTIME句柄
    * @param 自动重装载值:当计数器Count累加到重装载值之后为0,自动重新装载(最大0Xffff)
    * @param Timeout计数器:当计数器累加到此值时,重启计数器
    * 小于自动重装载值,小于0XFFFF
    * @retval 函数的成功与失败
    * @callback HAL_LPTIM_CompareMatchCallback
    * @example 假设LPtim的时钟是HSI(16M),LPTIM进行128分频,那么FCount = 0.125Mhz = 125khz
    * 当 T =50000/125kHz = 之后重新加载,产生中断 ;当T= 12500 /125kHz之后,唤醒MCU
    * @Wakeup 以Period为周期,当Count小于Timeout时,继续低功耗;当Count大于Timeout时,退出低功 耗模式
    */
    HAL_LPTIM_TimeOut_Start_IT(&hlptim1,
    50000-1,//0.4s
    12500-1);//0.1s
    /* ## - 8 - 编写callback函数############################################ */
    void HAL_LPTIM_CompareMatchCallback(LPTIM_HandleTypeDef *hlptim)
    {
    printf("HAL_LPTIM_CompareMatchCallback\r\n");
    S_LpTIM_Config.Counter = HAL_LPTIM_ReadCounter(&hlptim1);
    S_LpTIM_Config.AutoReload = HAL_LPTIM_ReadAutoReload(&hlptim1);
    S_LpTIM_Config.Compare = HAL_LPTIM_ReadCompare(&hlptim1);
    HAL_GPIO_TogglePin(LD2_GPIO_Port, LD2_Pin);
    }

参考代码地址