CH32V203的USBFS在主机和设备下的低功耗唤醒注意事项

发布时间 2023-09-27 11:49:25作者: WCH_CH32

1.如果使用WFE睡眠,醒来后无需重新打开外设时钟;

2.如果使用STOP模式睡眠,醒来后需要重新打开外设时钟。 

USBFS_RCC_Init( );

3.STANDBY需要进入之前设置成IO(PB6.PB7)为外部事件,醒来之后设备复位(待机模式唤醒后复位),重新枚举USB。具体配置如下:

void Sleep_WakeUp_Deal()
{
EXTI_InitTypeDef EXTI_InitStructure = {0};

/* 关闭中断 */
__disable_irq( );

RCC_APB1PeriphClockCmd( RCC_APB1Periph_PWR, ENABLE ); /* 开启电源时钟 */
RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB, ENABLE );/* 使能PA PB端口时钟 */
RCC_APB2PeriphClockCmd( RCC_APB2Periph_AFIO, ENABLE );

USBFS_RCC_Init( );
USBFS_Host_Init( ENABLE );

GPIO_InitTypeDef GPIO_InitStructure;

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD;
GPIO_Init(GPIOB, &GPIO_InitStructure);

GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource7);
/*PB7 与PB6唤醒*/
EXTI_InitStructure.EXTI_Line = EXTI_Line7;
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Event;
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising_Falling;
EXTI_InitStructure.EXTI_LineCmd = ENABLE;
EXTI_Init( &EXTI_InitStructure );

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD;
GPIO_Init(GPIOB, &GPIO_InitStructure);

GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource6);
/*PA1唤醒*/
EXTI_InitStructure.EXTI_Line = EXTI_Line6;
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Event;
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising_Falling;
EXTI_InitStructure.EXTI_LineCmd = ENABLE;
EXTI_Init( &EXTI_InitStructure );


GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource7);
GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource6);
/* 配置USB睡眠唤醒 */

Delay_Us( 10 );
printf( "sleep\n" );

 PWR_EnterSTANDBYMode(  );

}