我配置了PA3的下降沿外部中断,用来唤醒mcu。在systick中断处,我设置了一个每进入一次中断就会自增的volatile变量,并通过一个任务来打印其数值。
首先我让mcu进入stop模式,但在中断唤醒之后,程序运行不正常。xTaskGetTickCount() 和我设置的变量都不再变化,说明没有再进入systick中断,此时vTaskDelay等函数也无法再使用。
请问有什么办法,可以在设备被唤醒后,仍能正常运行?
// 以下是我进入stop模式调用的函数
void pwr_stop(void)
{
// 配置中断
GPIO_InitTypeDef GPIO_InitStructure={0};
EXTI_InitTypeDef EXTI_InitStructure = {0};
NVIC_InitTypeDef NVIC_InitStructure = {0};
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
GPIO_InitStructure.GPIO_Pin = USART2_RX_PIN;
GPIO_Init(USART2_RX_PORT, &GPIO_InitStructure);
GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource3);
EXTI_InitStructure.EXTI_Line = EXTI_Line3;
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;
EXTI_InitStructure.EXTI_LineCmd = ENABLE;
EXTI_Init(&EXTI_InitStructure);
NVIC_InitStructure.NVIC_IRQChannel = EXTI3_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 5;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
// 关闭systick计数
SysTick->CTLR &= 0xFFFFFFFE;
// 进入stop模式
RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE);
printf("\r\n ********** \r\n");
PWR_EnterSTOPMode(PWR_Regulator_LowPower, PWR_STOPEntry_WFI);
// 退出stop模式
portENTER_CRITICAL();
// 恢复系统时钟HSE
SystemInit();
printf("\r\n ########## \r\n");
// 重新开始systick计数
SysTick->CTLR |= 0x00000001;
// 使能systick中断
NVIC_SetPriority(SysTicK_IRQn, 0xf0);
NVIC_EnableIRQ(SysTicK_IRQn);
portEXIT_CRITICAL();
}