wifi ble雙模芯片esp32 h2上市樂鑫科技杭州代理商GD32VF103功耗管理,GD32VF103 支持處理器工作頻率調節、工作電壓調整、控制外設時鐘和睡眠管理4 種控制處理器功率的手段。
1.頻率調節
GD32VF103 內部有 3 個鎖相環電路 PLL、PLL1和 PLL2,以及多個分頻器。wifi ble雙模芯片esp32 h2上市樂鑫科技杭州代理商處理器的時鐘管理單元(RCU)通過配置寄存器 RCU_CFGO 和 RCU_CFGI 調節處理器內部時鐘頻率。在示例 8.13 中,列出了設置處理器內部時鐘的函數。
示例 8.13: 設置處理器時鐘。
/*設置 PLL*/
void rcu_pll_config(uint32_t pll_src, uint32_t pll_mul)
{
uint32_t reg = 0U;
reg = RCU_CFGO;
/* PLL時鐘倍頻 */
reg &= ~(RCU_CFGO_PLLSEL |RCU_CFGO_PLLMF| RCU_CFGO_PLIME_4);
reg = (pll_src|pll_mul);
RCU_CFGO = reg;
}
/*設置 PLL1 * /
void rcu_pll1_config(uint32_t pll_mul)
{
RCU_CFG1 &= ~RCU_CFG1_PLLIMF
RCU_CFG1 = pll_mul;
}
/*設置 PLI2*/
void rcu_pll2_config(uint32_t pll_mul)
{
RCU_CFG1 &= ~RCU_CFG1_PLL2MF;
RCU_CFG1| = pll_mul;
}
2.電壓調整
wifi ble雙模芯片esp32 h2上市樂鑫科技杭州代理商GD32VF103 處理器利用 RCU 的電壓設置寄存器 RCU_DSV,調整處理器內部,1.2V供電區域的工作電壓。與 RCU_DSV[1:0]值對應的電壓值如表 8.1所列。
表8.1 1.2V供電區域電壓設置
RCU_DSV[1:0] 電壓/V
00 1.2
01 1.1
10 1.0
11 0.9
3.總線設備使能
GD32VF103 處理器利用 RCU 總線時鐘使能存器 RCU_AHBEN、RCU_APBIEN和RCU_APB2EN 管理總線上的外設時鐘。wifi ble雙模芯片esp32 h2上市樂鑫科技杭州代理商程序運行時,關閉未使用的外設的時鐘,使未使用的外設處于靜態功耗狀態,降低系統能耗。
將總線時鐘使能寄存器中與指定外設對應的位置 1,打開該外設時鐘。如果將外設對應的位置 0,則關閉總線上設備的時鐘。開啟和關閉總線設備時鐘的函數如示例 8.14 所示。
示例8.14:管理外設時鐘。
/*開啟外設 periph時鐘 */
void rcu_periph clock_enable(rcu_periph_enum periph)
{
RCU_REG_VAL(periph) = BIT(RCU_BIT_POS(periph))
}
/*關閉外設 periph時鐘*/
void rcu_periph_clock_disable(rcu_periph_enum periph)
{
RCU_REG_VAL(periph) & = ~BIT(RCU_BIT_POS(periph));
}
4.睡眠狀態管理
GD32VF103 處理器支持 4種功耗狀態:正常狀態、睡眠狀態(Sleep)、深度唾眠狀態(Deep sleep)和后備狀態(Standby)。后備狀態功耗低,深度睡眠狀態次之,正常狀態功耗高。如圖8.8所示,處理器執行 wfi/wfe 指令進入低功耗模式。wifi ble雙模芯片esp32 h2上市樂鑫科技杭州代理商處理器在執行 wfi/wle時,根據系統控制寄存器和電源管理單元存器(PMU_CTL)控制位,進入不同的低功耗模式。
NRST
--->
<--- (Standby)
wfi/wfe
STBMOD=1
CSR SLEEPVALUE=1
WURST=1
Interupt EXTI
(Sleep) --->
<--- (Normal) --->
<--- (Deep Sleep)
wfi/wfe wfi/wef
CSR_SLEEPVALUE=0 STBMOD=0
SCR SLEEPVALUE=1
<--- (Reset)
圖8.8 GD32VF103 功耗狀態
處理器進入睡眠狀態后,如果出現中斷請求,則可返回正常工作狀態。處理器進入后備狀態后,只有復位信號才能使處理器進入正常狀態。wifi ble雙模芯片esp32 h2上市樂鑫科技杭州代理商處理器在深度睡眠狀態時,只能被外部中斷請求喚醒。
當處理器沒有處理任務或需要長時間等待時,使用 wfi/we 命令進入低功耗狀態,降低系統總體能耗。進入低功耗狀態的示例函數如示例 8.15 所示。
示例8.15:睡眠模式管理。
/*進人睡眠狀態 sleepmodecmd */
void pmu_to_sleepmode(uint8_t sleepmodecmd)
{
clear_csr(0x811,0x1); //CSR_SLEEPVALUE =0,選擇 SLEEP 模式
if(WEI_CMD == sleepmodecmd){ //是否為 WEI命令?
__WFI(); //YES,進人 SLEEP 狀態,中斷喚醒
}else{ //NO,WFE命令
clear_csr(mstatus,MSTATUS MIE); //關閉全局中斷使能
set_csr(0x810,0x1); //設置事件喚醒模式
__WEI(); //進入SLEEP 狀態,事件喚醒
clear_csr(0x810,0x1); //取消事件喚醒模式
set_csr(mstatus,MSTATUS MIE); //使能全局中斷
}
}