说明:
官方例子LPTIM_Timeout
使用LPTIM的好处是系统处于睡眠,停机状态可以正常工作(除了待机模式)。
这个例子实现这样一个功能,配置LPTIM的溢出时间是1s,采用LSI作为时钟,然后配置芯片工作地低功耗状态。在PG14引脚第1次检查到触发信号,LPTIM就开始工作了,在1s的溢出时间内检测到的触发信号都将将复位计数,定时器重新开始工作。如果1s内没有再接收到触发信号,仅进入溢出中断。
测试代码:
此功能重点还是函数HAL_LPTIM_Init的参数配置学习。
/* Private typedef -----------------------------------------------------------*/
/* Private define ------------------------------------------------------------*/
/* Set the Maximum value of the counter (Auto-Reload) that defines the Period */
#define Period (uint32_t) 65535
/* Set the Timeout value */
#define Timeout (uint32_t) (32768 - 1)
/* Private macro -------------------------------------------------------------*/
/* Private variables ---------------------------------------------------------*/
/* LPTIM handle declaration */
LPTIM_HandleTypeDef LptimHandle;
/* Clocks structure declaration */
RCC_PeriphCLKInitTypeDef RCC_PeriphCLKInitStruct;
/* Private function prototypes -----------------------------------------------*/
static void SystemClock_Config(void);
static void LSI_ClockEnable(void);
static void Error_Handler(void);
static void CPU_CACHE_Enable(void);
/* Private functions ---------------------------------------------------------*/
/**
* @brief Main program
* @param None
* @retval None
*/
int main(void)
{
/* This sample code shows how to use STM32H7xx LPTIM HAL API to generate a
PWM at the lowest power consumption, using an external counter clock, in
Low Power mode (STOP mode).*/
/* Enable the CPU Cache */
CPU_CACHE_Enable();
/* STM32H7xx HAL library initialization:
- Systick timer is configured by default as source of time base, but user
can eventually implement his proper time base source (a general purpose
timer for example or other time source), keeping in mind that Time base
duration should be kept 1ms since PPP_TIMEOUT_VALUEs are defined and
handled in milliseconds basis.
- Set NVIC Group Priority to 4
- Low Level Initialization
*/
HAL_Init();
/* Configure the system clock to 400 MHz */
SystemClock_Config();
/* Initialize LED2 */
BSP_LED_Init(LED2);
/* Enable the LSI source */
LSI_ClockEnable();
/* ### - 1 - Re-target the LSI to Clock the LPTIM Counter ################# */
/* Select the LSI clock as LPTIM peripheral clock */
RCC_PeriphCLKInitStruct.PeriphClockSelection = RCC_PERIPHCLK_LPTIM1;
RCC_PeriphCLKInitStruct.Lptim1ClockSelection = RCC_LPTIM1CLKSOURCE_LSI;
HAL_RCCEx_PeriphCLKConfig(&RCC_PeriphCLKInitStruct);
/* ### - 2 - Initialize LPTIM peripheral ################################## */
/*
* Instance = LPTIM1.
* Clock Source = APB or LowPowerOSCillator
* Counter source = Internal event.
* Clock prescaler = 1 (No division).
* Counter Trigger = Trigger1: PG.14
* Active Edge = Rising edge.
*/
LptimHandle.Instance = LPTIM1;
LptimHandle.Init.Clock.Source = LPTIM_CLOCKSOURCE_APBCLOCK_LPOSC;
LptimHandle.Init.Clock.Prescaler = LPTIM_PRESCALER_DIV1;
LptimHandle.Init.Trigger.Source = LPTIM_TRIGSOURCE_0;
LptimHandle.Init.Trigger.ActiveEdge = LPTIM_ACTIVEEDGE_RISING;
LptimHandle.Init.CounterSource = LPTIM_COUNTERSOURCE_INTERNAL;
LptimHandle.Init.Input1Source = LPTIM_INPUT1SOURCE_GPIO;
LptimHandle.Init.Input2Source = LPTIM_INPUT2SOURCE_GPIO;
/* Initialize LPTIM peripheral according to the passed parameters */
if (HAL_LPTIM_Init(&LptimHandle) != HAL_OK)
{
Error_Handler();
}
/* ### - 3 - Start the Timeout function in interrupt mode ################# */
/*
* Period = 65535
* Pulse = 32767
* According to this configuration (LPTIMER clocked by LSI & compare = 32767,
* the Timeout period = (compare + 1)/LSI_Frequency = 1s
*/
if (HAL_LPTIM_TimeOut_Start_IT(&LptimHandle, Period, Timeout) != HAL_OK)
{
Error_Handler();
}
/* ### - 4 - Enter in Stop mode ########################################### */
HAL_PWR_EnterSTOPMode(PWR_LOWPOWERREGULATOR_ON, PWR_STOPENTRY_WFI);
/* Infinite Loop */
while (1)
{
}
}
/**
* @brief Enable External Low Speed Clock (LSI)
* @param None
* @retval None
*/
static void LSI_ClockEnable(void)
{
RCC_OscInitTypeDef RCC_OscInitStruct;
/* Enable LSI clock */
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();
}
} |