CH32V203的USBFS在主机和设备下的低功耗唤醒注意事项
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( );
}