關(guān)于579睡眠喚醒的問題

代碼附上,

官方例程抄的

不知道這樣寫有沒有問題

Shutdown模式貌似沒有問題,正常睡眠,正常喚醒。

但是Sleep模式喚醒之后,第2次睡眠喚醒后必出錯(cuò)

沒有使用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 做時(shí)鐘源?
?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 做時(shí)鐘源
?//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睡眠,喚醒時(shí)間大概需要 2048Tsys≈330us
HSE起振一般不超過1.2ms(500us-1200us),所以切換到外部HSE,需要 1.2ms-330us 這個(gè)時(shí)間可以保證HSE足夠穩(wěn)定,一般用于藍(lán)牙
DelayUs()函數(shù)時(shí)基于32M時(shí)鐘的書寫,此時(shí)主頻為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 做時(shí)鐘源
???DelayUs((1200-330)/5);
?}
?HSECFG_Current( HSE_RCur_100 );???? // 降為額定電流(低功耗函數(shù)中提升了HSE偏置電流)
?DelayUs(25/5);????????????????????? // 等待穩(wěn)定 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庫不僅僅是提供一個(gè) 實(shí)現(xiàn)功能的方式,同時(shí)可能會(huì)有技巧性比較強(qiáng)的要注意的地方,你如果自己去造輪子,可能會(huì)掉坑里,


感謝小張同學(xué)。

官方HAL庫可以用,但是可能和我寫的這些用處不一樣

我的這個(gè)主要目的是想要獲得一個(gè)“待機(jī)”或者“關(guān)機(jī)”狀態(tài)

官方的Sleep庫好像是在TMOS系統(tǒng)里獲得更好的耗電情況

還有一個(gè)問題就是在開啟HAL里的SLEEP功能后,USB不能識(shí)別了


shutdown ,io中斷產(chǎn)生后會(huì)產(chǎn)生復(fù)位,程序從頭執(zhí)行,


sleep模式, io中斷產(chǎn)生后, 芯片先進(jìn)中斷,去跑,然后再接著執(zhí)行,

或許你可以嘗試 gpio中斷服務(wù)函數(shù)里面只處理清中斷標(biāo)志位,

然后把wakeup 函數(shù)放到這個(gè)后面:

?LowPower_Sleep( RB_PWR_RAM14K|RB_PWR_RAM2K );


USB需要用到 PLL,PLL需要高頻時(shí)鐘起震,所以你休眠后,usb是不能識(shí)別的, 你可以做個(gè)IO,分壓接到usb的vbus上,通過外部中斷去檢測(cè)usb的插入拔出,然后對(duì)應(yīng)的開關(guān)usb,




我在shutdowm下用,RST復(fù)位不起來,會(huì)導(dǎo)致死機(jī),必須斷電才能重啟!


請(qǐng)問復(fù)位的問題怎么解決?


你好,可以用我們CH579EVT/PM例程測(cè)試一下,我這邊實(shí)測(cè)沒有問題,復(fù)位會(huì)喚醒執(zhí)行復(fù)位動(dòng)作。


使用PM歷程在EVT上做了測(cè)試(代碼未做任何更改)。idle , halt_1, halt_2,?shutdown mode都沒有問題,但sleep mode會(huì)出現(xiàn)喚醒死機(jī)的問題。

在evt上面只接了串口1輸出線(打印log),?使用PA6做喚醒pin腳。

樓主請(qǐng)幫忙再check一下。謝謝。



http://www.findthetime.net/downloads/CH579EVT_ZIP.html

你好,使用我們最新的evt pm例程測(cè)試一下。


就是用這個(gè)最新的測(cè)的。



板子用的是ch579M,帶以太網(wǎng)的。


image.png

你好,將該int.c放在IAM2下編譯運(yùn)行即可,感謝指出問題,我們也會(huì)及時(shí)更新EVT包。


只有登錄才能回復(fù),可以選擇微信賬號(hào)登錄

国产91精品新入口,国产成人综合网在线播放,九热这里只有精品,本道在线观看,美女视频a美女视频,韩国美女激情视频,日本美女pvp视频