首页 > 其他分享 >【WCH蓝牙系列芯片】-基于CH582开发板—四种低功耗模式电流测试

【WCH蓝牙系列芯片】-基于CH582开发板—四种低功耗模式电流测试

时间:2023-09-20 11:22:56浏览次数:42  
标签:DelayMs RTC 低功耗 模式 开发板 CH582 GPIO 唤醒

---------------------------------------------------------------------------------------------------------------------

在WCH沁恒官方提供的CH583的EVT资源包中,找到BLE文件中找到PW这个工程文件,这是一个系统睡眠模式并唤醒例程;其中GPIOA_5作为唤醒源,共4种功耗等级。
芯片提供以下 4 种主要的低功耗模式:
1、空闲模式(Idle)
所有外设保持正常供电,内核停止运行,时钟系统运转。检测到唤醒事件后,可以立即唤醒。
2、暂停模式(Halt)
在空闲模式的基础上,时钟系统停止。检测到唤醒事件后,首先时钟运转,然后唤醒内核运行。
3、睡眠模式(Sleep)
主 LDO 关闭,由超低功耗 ULP-LDO 维持 PMU、内核和基本外设供电,LSE 或 LSI 可以选择是否开启,RAM2K、RAM30K、USB 和 RF 配置可以选择是否维持供电。检测到唤醒事件后,首先主 LDO 开启,然后时钟运转,最后唤醒内核,程序继续运行,需要时可以重新设置到更高主频
4、下电模式(Shutdown)
在睡眠模式的基础上,关闭了内核和基本外设以及 USB 和 RF 配置,LSE 或 LSI 可以选择是否开启,RAM2K、RAM30K 可以选择是否维持供电。检测到唤醒事件后,PMU 将执行 GRWSM 复位,软件可根据复位标志 RB_RESET_FLAG 和可选的 RAM 中的保持数据区分于 RPOR

 

在数据手册上针对每一个模式,有具体的特征和进入条件,还有唤醒事件以及具体功耗的范围值。

 

在EVT资源包中的PW例程中只包含外部中断引脚PA5的方式唤醒睡眠,在此基础上,加入RTC中断唤醒。

    GPIOA_ModeCfg(GPIO_Pin_All, GPIO_ModeIN_PU);
    GPIOB_ModeCfg(GPIO_Pin_All, GPIO_ModeIN_PU);

 

在主程序中,GPOIO中都没有内部断开模式,上电后,默认状态为浮空输入状态,当引脚浮空状态非常耗电,所以在低功耗模式,要将在初始化时,需要将所有的IO口设置为模拟输入,这样可以避免有额外电流。

1、利用GPIO引脚中断唤醒和RTC定时模式作为唤醒源

#if 1
    /* 配置唤醒源为 GPIO - PA5 */
    GPIOA_ModeCfg(GPIO_Pin_5, GPIO_ModeIN_PU);  //输入模式
    GPIOA_ITModeCfg(GPIO_Pin_5, GPIO_ITMode_FallEdge); // 下降沿唤醒
    PFIC_EnableIRQ(GPIO_A_IRQn);  //使能GPIOA中断
    PWR_PeriphWakeUpCfg(ENABLE, RB_SLP_GPIO_WAKE, Long_Delay);   //使能外设唤醒功能,配置唤醒源为 GPIO 引脚,并设置长延时。
#endif

#if 1
    /* 配置唤醒源为 RTC */
    RTC_TMRFunCfg(Period_1_S);     // RTC定时模式配置  1s的周期
    PFIC_EnableIRQ(RTC_IRQn);  //使能RTC中断
    PWR_PeriphWakeUpCfg(ENABLE, RB_SLP_RTC_WAKE, Long_Delay);   //使能外设唤醒功能,配置唤醒源为 RTC事件唤醒,并设置长延时。
#endif

 

2、四种低功耗模式

#if 0
    PRINT("IDLE mode sleep \n");  //空闲模式
    DelayMs(1);
    LowPower_Idle();   //低功耗-Idle模式,让 CPU 进入睡眠状态以降低功耗
    PRINT("wake.. \n");
    DelayMs(500);
#endif

