使用两个按键,其中一个按键用于触发系统进入深度睡眠模式 1,另一个按键用于将系统从深度睡眠模式 1 唤醒。系统上电后,LED1 闪烁。当按下 Tamper 按键后,系统进入深度睡眠模式 1,LED1 停止闪烁;按下 Wakeup 按键后,系统从深度睡眠模式 1 唤醒,LED 继续闪烁。由于从深度睡眠唤醒后,系统将切换 IRC16M 作为系统时钟源,因此需要重新配置系统时钟才能保证 LED1 按照之前的频率闪烁。 EXTI 唤醒相关配置如下:
1. 按键配置
static void wakeup_key_init(void)
{
rcu_periph_clock_enable(RCU_GPIOA);
rcu_periph_clock_enable(RCU_SYSCFG);
/* wakeup key init */
gpio_mode_set(GPIOA, GPIO_MODE_INPUT, GPIO_PUPD_NONE, GPIO_PIN_0);
/* EXTI line 0 configuration */
nvic_irq_enable(EXTI0_IRQn, 2);
syscfg_exti_line_config(EXTI_SOURCE_GPIOA, EXTI_SOURCE_PIN0);
exti_init(EXTI_0, EXTI_INTERRUPT, EXTI_TRIG_FALLING);
exti_interrupt_flag_clear(EXTI_0);
}
static void tamper_key_init(void)
{
rcu_periph_clock_enable(RCU_GPIOC);
rcu_periph_clock_enable(RCU_SYSCFG);
/* tamper key init */
gpio_mode_set(GPIOC, GPIO_MODE_INPUT, GPIO_PUPD_NONE, GPIO_PIN_13);
/* EXTI line 13 configuration */
nvic_irq_enable(EXTI10_15_IRQn, 2);
syscfg_exti_line_config(EXTI_SOURCE_GPIOC, EXTI_SOURCE_PIN13);
exti_init(EXTI_13, EXTI_INTERRUPT, EXTI_TRIG_FALLING);
exti_interrupt_flag_clear(EXTI_13);
}
2. 按键中断处理
void EXTI0_IRQHandler(void)
{
if(SET == exti_interrupt_flag_get(EXTI_0)) {
/* clear EXTI line 0 pending flag */
exti_interrupt_flag_clear(EXTI_0);
}
}
void EXTI10_15_IRQHandler(void)
{
if(SET == exti_interrupt_flag_get(EXTI_13)) {
/* clear EXTI line 13 pending flag */
exti_interrupt_flag_clear(EXTI_13);
enter_deepsleep_flag = 1;
}
}
|