計實(shí)戰(zhàn):從寄存器配置到功耗優(yōu)化全解析)
1. 項目概述為什么低功耗設(shè)計是MCU的必修課最近在做一個基于CH583的無線鍵盤項目客戶對續(xù)航的要求近乎苛刻一節(jié)小小的紐扣電池要撐夠至少半年。這讓我不得不重新審視這顆MCU的功耗表現(xiàn)。市面上很多教程都在講如何用CH583的藍(lán)牙功能但關(guān)于如何真正“榨干”它的每一微安電流把功耗降到理論最低的資料卻不多。尤其是在面對復(fù)雜的應(yīng)用場景比如需要周期性喚醒采樣、保持藍(lán)牙連接待機(jī)時如何配置那些看似神秘的電源管理寄存器就成了項目成敗的關(guān)鍵。CH583和CH582作為沁恒微電子推出的RISC-V內(nèi)核藍(lán)牙MCU其低功耗特性是核心賣點(diǎn)之一。但低功耗不是一個開關(guān)而是一套系統(tǒng)工程。它涉及到運(yùn)行模式的切換、時鐘的精細(xì)管理、外設(shè)的按需供電、以及IO口的靜態(tài)狀態(tài)控制。所有這些操作最終都?xì)w結(jié)為對一系列電源管理寄存器的正確讀寫。如果你只是調(diào)用庫函數(shù)進(jìn)入睡眠而對背后的寄存器配置一知半解那么很可能會遇到“睡眠后電流依然有幾百微安”、“喚醒源不工作”、“RAM數(shù)據(jù)丟失”等棘手問題。這篇文章我就結(jié)合自己的踩坑經(jīng)驗(yàn)帶你深入CH583/CH582的電源管理寄存器從原理到實(shí)操講清楚如何實(shí)現(xiàn)真正的超低功耗設(shè)計。2. 深入CH58x電源管理架構(gòu)不止是睡眠模式很多人對低功耗的理解就是讓MCU“睡覺”但CH58x提供了多個層次的“睡法”每種“睡法”的功耗代價和喚醒條件截然不同。理解其電源管理架構(gòu)是正確使用寄存器的前提。2.1 核心電源域與時鐘樹簡析CH58x的電源管理是圍繞幾個核心電源域構(gòu)建的。你可以把它想象成一棟大樓的供電系統(tǒng)VDD主電源域這是整棟樓的“總閘”為內(nèi)核、數(shù)字邏輯和大部分外設(shè)供電。在活躍模式下全開。備份電源域相當(dāng)于大樓里必須24小時運(yùn)行的“消防應(yīng)急系統(tǒng)”和“門禁記憶系統(tǒng)”。即使在深度睡眠下這部分電路也由VDD如果VDD存在或VBAT備用電池供電用于維持RTC實(shí)時時鐘、部分喚醒邏輯以及備份寄存器的數(shù)據(jù)。這是實(shí)現(xiàn)超低功耗待機(jī)和數(shù)據(jù)保持的關(guān)鍵。外設(shè)電源域各個“房間”的獨(dú)立開關(guān)。比如GPIO、ADC、USB、藍(lán)牙射頻等都可以獨(dú)立關(guān)閉其時鐘和部分電源實(shí)現(xiàn)按需供電。與電源域緊密相關(guān)的是時鐘樹。CH58x的時鐘源包括內(nèi)部高速RC振蕩器、內(nèi)部低速RC振蕩器、外部高速晶振和外部低速晶振。在低功耗模式下高速時鐘如PLL、外部晶振會被首先關(guān)閉系統(tǒng)可能僅依靠內(nèi)部低速RC振蕩器約32kHz或外部低速晶振運(yùn)行RTC從而大幅降低動態(tài)功耗。2.2 四大運(yùn)行模式詳解與功耗對比官方手冊通常會列出幾種模式但手冊上的電流值是理想實(shí)驗(yàn)室條件下的。我們更關(guān)心在實(shí)際電路板上如何逼近這些值。運(yùn)行模式Active Mode狀態(tài)內(nèi)核、外設(shè)全速運(yùn)行。功耗最高典型值在幾毫安到十幾毫安量級具體取決于主頻和外設(shè)開啟情況。關(guān)鍵點(diǎn)功耗與系統(tǒng)主頻SYS_CLK強(qiáng)相關(guān)。通過SYS_CTRL寄存器中的SYS_CLK相關(guān)位可以在滿足性能需求的前提下動態(tài)降低主頻例如從64MHz降至16MHz這是運(yùn)行時最直接的省電手段。公式可以簡化為P ≈ C * V2 * f其中f就是頻率。睡眠模式Sleep Mode狀態(tài)內(nèi)核時鐘停止指令執(zhí)行暫停。但所有時鐘源高速、低速仍然運(yùn)行SRAM和寄存器數(shù)據(jù)保持外設(shè)模塊的時鐘和電源可由軟件獨(dú)立控制是否關(guān)閉。任何中斷包括外部GPIO中斷、定時器中斷等均可喚醒。功耗典型值在幾十到幾百微安量級。這是最常用的一種“淺睡眠”適用于需要快速響應(yīng)外部事件的場景比如按鍵喚醒。功耗高低取決于你關(guān)閉了多少外設(shè)的時鐘通過R8_SLP_CLK_OFF0、R8_SLP_CLK_OFF1等寄存器。深度睡眠模式DeepSleep Mode狀態(tài)這是更深的睡眠。高速時鐘源內(nèi)部高速RC、外部高速晶振、PLL被強(qiáng)制關(guān)閉。僅低速時鐘內(nèi)部32K RC或外部32K晶振可能運(yùn)行用于維持RTC和部分喚醒定時器。大部分?jǐn)?shù)字邏輯掉電但備份域和SRAM數(shù)據(jù)通過配置可以保持。喚醒源受限通常包括RTC定時喚醒、外部特定引腳如喚醒引腳PA0邊沿觸發(fā)、藍(lán)牙主機(jī)喚醒信號等。功耗典型值可低至幾微安到十幾微安。這是實(shí)現(xiàn)長間隔如每秒、每分鐘采樣傳感器并保持藍(lán)牙連接信息需藍(lán)牙模塊支持場景的理想選擇。待機(jī)模式Standby Mode狀態(tài)這是最深的睡眠模式。所有時鐘都停止整個芯片除了備份域和喚醒檢測邏輯外全部掉電。SRAM內(nèi)容丟失。喚醒源非常有限通常只有特定的復(fù)位源如NRST引腳復(fù)位、上電復(fù)位或極少數(shù)喚醒引腳。功耗理論最低可低于1微安。代價是SRAM數(shù)據(jù)全部丟失程序從復(fù)位向量重新開始執(zhí)行。這更像是一次“軟關(guān)機(jī)”適用于不需要保存任何狀態(tài)、僅由特定硬件事件如長按按鍵觸發(fā)整個系統(tǒng)重啟的場景。注意手冊上標(biāo)稱的DeepSleep電流1.5uA或Standby電流0.5uA是在極其理想的條件下測得的所有IO設(shè)為模擬輸入且無上下拉、無外部電路漏電、電源純凈。你的實(shí)際板級電流很可能遠(yuǎn)大于此。排查方向首先是IO口狀態(tài)和外部電路。3. 關(guān)鍵電源管理寄存器逐位解析與配置實(shí)戰(zhàn)理解了架構(gòu)和模式我們來看如何通過寄存器這把“手術(shù)刀”進(jìn)行精細(xì)控制。以下配置均基于CH583CH582類似。3.1 系統(tǒng)控制與功耗模式配置寄存器SYS_CTRL, PM_CTRL這是模式切換的總開關(guān)。R8_SLP_CTRL(睡眠控制寄存器)BIT_SLP_EN(位0)睡眠使能位。寫1MCU在執(zhí)行完WFI等待中斷或WFE等待事件指令后根據(jù)其他位的配置進(jìn)入相應(yīng)的低功耗模式。這是觸發(fā)睡眠的“扳機(jī)”。BIT_SLP_DEEP(位1)深度睡眠選擇位。當(dāng)BIT_SLP_EN1時此位決定是進(jìn)入普通睡眠0還是深度睡眠1。BIT_SLP_RAM(位2)深度睡眠下RAM保持控制位。這是深度睡眠下能否保持變量數(shù)據(jù)的關(guān)鍵0深度睡眠下主SRAM掉電數(shù)據(jù)丟失。1深度睡眠下保持主SRAM供電數(shù)據(jù)得以保存。這會增加幾個微安的功耗但避免了喚醒后重新初始化全局變量的麻煩。你需要根據(jù)數(shù)據(jù)重要性和功耗預(yù)算權(quán)衡。一個典型的進(jìn)入保持RAM的深度睡眠的配置序列如下// 1. 配置喚醒源例如使能RTC喚醒 RTC_SetWakeUpTime(1000); // 設(shè)置1秒后喚醒 R8_RTC_MODE_CTRL | RB_RTC_TRIG_EN; // 使能RTC觸發(fā)喚醒 // 2. 配置睡眠控制寄存器使能睡眠、選擇深度睡眠、保持RAM R8_SLP_CTRL RB_SLP_EN | RB_SLP_DEEP | RB_SLP_RAM; // 3. 關(guān)閉不需要的外設(shè)時鐘詳見3.2節(jié) // ... // 4. 配置IO狀態(tài)詳見3.3節(jié) // ... // 5. 執(zhí)行WFI指令芯片進(jìn)入深度睡眠 __WFI(); // 程序?qū)⒃诖颂帟和V钡奖粏拘言磫拘押罄^續(xù)執(zhí)行R8_PM_CTRL(電源管理控制寄存器)這個寄存器包含更多精細(xì)控制位例如BIT_PM_BOD掉電檢測控制、BIT_PM_LDO內(nèi)部LDO工作模式等。對于大多數(shù)應(yīng)用保持默認(rèn)值即可。但在追求極限功耗時需要注意BIT_PM_BOD掉電檢測使能。在電池供電且電壓緩慢下降的場景如果不需要欠壓保護(hù)可以禁用此功能設(shè)為0以節(jié)省微安級電流。但需承擔(dān)電壓過低導(dǎo)致程序跑飛的風(fēng)險。3.2 外設(shè)時鐘門控寄存器SLP_CLK_OFFx這是降低睡眠模式功耗的“主力軍”。即使進(jìn)入了睡眠模式如果ADC、USB、GPIO等外設(shè)的時鐘還在跑功耗也會居高不下。R8_SLP_CLK_OFF0/R8_SLP_CLK_OFF1這些寄存器的每一位對應(yīng)一個外設(shè)模塊的時鐘門控。在進(jìn)入睡眠前將不用的外設(shè)對應(yīng)的位置1即可關(guān)閉其時鐘。例如R8_SLP_CLK_OFF0中的BIT_CLK_OFF_ADC位控制ADC時鐘。如果你的應(yīng)用在睡眠期間完全不用ADC那么在__WFI()前就應(yīng)該設(shè)置R8_SLP_CLK_OFF0 | BIT_CLK_OFF_ADC;。重要原則只關(guān)閉確定在睡眠期間完全不用的外設(shè)時鐘。例如如果你打算用定時器中斷喚醒那么定時器的時鐘就不能關(guān)。踩坑記錄我曾遇到進(jìn)入睡眠后電流還有300uA遠(yuǎn)高于預(yù)期。最后排查發(fā)現(xiàn)是R8_SLP_CLK_OFF1中控制“某些通信接口”的時鐘位沒有關(guān)閉。而該外設(shè)模塊在初始化后默認(rèn)是開啟時鐘的。逐位檢查這兩個寄存器是排查睡眠功耗高的第一步。3.3 IO口狀態(tài)配置隱藏的“功耗黑洞”這是實(shí)際項目中最大的坑沒有之一。MCU進(jìn)入低功耗模式后其GPIO引腳的狀態(tài)會直接影響電流。原理如果IO口配置為數(shù)字功能輸入或輸出并懸空或連接到高阻抗電路由于CMOS輸入級的特性它可能處于一個不穩(wěn)定的中間電平導(dǎo)致內(nèi)部上下MOS管同時輕微導(dǎo)通產(chǎn)生穿透電流?;蛘咄獠侩娐酚猩侠?下拉電阻如果IO輸出狀態(tài)與之相反就會形成持續(xù)的通路電流。最佳實(shí)踐在進(jìn)入低功耗模式前執(zhí)行將所有未使用的IO口設(shè)置為模擬輸入模式。這是最省電的狀態(tài)因?yàn)閮?nèi)部數(shù)字電路被斷開。通過GPIOx_ModeCfg(pin, GPIO_ModeIN_Floating)或直接配置GPIOx_IE輸入使能和GPIOx_PU上拉、GPIOx_PD下拉寄存器來實(shí)現(xiàn)。對于CH58x通常將引腳模式設(shè)為模擬輸入即可。對于使用的IO口根據(jù)外部電路配置為確定狀態(tài)連接外部上拉電阻的輸入引腳可以配置為浮空輸入依靠外部上拉。連接外部下拉電阻的輸入引腳可以配置為浮空輸入依靠外部下拉。驅(qū)動LED的引腳如果睡眠期間LED需要熄滅應(yīng)設(shè)置為輸出高電平如果LED陽極接VCC或輸出低電平如果LED陰極接地。連接按鈕的引腳配置為上拉輸入或下拉輸入確??臻e時為確定電平避免因懸空產(chǎn)生電流。診斷技巧如果功耗異??梢試L試將所有IO口包括已使用的先統(tǒng)一配置為模擬輸入觀察功耗是否降至正常范圍。如果是再逐個恢復(fù)功能引腳的配置找出那個“漏電”的引腳。3.4 喚醒源配置寄存器睡得沉也要醒得來。喚醒源的配置必須與睡眠模式匹配。睡眠模式幾乎所有中斷都能喚醒配置方式與正常中斷無異使能中斷、設(shè)置觸發(fā)邊沿等。深度睡眠模式需要配置特定的喚醒源寄存器。RTC喚醒通過R8_RTC_MODE_CTRL等RTC相關(guān)寄存器配置定時周期并使能喚醒功能RB_RTC_TRIG_EN。外部引腳喚醒通常是特定的引腳如CH583的PA0/WAKEUP。需要配置該引腳為喚醒功能而非普通GPIO并設(shè)置觸發(fā)邊沿。相關(guān)寄存器可能在GPIO或PM相關(guān)區(qū)域請仔細(xì)查閱數(shù)據(jù)手冊的“喚醒”章節(jié)。藍(lán)牙主機(jī)喚醒如果藍(lán)牙模塊支持在深度睡眠下保持基本狀態(tài)可以通過特定信號喚醒。這涉及藍(lán)牙協(xié)議棧的配置。待機(jī)模式通常只有硬件復(fù)位或極少數(shù)專用喚醒引腳能喚醒配置簡單但靈活性最差。一個常見的錯誤是使能了RTC喚醒但進(jìn)入深度睡眠前忘記配置R8_SLP_CTRL的BIT_SLP_DEEP位導(dǎo)致MCU進(jìn)入了普通睡眠而RTC喚醒在普通睡眠下可能不工作造成“睡死”。4. 低功耗項目實(shí)戰(zhàn)從代碼到測量的全流程理論說再多不如實(shí)際做一遍。我們以一個典型的“周期性傳感器采樣并通過藍(lán)牙上報”的場景為例目標(biāo)是平均電流低于20uA。4.1 系統(tǒng)工作流程設(shè)計上電初始化配置系統(tǒng)時鐘、GPIO、ADC、藍(lán)牙等?;钴S工作期開啟ADC采樣傳感器數(shù)據(jù)通過藍(lán)牙發(fā)送數(shù)據(jù)。此期間電流為mA級但時間很短例如100ms。進(jìn)入深度睡眠關(guān)閉所有不必要的外設(shè)時鐘配置IO狀態(tài)設(shè)置RTC在10秒后喚醒然后執(zhí)行__WFI()。RTC喚醒10秒后MCU被RTC喚醒從__WFI()后繼續(xù)執(zhí)行。重復(fù)回到步驟2。關(guān)鍵點(diǎn)99%以上的時間MCU處于深度睡眠狀態(tài)平均電流 ≈ (工作期電流 * 工作時間 睡眠電流 * 睡眠時間) / 總周期。只要睡眠電流足夠低即使工作電流大平均電流也能很低。4.2 關(guān)鍵代碼實(shí)現(xiàn)片段// 低功耗管理模塊 low_power.c #include CH58x_common.h void Enter_DeepSleep_RAMRetain(uint32_t sleep_ms) { // 1. 禁用全局中斷配置關(guān)鍵寄存器時應(yīng)避免被中斷打斷 DISABLE_GLOBAL_INTERRUPTS(); // 2. 配置喚醒源RTC定時喚醒 RTC_SetWakeUpTime(sleep_ms); // 設(shè)置喚醒間隔毫秒 R8_RTC_MODE_CTRL | RB_RTC_TRIG_EN; // 使能RTC喚醒觸發(fā) // 3. 關(guān)閉所有不必要的外設(shè)時鐘根據(jù)你的應(yīng)用裁剪 // 假設(shè)我們只需要RTC和GPIO用于喚醒引腳關(guān)閉其他所有 R8_SLP_CLK_OFF0 0xFF; // 關(guān)閉GROUP0所有非必要時鐘請根據(jù)手冊排除RTC等 R8_SLP_CLK_OFF1 0xFF; // 關(guān)閉GROUP1所有非必要時鐘 // 注意需要仔細(xì)核對手冊確保RTC和必要喚醒邏輯的時鐘未被關(guān)閉 // 例如RTC時鐘可能由低速時鐘提供不受SLP_CLK_OFFx控制。 // 4. 配置所有IO口為最省電狀態(tài)簡化示例實(shí)際需遍歷所有端口 // 將未使用的PA1~PA7, PB, PC等引腳設(shè)置為模擬輸入 GPIOA_ModeCfg(GPIO_Pin_All ~GPIO_Pin_0, GPIO_ModeIN_Floating); // PA0用作喚醒保留 // ... 配置其他端口 // 5. 配置睡眠控制使能睡眠、深度睡眠、保持RAM R8_SLP_CTRL RB_SLP_EN | RB_SLP_DEEP | RB_SLP_RAM; // 6. 清理并等待可選確保最后幾條指令執(zhí)行完畢 __nop(); __nop(); __nop(); // 7. 使能全局中斷并進(jìn)入睡眠 ENABLE_GLOBAL_INTERRUPTS(); __WFI(); // 執(zhí)行后CPU在此掛起 // 8. 喚醒后從這里繼續(xù)執(zhí)行 // 首先清除喚醒標(biāo)志如果有 R8_RTC_MODE_CTRL ~RB_RTC_TRIG_EN; // 禁用RTC喚醒等待下次設(shè)置 // 然后恢復(fù)系統(tǒng)時鐘和外設(shè)部分外設(shè)時鐘可能需重新開啟 SysClock_ReConfig(); // 可能需要重新配置系統(tǒng)時鐘如果深度睡眠關(guān)閉了高速時鐘源 // 重新初始化必要的外設(shè)根據(jù)SLP_CLK_OFFx的配置被關(guān)閉時鐘的外設(shè)需要重新初始化 Peripheral_ReInit(); } // 在主循環(huán)中的應(yīng)用 int main() { SystemInit(); // 系統(tǒng)初始化 Sensor_Init(); // 傳感器初始化 BLE_Init(); // 藍(lán)牙初始化 while(1) { // 1. 活躍工作期 uint16_t adc_value ADC_Sample(); BLE_SendData(adc_value); // 假設(shè)此過程耗時約100ms // 2. 進(jìn)入深度睡眠10秒 Enter_DeepSleep_RAMRetain(10000); // 睡眠10秒 // 3. 喚醒后循環(huán)繼續(xù)直接開始下一次采樣發(fā)送 } }4.3 功耗測量與優(yōu)化實(shí)戰(zhàn)代碼寫好了怎么知道實(shí)際功耗多少你需要一個萬用表電流檔或功耗分析儀。搭建測量電路在開發(fā)板的電源入口VCC串聯(lián)一個1歐姆或10歐姆的精密采樣電阻。用萬用表測量電阻兩端的電壓差根據(jù)歐姆定律I V / R計算電流。更安全的方法是使用帶有電流測量模式的數(shù)字電源或?qū)I(yè)功耗分析儀。分階段測量全速運(yùn)行電流注釋掉睡眠代碼讓MCU全速空跑。睡眠模式電流配置為普通睡眠測量電流。深度睡眠電流配置為深度睡眠且不保持RAM測量電流。深度睡眠保持RAM電流配置為深度睡眠且保持RAM測量電流。待機(jī)模式電流如果用到也測一下。如果實(shí)測電流遠(yuǎn)高于預(yù)期例如深度睡眠50uA按以下順序排查第一步檢查IO口。這是最常見的原因。將所有IO包括調(diào)試用的串口TX/RX、LED引腳全部配置為模擬輸入再看電流。如果電流降下來了再逐個恢復(fù)功能引腳找到罪魁禍?zhǔn)?。第二步檢查外設(shè)時鐘。確認(rèn)R8_SLP_CLK_OFF0/1寄存器是否關(guān)閉了所有可能耗電的外設(shè)時鐘如ADC、USB、比較器等。第三步檢查調(diào)試接口。如果SWD/JTAG調(diào)試接口連接著仿真器可能會引入漏電。嘗試拔掉仿真器測量。第四步檢查外部電路。MCU外圍的傳感器、電平轉(zhuǎn)換芯片、指示燈等是否在睡眠時仍被供電或產(chǎn)生電流必要時可以切斷MCU與外部的連接飛線進(jìn)行隔離測試。第五步檢查電源本身。LDO或DC-DC芯片的靜態(tài)電流Quiescent Current也會計入總功耗。選擇超低靜態(tài)電流的電源芯片對電池供電設(shè)備至關(guān)重要。5. 常見問題排查與高級技巧5.1 喚醒后程序跑飛或外設(shè)異常癥狀從深度睡眠喚醒后串口不打印了、定時器不準(zhǔn)了、藍(lán)牙連不上了。可能原因及解決系統(tǒng)時鐘未恢復(fù)深度睡眠會關(guān)閉高速時鐘源如PLL。喚醒后需要重新初始化系統(tǒng)時鐘。在main()函數(shù)開始或喚醒后的初始化代碼中調(diào)用SysClock_ReConfig()或類似的時鐘配置函數(shù)。檢查SYS_CLK相關(guān)寄存器是否恢復(fù)到了預(yù)期值。外設(shè)未重新初始化如果你在睡眠前通過SLP_CLK_OFFx關(guān)閉了某個外設(shè)的時鐘那么喚醒后該外設(shè)的寄存器狀態(tài)可能是未定義的。必須在喚醒后重新執(zhí)行該外設(shè)的初始化流程包括時鐘使能、寄存器配置。中斷狀態(tài)混亂確保在進(jìn)入睡眠前和喚醒后正確清除和重新使能相關(guān)的中斷標(biāo)志位。5.2 RAM數(shù)據(jù)在深度睡眠后丟失癥狀全局變量在喚醒后變成了初始值。解決確認(rèn)進(jìn)入深度睡眠前R8_SLP_CTRL寄存器的BIT_SLP_RAM位被設(shè)置為1。同時檢查電源電壓是否在睡眠期間跌落到維持SRAM所需的最低電壓以下。5.3 低功耗與藍(lán)牙連接的平衡這是CH58x作為藍(lán)牙MCU的特有難題。保持藍(lán)牙連接即使是在從設(shè)備角色需要協(xié)議棧定時進(jìn)行鏈路層交互這阻止了MCU進(jìn)入最深的睡眠模式。策略連接間隔Connection Interval在藍(lán)牙協(xié)議中主機(jī)和從設(shè)備約定一個通信間隔。間隔越長從設(shè)備在兩次通信之間可以睡眠的時間就越長功耗越低但數(shù)據(jù)吞吐量和響應(yīng)速度也越慢。你需要在功耗和性能之間取得平衡。通過修改藍(lán)牙協(xié)議棧的配置通常是GAPRole_SetParameter設(shè)置連接參數(shù)來增加連接間隔。深度睡眠與藍(lán)牙在深度睡眠下藍(lán)牙射頻和大部分基帶電路是關(guān)閉的無法維持連接。因此如果需要保持連接通常只能使用普通的睡眠模式并依賴藍(lán)牙協(xié)議棧在連接間隔期間自動管理MCU的睡眠與喚醒。此時的功耗在幾十到上百微安量級遠(yuǎn)高于單純的深度睡眠。廣播模式如果不需持續(xù)連接可以采用周期性廣播深度睡眠的方案。設(shè)備大部分時間深度睡眠定時喚醒并廣播一小段時間然后繼續(xù)睡眠。平均功耗可以做得非常低。5.4 使用內(nèi)部基準(zhǔn)與低功耗ADC如果你的應(yīng)用需要睡眠期間ADC采樣例如監(jiān)控電池電壓CH58x的ADC在低功耗模式下也可以工作但需要額外配置。啟用低功耗ADC模式相關(guān)寄存器可能包括R8_ADC_CFG中的低功耗位。在此模式下ADC轉(zhuǎn)換速度會變慢但功耗顯著降低。注意喚醒與采樣時序通常需要先喚醒MCU例如通過RTC然后等待內(nèi)部電壓基準(zhǔn)和ADC穩(wěn)定需要一定時間查手冊再進(jìn)行采樣轉(zhuǎn)換最后再進(jìn)入睡眠。這個“穩(wěn)定時間”內(nèi)的功耗也需要計入平均功耗。通過以上對CH583/CH582電源管理寄存器從原理到實(shí)戰(zhàn)的拆解你應(yīng)該已經(jīng)不再懼怕數(shù)據(jù)手冊里那些密密麻麻的寄存器位定義了。低功耗設(shè)計的精髓在于“精細(xì)”和“全局”。精細(xì)到每一個IO口的狀態(tài)全局到整個系統(tǒng)的工作流程規(guī)劃。記住沒有一勞永逸的配置最好的參數(shù)一定來自于你對自己應(yīng)用場景的深刻理解以及反復(fù)的測量與調(diào)試。拿起你的開發(fā)板和萬用表從測量一個簡單的睡眠電流開始吧你會發(fā)現(xiàn)把功耗降低一個數(shù)量級帶來的成就感不亞于讓整個系統(tǒng)跑起來。