CH582 睡眠測試問題

int main()

{

? ? PWR_DCDCCfg(ENABLE);


? ? uint8_t i;

? ? SetSysClock(CLK_SOURCE_PLL_60MHz);


? ? GPIOA_ModeCfg( GPIO_Pin_All, GPIO_ModeIN_PU );

? ? GPIOB_ModeCfg( GPIO_Pin_All, GPIO_ModeIN_PD );


? ? WS2812x_Power_Set(ENABLE);


? ? Key_init();


? ? /* 配置串口調(diào)試 */

? ? DebugInit();

? ? PRINT("Start @ChipID=%02X\n", R8_CHIP_ID);

? ? PRINT( "Time=%s-%s\n",__TIME__,__DATE__ );


? ? SysTick_Config(GetSysClock() / 1000 * SYSTICK_INTERVAL);

? ? SysTick->SR = 0;? ? ? ? ? ? ? ? ? ? //清除中斷標志

? ? PFIC_DisableIRQ(SysTick_IRQn);


? ? RTC_Init();

? ? WX281X_Init();


? ? while(1)

? ? {

? ? ? ? if(SysTick->SR)

? ? ? ? {

? ? ? ? ? ? SysTick->SR = 0;


? ? ? ? ? ? KeyValue = key_read();

? ? ? ? ? ? if(KEY_Event_Click == KeyValue)

? ? ? ? ? ? {

? ? ? ? ? ? ? ? PlayMode++;

? ? ? ? ? ? ? ? if(PlayMode == 5)PlayMode = 1 ;

? ? ? ? ? ? ? ? switch(PlayMode)

? ? ? ? ? ? ? ? {

? ? ? ? ? ? ? ? ? ? case 2 :Function_state_1 = 0 ;PlayFunction_1();break ;

? ? ? ? ? ? ? ? ? ? case 1 :Function_state_4 = 0 ;PlayFunction_4(0,64,8);break ;

? ? ? ? ? ? ? ? ? ? case 3 :Function_state_3 = 0 ;PlayFunction_3(&StrBuff[0],0,0,80);break ;

? ? ? ? ? ? ? ? ? ? case 4 :Function_state_4 = 0 ;PlayFunction_4(0,64,8);break ;

? ? ? ? ? ? ? ? }

? ? ? ? ? ? }

? ? ? ? ? ? else if(KEY_Event_Press == KeyValue)

? ? ? ? ? ? {

? ? ? ? ? ? ? ? ARGB_FillRGB(0, 0, 0);


? ? ? ? ? ? ? ? PRINT( "sleep mode sleep \n" );

? ? ? ? ? ? ? ? DelayMs( 10 );

? ? ? ? ? ? ? ? WS2812x_Power_Set(DISABLE);


? ? ? ? ? ? ? ? while(!GPIOB_ReadPortPin(GPIO_Pin_0));


? ? ? ? ? ? ? ? LowPower_Sleep(RB_PWR_RAM30K | RB_PWR_RAM2K); //只保留30+2K SRAM 供電

? ? ? ? ? ? ? ? //LowPower_Halt();


? ? ? ? ? ? ? ? HSECFG_Current( HSE_RCur_100 );? ? ?// 降為額定電流(低功耗函數(shù)中提升了HSE偏置電流)

? ? ? ? ? ? ? ? DelayMs( 5 );


? ? ? ? ? ? ? ? WS2812x_Power_Set(ENABLE);

? ? ? ? ? ? ? ? PRINT( "wake.. \n" );


? ? ? ? ? ? ? ? DelayMs( 500 );

? ? ? ? ? ? ?}



? ? ? ? ? ? Usart_scan();


? ? ? ? ? ? switch(PlayMode)

? ? ? ? ? ? {

? ? ? ? ? ? ? ? case 2 :PlayFunction_1();break ;

? ? ? ? ? ? ? ? case 1 :PlayFunction_4(0,64,8);break ;

? ? ? ? ? ? ? ? case 3 :PlayFunction_3(&StrBuff[0],0,0,80);break ;

? ? ? ? ? ? ? ? case 4 :PlayFunction_4(0,64,8);break ;

? ? ? ? ? ? }


? ? ? ? }

? ? }

}

問題點:

1、項目沒有使用協(xié)議棧,有RTC 時鐘,16秒喚醒一次。當連接串口后,RTC時鐘不能定時觸發(fā),斷開串口后可以

2、程序使用了systick時鐘,喚醒后工作不正常,SPI 一直輸出高電平,輪詢的按鍵功能也不能工作。是因為主時鐘有問題?感覺程序沒有跑起來

3、while(!GPIOB_ReadPortPin(GPIO_Pin_0));是為了進睡眠前確認按鍵已經(jīng)松開。不加這一句的,睡眠電流大不少,但喚醒后工作是正常的


請工程師幫我看一下啊,想了好久都沒有找到原因


串口是否進行數(shù)據(jù)收發(fā),如果使用串口中斷一直在收發(fā)數(shù)據(jù),則有可能打斷RTC的中斷。這部分連接/斷開串口具體描述一下是做了什么操作。

sleep模式喚醒后是正常執(zhí)行功能代碼的。加一些打印或者io翻轉(zhuǎn)判斷是否已經(jīng)醒來。不要根據(jù)功耗去判斷是否完全醒來。


進睡眠模式前,串口并沒有數(shù)據(jù)收發(fā)。按鍵喚醒后,按鍵中斷服務中打印“hello”,主程序打印"wake...",這些也都正常。但是本應該繼續(xù)輪詢按鍵和其它功能的,現(xiàn)在并沒有。比較懷疑是systick出了問題或是程序掉進了某個中斷,請幫我看下,萬分感謝

icon_rar.gifThomas Lattice.zip



串口的斷開/連接就是物理上的連接,連接的是RXD,TXD,GND 3根線。RXD->PA8 有10K上拉電阻。串口調(diào)試助手不打開

1、使用 LowPower_Halt();連接串口,RTC 不能喚醒,按鍵可以,喚醒后功能正常;斷開串口,RTC 和按鍵都可以喚醒,工作正常。

2、使用LowPower_Sleep();連接串口,RTC 不能喚醒,按鍵喚醒后功能異常;斷開串口,RTC 和按鍵都可以喚醒,但工作異常


QQ20240717-113233.png

使用官方的PM例程做測試,確定就是systick 出了問題,還請工程師說一下,systick從睡眠模式喚醒后要怎么恢復工作,喚醒后我重新配置了還是不行。

另外,電路板串口與電腦相連,并由串口供電,PM例程也是會自動喚醒(手碰到PA5引腳),斷開連接使用電池供電沒有這個問題,有沒有可能是因為電腦電源未接地引起的感應電在作妖?


SysTick_Config(GetSysClock() / 1000 * SYSTICK_INTERVAL);

? ? SysTick->SR = 0;? ? ? ? ? ? ? ? ? ? //清除中斷標志

? ? PFIC_DisableIRQ(SysTick_IRQn);



嘀嗒定時器基于32M主頻,睡眠不會再運行,喚醒后需要手動使能打開計時的。TMR定時器喚醒后也會重新計數(shù)。

在喚醒后可以重新使能嘀嗒定時器的開關(guān):SysTick_Config。


只有登錄才能回復,可以選擇微信賬號登錄

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