lishuihua 发表于 2025-3-8 11:34

【STM32L562 DK试用】低功耗模式

本次体验L5的低功耗特性以及休眠唤醒的工作模式。

在相关软件中将系统时钟设置为110mhz。
void SystemClock_Config(void)
{
RCC_OscInitTypeDef RCC_OscInitStruct = {0};
RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};

/** Configure the main internal regulator output voltage
*/
if (HAL_PWREx_ControlVoltageScaling(PWR_REGULATOR_VOLTAGE_SCALE0) != HAL_OK)
{
    Error_Handler();
}

/** Initializes the RCC Oscillators according to the specified parameters
* in the RCC_OscInitTypeDef structure.
*/
RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_MSI;
RCC_OscInitStruct.MSIState = RCC_MSI_ON;
RCC_OscInitStruct.MSICalibrationValue = RCC_MSICALIBRATION_DEFAULT;
RCC_OscInitStruct.MSIClockRange = RCC_MSIRANGE_6;
RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_MSI;
RCC_OscInitStruct.PLL.PLLM = 1;
RCC_OscInitStruct.PLL.PLLN = 55;
RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV7;
RCC_OscInitStruct.PLL.PLLQ = RCC_PLLQ_DIV2;
RCC_OscInitStruct.PLL.PLLR = RCC_PLLR_DIV2;
if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
{
    Error_Handler();
}

/** Initializes the CPU, AHB and APB buses clocks
*/
RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
                              |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;
RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;
RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;

if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_5) != HAL_OK)
{
    Error_Handler();
}
}

EXTI线路通过PC.13连接到用户按钮并进行配置按下键时在下降沿上产生中断。
int32_t BSP_PB_Init(Button_TypeDef Button, ButtonMode_TypeDef ButtonMode)
{
int32_t               status = BSP_ERROR_NONE;
GPIO_InitTypeDef      GPIO_Init;
uint32_t            BSP_BUTTON_IT_PRIO = {BSP_BUTTON_USER_IT_PRIORITY};
uint32_t            BUTTON_EXTI_LINE   = {BUTTON_USER_EXTI_LINE};
BSP_EXTI_LineCallback ButtonCallback   = {BUTTON_USER_EXTI_Callback};

/* Enable the BUTTON clock */
BUTTON_USER_GPIO_CLK_ENABLE();

GPIO_Init.Pin   = BUTTON_PIN;
GPIO_Init.Pull= GPIO_NOPULL;
GPIO_Init.Speed = GPIO_SPEED_FREQ_HIGH;

if (ButtonMode == BUTTON_MODE_GPIO)
{
    /* Configure Button pin as input */
    GPIO_Init.Mode = GPIO_MODE_INPUT;
    HAL_GPIO_Init(BUTTON_PORT, &GPIO_Init);
}

if (ButtonMode == BUTTON_MODE_EXTI)
{
    /* Configure Button pin as input with External interrupt */
    GPIO_Init.Mode = GPIO_MODE_IT_RISING;
    HAL_GPIO_Init(BUTTON_PORT, &GPIO_Init);

    if (HAL_EXTI_GetHandle(&hpb_exti, BUTTON_EXTI_LINE) == HAL_OK)
    {
      if (HAL_EXTI_RegisterCallback(&hpb_exti, HAL_EXTI_RISING_CB_ID, ButtonCallback) == HAL_OK)
      {
      /* Enable and set Button EXTI Interrupt to the lowest priority */
      HAL_NVIC_SetPriority(BUTTON_IRQn, BSP_BUTTON_IT_PRIO, 0x00);
      HAL_NVIC_EnableIRQ(BUTTON_IRQn);
      }
      else
      {
      status = BSP_ERROR_PERIPH_FAILURE;
      }
    }
    else
    {
      status = BSP_ERROR_PERIPH_FAILURE;
    }
}

return status;
}
SysTick每1毫秒产生一个中断,LED10被切换以指示MCU是否处于SLEEP模式或RUN模式。

开机后5秒,系统自动进入SLEEP模式LED10停止切换。用户按钮可以在任何时候按下唤醒系统。然后软件回到运行模式5秒,然后再次自动进入睡眠模式。
while (1)
{
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
    /* Insert 5 seconds delay */
    HAL_Delay(5000);
        BSP_LED_Off(LED10);
   
    /*Suspend Tick increment to prevent wakeup by Systick interrupt.
    Otherwise the Systick interrupt will wake up the device within 1ms (HAL time base)*/
    HAL_SuspendTick();

    /* Enter Sleep Mode , wake up is done once User push-button is pressed */
    HAL_PWR_EnterSLEEPMode(PWR_MAINREGULATOR_ON, PWR_SLEEPENTRY_WFI);

    /* Resume Tick interrupt if disabled prior to SLEEP mode entry */
    HAL_ResumeTick();
   
    /* Re-configure LED10 */
    BSP_LED_Init(LED10);
}
烧录验证:

页: [1]
查看完整版本: 【STM32L562 DK试用】低功耗模式