#if 0
    PRINT("Halt mode sleep \n");  //暂停挂起模式
    DelayMs(2);
    LowPower_Halt();  //将系统置于 Halt 模式,这是一种更低功耗的模式
    HSECFG_Current(HSE_RCur_100); // 降为额定电流(低功耗函数中提升了HSE偏置电流)
    DelayMs(2);
    PRINT("wake.. \n");
    DelayMs(500);
#endif

#if 1
    PRINT("sleep mode sleep \n");  //睡眠模式
    DelayMs(2);
    // 注意当主频为80M时,Sleep睡眠唤醒中断不可调用flash内代码。
    LowPower_Sleep(RB_PWR_RAM30K | RB_PWR_RAM2K); //只保留30+2K SRAM 供电
    HSECFG_Current(HSE_RCur_100);                 // 降为额定电流(低功耗函数中提升了HSE偏置电流)
    DelayMs(5);
    PRINT("wake.. \n");
    DelayMs(500);
#endif

#if 0
    PRINT("shut down mode sleep \n");  //关机下电模式
    DelayMs(2);
    LowPower_Shutdown(0); //全部断电,唤醒后复位
    /*
     此模式唤醒后会执行复位,所以下面代码不会运行,
     注意要确保系统睡下去再唤醒才是唤醒复位,否则有可能变成IDLE等级唤醒
     */
    HSECFG_Current(HSE_RCur_100); // 降为额定电流(低功耗函数中提升了HSE偏置电流)
    PRINT("wake.. \n");
    DelayMs(500);
#endif

 

3、采用外部中断PA5作为唤醒睡眠

/*********************************************************************
 * @fn      GPIOA_IRQHandler
 *
 * @brief   GPIOA中断函数
 *
 * @return  none
 */
__INTERRUPT
__HIGH_CODE
void GPIOA_IRQHandler(void)  //GPIOA中断处理函数
{
    GPIOA_ClearITFlagBit(GPIO_Pin_6 | GPIO_Pin_5);  //中断标志位清除

}

 

4、采用RTC唤醒中断方式,1秒为周期唤醒

__INTERRUPT
__HIGH_CODE
void RTC_IRQHandler(void)  //RTC中断处理函数,RTC闹钟唤醒中断
{
    uint16_t py;
    uint16_t pmon;
    uint16_t pd;
    uint16_t ph;
    uint16_t pm;
    uint16_t ps;
    RTC_GetTime(&py,&pmon,&pd,&ph,&pm,&ps); //获取当前时间
    if(RTC_GetITFlag(RTC_TMR_EVENT))  //判断是否发生了 RTC 周期定时事件的中断(1秒)
    {
        printf("%d年%d月%d日%d时%d分%d秒\r\n",py,pmon,pd,ph,pm,ps);
        RTC_ClearITFlag(RTC_TMR_EVENT);  //清除RTC中断标志  (RTC 周期定时事件)
    }
}

 

5、各个模式下测试电流状态,包换睡眠和唤醒后电流值。

CH582系统睡眠模式低功耗测
低功耗模式

空闲模式
IDLE mode

暂停模式
Halt mode

睡眠模式
sleep mode

下电模式
shut down

GPIO未唤醒状态  2.45mA  324.30uA  3.13uA   0.56uA
GPIO唤醒  9.27mA    9.00mA   9.14mA  5.45mA
RTC未唤醒状态  2.45mA   324.55uA   3.11uA   0.56uA
RTC 1秒唤醒  9.03mA   9.19mA   9.07 mA   5.42mA

标签:DelayMs,RTC,低功耗,模式,开发板,CH582,GPIO,唤醒
From: https://www.cnblogs.com/ZYL-FS/p/17716789.html

