本次体验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[BUTTONn] = {BSP_BUTTON_USER_IT_PRIORITY};
- uint32_t BUTTON_EXTI_LINE[BUTTONn] = {BUTTON_USER_EXTI_LINE};
- BSP_EXTI_LineCallback ButtonCallback[BUTTONn] = {BUTTON_USER_EXTI_Callback};
- /* Enable the BUTTON clock */
- BUTTON_USER_GPIO_CLK_ENABLE();
- GPIO_Init.Pin = BUTTON_PIN[Button];
- 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[Button], &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[Button], &GPIO_Init);
- if (HAL_EXTI_GetHandle(&hpb_exti[Button], BUTTON_EXTI_LINE[Button]) == HAL_OK)
- {
- if (HAL_EXTI_RegisterCallback(&hpb_exti[Button], HAL_EXTI_RISING_CB_ID, ButtonCallback[Button]) == HAL_OK)
- {
- /* Enable and set Button EXTI Interrupt to the lowest priority */
- HAL_NVIC_SetPriority(BUTTON_IRQn[Button], BSP_BUTTON_IT_PRIO[Button], 0x00);
- HAL_NVIC_EnableIRQ(BUTTON_IRQn[Button]);
- }
- 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);
- }
烧录验证:
|