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); //使能全局中断
}
}