板子是ch57XEvt? 191121, 上邊的ch330、1117等元件已經(jīng)去掉, 發(fā)光二極管也去掉了, 直接3.3v供電, 程序下載的是?CH579EVT\EVT\EXAM\PM下的demo程序, 萬用表測得各個(gè)模式中最低的耗電為0.066mA, 與手冊上的掉電模式0.2uA相差太大, 請問需要怎樣處理才能達(dá)到低于2uA的效果?
這是板子的原理圖
沒人嗎? 在線等回答
您好,可以參考:https://bbs.21ic.com/icview-2892728-1-1.html
所有的IO口初始化了嗎?可以參考EVT內(nèi)的PM文件夾例子。
就是用的EVT內(nèi)PM文件夾的例子
下邊是原理圖與電路板照片 ,紅色部分的均已移除
最新版的官方例程,?21ic帖子里面的配置都已具備 //-------------------------------------------- //Main.c? //-------------------------------------------- void?DebugInit(void) { ????GPIOA_SetBits(GPIO_Pin_9); ????GPIOA_ModeCfg(GPIO_Pin_9,?GPIO_ModeOut_PP_5mA); ????UART1_DefInit(); } int?main() { ????DelayMs(2);? ????SetSysClock(?CLK_SOURCE_HSE_32MHz?);????????????//?設(shè)置外部32M做主頻 ????GPIOA_ModeCfg(?GPIO_Pin_All,?GPIO_ModeIN_PU?); ????GPIOB_ModeCfg(?GPIO_Pin_All,?GPIO_ModeIN_PU?); ????GPIOB_SetBits(GPIO_Pin_11|GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_14); ???? /*?配置串口調(diào)試?*/??? ????DebugInit(); ????PRINT(?"Start?@ChipID=%02x\n",?R8_CHIP_ID?); ????DelayMs(200);? #if?1???? ????/*?配置喚醒源為?GPIO?-?PA6&PA5?*/ ????GPIOA_ModeCfg(?GPIO_Pin_6|GPIO_Pin_5,?GPIO_ModeIN_PU?); ????GPIOA_ITModeCfg(?GPIO_Pin_6|GPIO_Pin_5,?GPIO_ITMode_FallEdge?);????????//?下降沿喚醒 ????NVIC_EnableIRQ(?GPIO_IRQn?); ????PWR_PeriphWakeUpCfg(?ENABLE,?RB_SLP_GPIO_WAKE?); #endif???? ???? #if?1 ????PRINT(?"IDLE?mode?sleep?\n");??? ????DelayMs(1); ????LowPower_Idle(); ????PRINT(?"wake..?\n");? ????DelayMs(500); #endif???? ???? #if?1 ????PRINT(?"Halt_1?mode?sleep?\n");??? ????DelayMs(1); ????LowPower_Halt_1(); /* 使用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(5/5);???????????????????????//?等待穩(wěn)定?1-5us ????SetSysClock(?CLK_SOURCE_HSE_32MHz?); ????PRINT(?"wake..?\n");? ????DelayMs(500);???? #endif???? ???? #if?1 ????PRINT(?"Halt_2?mode?sleep?\n");??? ????DelayMs(1); ????LowPower_Halt_2(); /* 使用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(5/5);???????????????????????//?等待穩(wěn)定?1-5us ????SetSysClock(?CLK_SOURCE_HSE_32MHz?); ????PRINT(?"wake..?\n");? ????DelayMs(500);???? #endif???? #if?1 ????PRINT(?"sleep?mode?sleep?\n");??? ????DelayMs(1); ????LowPower_Sleep(?RB_PWR_RAM14K|RB_PWR_RAM2K?);???????//只保留14+2K?SRAM?供電 /* 使用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(5/5);???????????????????????//?等待穩(wěn)定?1-5us ????SetSysClock(?CLK_SOURCE_HSE_32MHz?); ????PRINT(?"wake..?\n");?????? ????DelayMs(500); #endif #if?1 ????PRINT(?"shut?down?mode?sleep?\n");??? ????DelayMs(1); ????LowPower_Shutdown(?NULL?);??????????????????????????//全部斷電,喚醒后復(fù)位 /*? ???此模式喚醒后會(huì)執(zhí)行復(fù)位,所以下面代碼不會(huì)運(yùn)行, ???注意要確保系統(tǒng)睡下去再喚醒才是喚醒復(fù)位,否則有可能變成IDLE等級(jí)喚醒? */ /* 使用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(5/5);???????????????????????//?等待穩(wěn)定?1-5us ????SetSysClock(?CLK_SOURCE_HSE_32MHz?); ????PRINT(?"wake..?\n"); ????DelayMs(500); #endif ????while(1);???? } void?GPIO_IRQHandler(void) { ????GPIOA_ClearITFlagBit(?GPIO_Pin_6|GPIO_Pin_5?); } //-------------------------------------------- //ch57x_init.c? //-------------------------------------------- /******************************************************************************* *?Function?Name??:?LowPower_Shutdown *?Description????:?低功耗-Shutdown模式。 ???????????????????此低功耗切到HSI/5時(shí)鐘運(yùn)行,喚醒后需要用戶自己重新選擇系統(tǒng)時(shí)鐘源 ???????????????????注意調(diào)用此函數(shù),DCDC功能強(qiáng)制關(guān)閉,喚醒后可以手動(dòng)再次打開 *?Input??????????:?rm: ????????????????????RB_PWR_RAM2K - 最后2K?SRAM?供電 ???????????????????NULL - 以上單元都斷電 *?Return?????????:?None *******************************************************************************/ //__attribute__((section("NMICode"))) void?LowPower_Shutdown(?UINT8?rm?) { ????UINT8??x32Kpw,?x32Mpw; ???? ????x32Kpw?=?R8_XT32K_TUNE; ????x32Mpw?=?R8_XT32M_TUNE; ????x32Mpw?=?(x32Mpw&0xfc)|0x03;????????????//?150%額定電流 ????if(R16_RTC_CNT_32K>0x3fff){?????//?超過500ms ????????x32Kpw?=?(x32Kpw&0xfc)|0x01;????????//?LSE驅(qū)動(dòng)電流降低到額定電流 ????} ???? ????R8_SAFE_ACCESS_SIG?=?SAFE_ACCESS_SIG1; ????R8_SAFE_ACCESS_SIG?=?SAFE_ACCESS_SIG2; ????R16_POWER_PLAN?=?RB_PWR_PLAN_EN ????\ ????????????????????|RB_PWR_MUST_0010 \ ????????????????????|rm; ????R8_SAFE_ACCESS_SIG?=?0;? ????R8_SAFE_ACCESS_SIG?=?SAFE_ACCESS_SIG1; ????R8_SAFE_ACCESS_SIG?=?SAFE_ACCESS_SIG2; ????R8_BAT_DET_CTRL?=?0;????????????????//?關(guān)閉電壓監(jiān)控 ????R8_XT32K_TUNE?=?x32Kpw; ????R8_XT32M_TUNE?=?x32Mpw; ????R16_CLK_SYS_CFG?=?5; ????????//?降頻?HSI/5=6.4M???? ????R8_SAFE_ACCESS_SIG?=?0;???? SCB?->?SCR?|=?SCB_SCR_SLEEPDEEP_Msk; //deep?sleep ????__WFI(); ????R8_SAFE_ACCESS_SIG?=?0; ????/*?開啟電壓監(jiān)控??*/ R8_SAFE_ACCESS_SIG?=?SAFE_ACCESS_SIG1; R8_SAFE_ACCESS_SIG?=?SAFE_ACCESS_SIG2; R8_BAT_DET_CFG?=?1;?????????????????????//?2.05V?-?2.33V R8_BAT_DET_CTRL?=?RB_BAT_DET_EN; R8_SAFE_ACCESS_SIG?=?0;? __nop(); __nop(); R8_SAFE_ACCESS_SIG?=?SAFE_ACCESS_SIG1; R8_SAFE_ACCESS_SIG?=?SAFE_ACCESS_SIG2; R8_BAT_DET_CTRL?=?RB_BAT_LOW_IE|RB_BAT_LOWER_IE|RB_BAT_DET_EN;?? R8_SAFE_ACCESS_SIG?=?0;? }
/////////////////////////////////////////////////////////
@zpf_wch? 你好, 用剛剛你給的鏈接中的的demo程序, 依然是66uA的電流
CH579 芯片的GPIO的內(nèi)部上下拉典型的電阻為50K,而你測出來是66uA,當(dāng)3.3v供電時(shí)候,內(nèi)部上下拉有一個(gè)電平不對,就是66uA.
由于該板子不是官方板子,我們這邊無法掌握品控,不排除可能存在的硬件問題.
建議在休眠前,把PA,PB的port寄存器打印出來,看是否全都是0xffff,以確定是否由于板子硬件問題,導(dǎo)致上拉漏電.
感謝tech46,? 經(jīng)測量發(fā)現(xiàn)一個(gè)引腳為低電平(板子沒有把此引進(jìn)接地), 把這個(gè)引腳設(shè)置為高阻輸入或下拉輸入后, 電流變?yōu)?0uA 。但是10uA仍然不是正常電流, 按手冊應(yīng)該是0.2uA 至少應(yīng)該2uA一下的
已經(jīng)降到0.2uA , 原來是板子上cpu引腳PA12與地短路了, 重新焊接cpu后此問題消失