stm32l431 使用wuk引脚唤醒待机模式 代码例子并详细解析
时间: 2023-08-16 18:05:25 浏览: 94
实验16 待机唤醒实验_wk_up按键_wkup功能_WKUP按键_stm32f1_
5星 · 资源好评率100%
好的,以下是 STM32L431 使用 WUK 引脚唤醒待机模式的代码例子及解析:
```c
#include "stm32l4xx_hal.h"
void SystemClock_Config(void);
static void MX_GPIO_Init(void);
int main(void)
{
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
// 配置WUK引脚
GPIO_InitTypeDef GPIO_InitStruct = {0};
GPIO_InitStruct.Pin = GPIO_PIN_13;
GPIO_InitStruct.Mode = GPIO_MODE_IT_RISING; // 上升沿触发
GPIO_InitStruct.Pull = GPIO_NOPULL;
HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
while (1)
{
// 进入待机模式
HAL_PWR_EnterSTANDBYMode();
}
}
void SystemClock_Config(void)
{
RCC_OscInitTypeDef RCC_OscInitStruct;
RCC_ClkInitTypeDef RCC_ClkInitStruct;
/** Configure LSE Drive Capability
*/
HAL_PWR_EnableBkUpAccess();
__HAL_RCC_LSEDRIVE_CONFIG(RCC_LSEDRIVE_LOW);
RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_LSE;
RCC_OscInitStruct.LSEState = RCC_LSE_ON;
RCC_OscInitStruct.PLL.PLLState = RCC_PLL_NONE;
if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
{
Error_Handler();
}
RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_SYSCLK|RCC_CLOCKTYPE_PCLK1;
RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_LSE;
RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;
if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_1) != HAL_OK)
{
Error_Handler();
}
}
static void MX_GPIO_Init(void)
{
/* GPIO Ports Clock Enable */
__HAL_RCC_GPIOC_CLK_ENABLE();
__HAL_RCC_GPIOA_CLK_ENABLE();
__HAL_RCC_GPIOB_CLK_ENABLE();
/*Configure GPIO pin Output Level */
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_RESET);
/*Configure GPIO pin : PA5 */
GPIO_InitTypeDef GPIO_InitStruct = {0};
GPIO_InitStruct.Pin = GPIO_PIN_5;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
}
```
这段代码主要实现了在 STM32L431 上使用 WUK 引脚唤醒待机模式的功能。首先在 `main()` 函数中,我们初始化了芯片并进行了一些 GPIO 的配置。接着我们配置了 WUK 引脚(这里使用了 PC13 引脚)为上升沿触发,并在 `while(1)` 循环中不断进入待机模式。
在 `SystemClock_Config()` 函数中,我们配置了使用 LSE 作为系统时钟源,并设置了时钟频率等参数。在 `MX_GPIO_Init()` 函数中,我们初始化了使用到的 GPIO 引脚。
需要注意的是,在使用 WUK 引脚唤醒待机模式时,我们需要将 WUK 引脚外部上拉,这里我们使用了内部上拉。另外,为了进入待机模式后能够成功唤醒,我们需要在待机前关闭所有不必要的外设,否则这些外设会干扰待机模式的正常运行。
希望这个例子对你有所帮助!
阅读全文