我配置了PA3的下降沿外部中斷,用來喚醒mcu。在systick中斷處,我設(shè)置了一個(gè)每進(jìn)入一次中斷就會(huì)自增的volatile變量,并通過一個(gè)任務(wù)來打印其數(shù)值。
首先我讓mcu進(jìn)入stop模式,但在中斷喚醒之后,程序運(yùn)行不正常。xTaskGetTickCount() 和我設(shè)置的變量都不再變化,說明沒有再進(jìn)入systick中斷,此時(shí)vTaskDelay等函數(shù)也無法再使用。
請(qǐng)問有什么辦法,可以在設(shè)備被喚醒后,仍能正常運(yùn)行?
// 以下是我進(jìn)入stop模式調(diào)用的函數(shù)
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);
????// 關(guān)閉systick計(jì)數(shù)
? ? SysTick->CTLR &= 0xFFFFFFFE;
? ? // 進(jìn)入stop模式
? ? RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE);
? ? printf("\r\n ********** \r\n");
? ? PWR_EnterSTOPMode(PWR_Regulator_LowPower, PWR_STOPEntry_WFI);
? ??
????// 退出stop模式
? ? portENTER_CRITICAL();
? ? // 恢復(fù)系統(tǒng)時(shí)鐘HSE
????SystemInit();
? ? printf("\r\n ########## \r\n");
????// 重新開始systick計(jì)數(shù)
? ? SysTick->CTLR |= 0x00000001;
? ? // 使能systick中斷
? ? NVIC_SetPriority(SysTicK_IRQn, 0xf0);
? ? NVIC_EnableIRQ(SysTicK_IRQn);
? ? portEXIT_CRITICAL();
}