代码流程如下:
graph LR;
Init(初始化)-->StartLPTIM(启动LPTIM)-->EnterStopMode(进入Stop1模式)-->WakeUp(唤醒设备)-->Blink(LED灯闪烁)
理论情况下进入Stop1模式之后,触发LPTIM中断应该会唤醒设备,然后LED0和LED1会同时闪烁,但进入Stop1模式之后就无法唤醒设备了,如果不进入低功耗模式LED就正常闪烁。主要代码如下:
LPTIM_HandleTypeDef hlptim1;
int main()
{
HAL_Init();
SystemClock_Config();
SystemPower_Config();
MX_GPIO_Init();
MX_ICACHE_Init();
MX_LPTIM1_Init();
HAL_LPTIM_TimeOut_Start_IT(&hlptim1,1000);
HAL_PWREx_EnterSTOP1Mode(PWR_STOPENTRY_WFI);
while (1)
{
HAL_Delay(1000);
HAL_GPIO_TogglePin(LED0_GPIO_Port,LED0_Pin);
}
}
void HAL_LPTIM_CompareMatchCallback(LPTIM_HandleTypeDef *hlptim)
{
HAL_GPIO_TogglePin(LED1_GPIO_Port,LED1_Pin);
}
// LPTIM初始化
static void MX_LPTIM1_Init(void)
{
hlptim1.Instance = LPTIM1;
hlptim1.Init.Clock.Source = LPTIM_CLOCKSOURCE_APBCLOCK_LPOSC;
hlptim1.Init.Clock.Prescaler = LPTIM_PRESCALER_DIV32;
hlptim1.Init.Trigger.Source = LPTIM_TRIGSOURCE_SOFTWARE;
hlptim1.Init.UpdateMode = LPTIM_UPDATE_IMMEDIATE;
hlptim1.Init.CounterSource = LPTIM_COUNTERSOURCE_INTERNAL;
hlptim1.Init.Input1Source = LPTIM_INPUT1SOURCE_GPIO;
hlptim1.Init.Input2Source = LPTIM_INPUT2SOURCE_GPIO;
if (HAL_LPTIM_Init(&hlptim1) != HAL_OK)
{
Error_Handler();
}
}
void HAL_LPTIM_MspInit(LPTIM_HandleTypeDef* hlptim)
{
RCC_PeriphCLKInitTypeDef PeriphClkInit = {0};
if(hlptim->Instance==LPTIM1)
{
PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_LPTIM1;
PeriphClkInit.Lptim1ClockSelection = RCC_LPTIM1CLKSOURCE_LSI;
if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit) != HAL_OK)
{
Error_Handler();
}
__HAL_RCC_LPTIM1_CLK_ENABLE();
HAL_NVIC_SetPriority(LPTIM1_IRQn, 0, 0);
HAL_NVIC_EnableIRQ(LPTIM1_IRQn);
}
}
|
HAL_SuspendTick();
__HAL_RCC_PWR_CLK_ENABLE();
HAL_PWREx_EnterSTOP1Mode(PWR_STOPENTRY_WFI);
另外,注意为LPTIM选择合适的时钟源。
能进入STOP模式,只是不能够唤醒,LPTIM我用的是LSI,LSE我也试过也不行
用同样的配置lptim1、2、3、4里,lptim2可以唤醒stop模式,其他都不行
在使用LPTIM1、3、4的时候需要在RCC_SRDAMR寄存器中设置LPTIMAMEN位,以在STOP下启用自主模式,__HAL_RCC_LPTIM1_CLKAM_ENABLE()来操作。