CH32V208,在freertos下使用stop模式

我配置了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();

}


您好,可以参考一下附件例程,附件例程测试进入stop模式再唤醒是没有问题的,可以参考一下。后续若有问题,可邮箱(lzs@wch.cn)沟通。

icon_rar.gifCH32V208 FreeRTOS_STOP.zip



只有登录才能回复,可以选择微信账号登录