[STM32L5] 【STM32L562 DK试用】低功耗模式

[复制链接]
 楼主| lishuihua 发表于 2025-3-8 11:34 | 显示全部楼层 |阅读模式
<
本次体验L5的低功耗特性以及休眠唤醒的工作模式。

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

  5.   /** Configure the main internal regulator output voltage
  6.   */
  7.   if (HAL_PWREx_ControlVoltageScaling(PWR_REGULATOR_VOLTAGE_SCALE0) != HAL_OK)
  8.   {
  9.     Error_Handler();
  10.   }

  11.   /** Initializes the RCC Oscillators according to the specified parameters
  12.   * in the RCC_OscInitTypeDef structure.
  13.   */
  14.   RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_MSI;
  15.   RCC_OscInitStruct.MSIState = RCC_MSI_ON;
  16.   RCC_OscInitStruct.MSICalibrationValue = RCC_MSICALIBRATION_DEFAULT;
  17.   RCC_OscInitStruct.MSIClockRange = RCC_MSIRANGE_6;
  18.   RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
  19.   RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_MSI;
  20.   RCC_OscInitStruct.PLL.PLLM = 1;
  21.   RCC_OscInitStruct.PLL.PLLN = 55;
  22.   RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV7;
  23.   RCC_OscInitStruct.PLL.PLLQ = RCC_PLLQ_DIV2;
  24.   RCC_OscInitStruct.PLL.PLLR = RCC_PLLR_DIV2;
  25.   if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
  26.   {
  27.     Error_Handler();
  28.   }

  29.   /** Initializes the CPU, AHB and APB buses clocks
  30.   */
  31.   RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
  32.                               |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;
  33.   RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
  34.   RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
  35.   RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;
  36.   RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;

  37.   if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_5) != HAL_OK)
  38.   {
  39.     Error_Handler();
  40.   }
  41. }


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

  8.   /* Enable the BUTTON clock */
  9.   BUTTON_USER_GPIO_CLK_ENABLE();

  10.   GPIO_Init.Pin   = BUTTON_PIN[Button];
  11.   GPIO_Init.Pull  = GPIO_NOPULL;
  12.   GPIO_Init.Speed = GPIO_SPEED_FREQ_HIGH;

  13.   if (ButtonMode == BUTTON_MODE_GPIO)
  14.   {
  15.     /* Configure Button pin as input */
  16.     GPIO_Init.Mode = GPIO_MODE_INPUT;
  17.     HAL_GPIO_Init(BUTTON_PORT[Button], &GPIO_Init);
  18.   }

  19.   if (ButtonMode == BUTTON_MODE_EXTI)
  20.   {
  21.     /* Configure Button pin as input with External interrupt */
  22.     GPIO_Init.Mode = GPIO_MODE_IT_RISING;
  23.     HAL_GPIO_Init(BUTTON_PORT[Button], &GPIO_Init);

  24.     if (HAL_EXTI_GetHandle(&hpb_exti[Button], BUTTON_EXTI_LINE[Button]) == HAL_OK)
  25.     {
  26.       if (HAL_EXTI_RegisterCallback(&hpb_exti[Button], HAL_EXTI_RISING_CB_ID, ButtonCallback[Button]) == HAL_OK)
  27.       {
  28.         /* Enable and set Button EXTI Interrupt to the lowest priority */
  29.         HAL_NVIC_SetPriority(BUTTON_IRQn[Button], BSP_BUTTON_IT_PRIO[Button], 0x00);
  30.         HAL_NVIC_EnableIRQ(BUTTON_IRQn[Button]);
  31.       }
  32.       else
  33.       {
  34.         status = BSP_ERROR_PERIPH_FAILURE;
  35.       }
  36.     }
  37.     else
  38.     {
  39.       status = BSP_ERROR_PERIPH_FAILURE;
  40.     }
  41.   }

  42.   return status;
  43. }

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

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

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

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

  14.     /* Resume Tick interrupt if disabled prior to SLEEP mode entry */
  15.     HAL_ResumeTick();
  16.    
  17.     /* Re-configure LED10 */
  18.     BSP_LED_Init(LED10);
  19.   }

烧录验证:
WeChat_20250307232515-ezgif.com-video-to-gif-converter.gif
WeChat_20250307232515-ezgif.com-video-to-gif-converter.gif
您需要登录后才可以回帖 登录 | 注册

本版积分规则

9

主题

31

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部