STM32L151进入停止模式,引脚PB5和PC13初始化及外部中断唤醒,HAL库代码
时间: 2024-02-20 09:01:31 浏览: 77
以下是使用HAL库实现STM32L151进入停止模式,引脚PB5和PC13初始化及外部中断唤醒的完整代码:
```c
#include "stm32l1xx_hal.h"
void EXTI4_15_IRQHandler(void)
{
HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_5);
HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_13);
}
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
// 处理外部中断事件
// ...
}
int main(void)
{
// 初始化HAL库
HAL_Init();
// 开启时钟
__HAL_RCC_GPIOB_CLK_ENABLE();
__HAL_RCC_GPIOC_CLK_ENABLE();
// 配置PB5和PC13为输入模式,上拉电阻
GPIO_InitTypeDef GPIO_InitStruct;
GPIO_InitStruct.Pin = GPIO_PIN_5 | GPIO_PIN_13;
GPIO_InitStruct.Mode = GPIO_MODE_IT_RISING;
GPIO_InitStruct.Pull = GPIO_PULLUP;
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
// 配置外部中断
HAL_NVIC_SetPriority(EXTI4_15_IRQn, 0, 0);
HAL_NVIC_EnableIRQ(EXTI4_15_IRQn);
// 设置PB5和PC13为唤醒引脚
HAL_PWR_EnableWakeUpPin(PWR_WAKEUP_PIN1);
HAL_PWR_EnableWakeUpPin(PWR_WAKEUP_PIN2);
// 进入停止模式
HAL_PWR_EnterSTOPMode(PWR_LOWPOWERREGULATOR_ON, PWR_STOPENTRY_WFI);
// 从停止模式唤醒
if (__HAL_PWR_GET_FLAG(PWR_FLAG_WU) != RESET)
{
__HAL_PWR_CLEAR_FLAG(PWR_FLAG_WU);
// 处理唤醒后的操作
// ...
}
while (1)
{
// 主循环
}
}
```
在代码中,我们首先对GPIOB和GPIOC时钟进行开启,然后通过 `GPIO_InitTypeDef` 结构体设置PB5和PC13为输入模式,并开启上拉电阻。接着使用 `HAL_NVIC_SetPriority()` 和 `HAL_NVIC_EnableIRQ()` 函数配置外部中断,并使用 `HAL_PWR_EnableWakeUpPin()` 函数设置PB5和PC13为唤醒引脚。在进入停止模式前,需要将唤醒源配置为相应的中断或者事件,这里我们使用了外部中断唤醒。
在进入停止模式前,需要关闭所有的外设和总线时钟,以确保芯片进入低功耗状态。在唤醒后,需要重新初始化所有的外设和时钟,以便正常工作。在唤醒后,通过 `HAL_GPIO_EXTI_IRQHandler()` 和 `HAL_GPIO_EXTI_Callback()` 函数处理外部中断事件。
需要注意的是,在进入停止模式前,需要将唤醒源配置为相应的中断或者事件,例如使用外部中断唤醒,则需要在对应的GPIO中使能外部中断,同时配置NVIC中断优先级和使能中断等。
阅读全文