关于579睡眠唤醒的问题

代码附上,

官方例程抄的

不知道这样写有没有问题

Shutdown模式貌似没有问题,正常睡眠,正常唤醒。

但是Sleep模式唤醒之后,第2次睡眠唤醒后必出错

没有使用HAL里面的睡眠模式


/*******************************************************************************
* Function Name  : SystemShutdown
*******************************************************************************/
void SystemShutdown(void)

 SYS_USB_STOP(); 
 GPIOA_ModeCfg( GPIO_Pin_All, GPIO_ModeIN_PU );
 GPIOB_ModeCfg( GPIO_Pin_All, GPIO_ModeIN_PU );
 
 /* 配置唤醒源为 GPIO - PB4 */
 GPIOB_ITModeCfg( CtrKey, GPIO_ITMode_FallEdge );        // 下降沿唤醒
 NVIC_EnableIRQ( GPIO_IRQn );
 PWR_PeriphWakeUpCfg( ENABLE, RB_SLP_GPIO_WAKE );//唤醒模式GPIO,ALL=全部。USB\ETH\RTC\GPIO\BAT
 SetSysClock( CLK_SOURCE_HSI_32MHz );//选择 HSI 做时钟源 
 LowPower_Shutdown( NULL );
}
/*******************************************************************************
* Function Name  : SystemSleep
*******************************************************************************/
void SystemSleep(void)
{
 SYS_USB_STOP();
 GPIOA_ModeCfg( GPIO_Pin_All, GPIO_ModeIN_PU );
 GPIOB_ModeCfg( GPIO_Pin_All, GPIO_ModeIN_PU );

 /* 配置唤醒源为 GPIO - PB4 */
 GPIOB_ITModeCfg( CtrKey, GPIO_ITMode_FallEdge );        // 下降沿唤醒
 NVIC_EnableIRQ( GPIO_IRQn );
 PWR_PeriphWakeUpCfg( ENABLE, RB_SLP_GPIO_WAKE );//唤醒模式GPIO,ALL=全部。USB\ETH\RTC\GPIO\BAT
 SetSysClock( CLK_SOURCE_HSI_32MHz );//选择 HSI 做时钟源
 //LowPower_Halt_1();
 LowPower_Sleep( RB_PWR_RAM14K|RB_PWR_RAM2K );//只保留14+2K SRAM 供电
}
/*******************************************************************************
* Function Name  : SystemWakeup
*******************************************************************************/
void SystemWakeup(void)
{
 //while(!GPIOB_ReadPortPin(CtrKey)){}
/*
使用HSI/5=6.4M睡眠,唤醒时间大概需要 2048Tsys≈330us
HSE起振一般不超过1.2ms(500us-1200us),所以切换到外部HSE,需要 1.2ms-330us 这个时间可以保证HSE足够稳定,一般用于蓝牙
DelayUs()函数时基于32M时钟的书写,此时主频为6.4M,所以 DelayUs((1200-330)/5)   
*/
 if(!(R8_HFCK_PWR_CTRL&RB_CLK_XT32M_PON)) {     // 是否HSE上电
   PWR_UnitModCfg( ENABLE, UNIT_SYS_HSE );   // HSE上电
   DelayUs((1200)/5);
 }
 else if(!(R16_CLK_SYS_CFG&RB_CLK_OSC32M_XT)){   // 是否选择 HSI/5 做时钟源
   DelayUs((1200-330)/5);
 }
 HSECFG_Current( HSE_RCur_100 );     // 降为额定电流(低功耗函数中提升了HSE偏置电流)
 DelayUs(25/5);                      // 等待稳定 1-5us 
 SetSysClock( CLK_SOURCE_HSE_32MHz );
 
 //DelayMs(5);
 SYS_USB_OPEN();
 //SYS_USB_INIT();
 LED_Init();
 LED_SystemSET(1,SYSLED_SWIN,LED_SysCountDefaultS,0xff);
 
}

void GPIO_IRQHandler(void)
{
 NVIC_DisableIRQ( GPIO_IRQn );
  GPIOB_ClearITFlagBit( CtrKey ); 
 SystemWakeup();
}


还是建议你用官方的hal库,官方的hal库不仅仅是提供一个 实现功能的方式,同时可能会有技巧性比较强的要注意的地方,你如果自己去造轮子,可能会掉坑里,


感谢小张同学。

官方HAL库可以用,但是可能和我写的这些用处不一样

我的这个主要目的是想要获得一个“待机”或者“关机”状态

官方的Sleep库好像是在TMOS系统里获得更好的耗电情况

还有一个问题就是在开启HAL里的SLEEP功能后,USB不能识别了


shutdown ,io中断产生后会产生复位,程序从头执行,


sleep模式, io中断产生后, 芯片先进中断,去跑,然后再接着执行,

或许你可以尝试 gpio中断服务函数里面只处理清中断标志位,

然后把wakeup 函数放到这个后面:

 LowPower_Sleep( RB_PWR_RAM14K|RB_PWR_RAM2K );


USB需要用到 PLL,PLL需要高频时钟起震,所以你休眠后,usb是不能识别的, 你可以做个IO,分压接到usb的vbus上,通过外部中断去检测usb的插入拔出,然后对应的开关usb,




我在shutdowm下用,RST复位不起来,会导致死机,必须断电才能重启!


请问复位的问题怎么解决?


你好,可以用我们CH579EVT/PM例程测试一下,我这边实测没有问题,复位会唤醒执行复位动作。


使用PM历程在EVT上做了测试(代码未做任何更改)。idle , halt_1, halt_2, shutdown mode都没有问题,但sleep mode会出现唤醒死机的问题。

在evt上面只接了串口1输出线(打印log), 使用PA6做唤醒pin脚。

楼主请帮忙再check一下。谢谢。



/downloads/CH579EVT_ZIP.html

你好,使用我们最新的evt pm例程测试一下。


就是用这个最新的测的。



板子用的是ch579M,带以太网的。


image.png

你好,将该int.c放在IAM2下编译运行即可,感谢指出问题,我们也会及时更新EVT包。


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