相关文章

  • FPGA开发板实验目录
     数字逻辑基础实验   实验文件夹名称   实验说明   lab1   4位并入串出移位寄存器   lab2   4位串入串出移位寄存器   lab3   5位串入并出移位寄存器   lab4   8线-3线编码器   lab5   8线-3线优先编码器   lab6   38......
  • 分析开发板信息中为啥df -h显示sda11分区挂载只有2GB Size且使用100%,但fdisk -l sda11
    问题点当使用开发板中的存储设备分区,进而格式化挂载到某个目录上后,使用df&lsblk后发现分区挂载情况和实际的存储器分区信息有差异后,会感到很疑惑,下面介绍遇到的情况:情况1使用xml添加分区后发现对应分区格式化&挂载对应设置的系统目录上但分区sizeAvailablesize&Used之和不相......
  • RK3568开发笔记(十):开发板buildroot固件移植开发的应用Demo,启动全屏显示
    前言  上一篇,移植应用前的通讯接口工作和全屏工作都已经完成了。本篇移植开发的商业应用。<br>交叉编译好应用  (略),参照《RK3568开发笔记(八):开发板烧写buildroot固件(支持hdmi屏),搭建Qt交叉编译开发环境,编译一个Demo,目标板运行Demo测试》<br>解决全屏标题栏占用问题  交叉......
  • RK3568开发笔记(十):开发板buildroot固件移植开发的应用Demo,启动全屏显示
    前言  上一篇,移植应用前的通讯接口工作和全屏工作都已经完成了。本篇移植开发的商业应用。 交叉编译好应用  (略),参照《RK3568开发笔记(八):开发板烧写buildroot固件(支持hdmi屏),搭建Qt交叉编译开发环境,编译一个Demo,目标板运行Demo测试》 解决全屏标题栏占用问题......
  • 3步体验在DAYU200开发板上完成OpenHarmony对接华为云IoT
    本文分享自华为云社区《DAYU200+OpenHarmony3.1.1对接华为云IOT【华为云IoT+鸿蒙】》,作者:DS小龙哥。一、前言OpenHarmony3.1.1是一个开源的智能终端操作系统,主要用于智能家居、智能手机、平板电脑、智能穿戴设备等智能终端设备。是一个分布式操作系统,支持多种硬件平台和多种编程......
  • 迅为RK3588开发板修改编译工具路径
    1因为此章节以rknn_yolov5_demo在RK3588Linux64位平台上运行为例,所以修改examples/rknn_yolov5_demo/build-XXX.sh的编译工具路径,如下图所示:2修改build-linux_RK3588.sh文件,将TOOL_CHAIN修改为gcc-arm-10.3-2021.07-x86_64-aarch64-none-linux-gnu的解压路径并保存修......
  • RK3568开发板外接超声波传感器测距模块-迅为电子
    超声波传感器测距模块1模块说明HC-SR04传感器模块如下图所示:   只需要在 Trig 管脚输入一个 10US 以上的高电平,系统便可发出 8 个 40KHZ 的超声波脉冲,然后检测回波信号。当检测到回波信号后,通过 Echo 管脚输出。根据 Echo管脚输出高电平的持续时间可以计算距离值,......
  • BMS电池管理系统的蓝牙芯片 国产高性能 低功耗蓝牙Soc芯片PHY6222
    电池管理系统是对电池进行监控与控制的系统,将采集的电池信息实时反馈给用户,同时根据采集的信息调节参数,充分发挥电池的性能。但是,前技术中,在管理多个电池时,需要人员现场调试与设置,导致其检查、维护与更新相当不方便。而且,针对电池组的工作性能、电池老化情况、使用寿命等信息,需要......
  • RK3568开发板外接超声波传感器测距模块
      超声波传感器测距模块1模块说明HC-SR04传感器模块如下图所示:   只需要在Trig管脚输入一个10US以上的高电平,系统便可发出8个40KHZ的超声波脉冲,然后检测回波信号。当检测到回波信号后,通过Echo管脚输出。根据Echo管脚输出高电平的持续时间可以计算距离......
  • Xines广州星嵌全新FPGA开发板—OMAPL138/C6748 DSP+ARM+FPGA
    1  开发板简介    XQ138F-EVM是一款基于广州星嵌TIOMAP-L138(浮点DSPC6748+ARM9)+XilinxSpartan-6FPGA核心板SOM-XQ138F设计的开发板,它为用户提供了SOM-XQ138F核心板的测试平台,用于快速评估SOM-XQ138F核心板的整体性能。 XQ138F-EVM底板采用沉金无铅工艺的四层板设计......