SYD8821是具有全球领先低功耗(RX 2.4mA @-94.5dBm灵敏度,TX 4.3mA @0dBm输出功率)的蓝牙低功耗SOC芯片,在极低电流下实现了优异的射频性能,搭配176kB SRAM,512kB flash,非常适合中高阶可穿戴、智能家居、物联网等低功耗应用。具体可咨询:http://www.sydtek.com/
SYD8801低功耗
北京盛源达系列的产品的低功耗睡眠模式配置起来都是大同小异,主要关注如下几点:
1.在开机的ble_init函数中进行如下类似的配置:
在这里配置唤醒源,其中pw_cfg.timer_wakeup_en设置为1代表开启定时器唤醒的功能,pw_cfg.gpi_wakeup_en代表开始gpio唤醒的功能,pw_cfg.gpi_wakeup_cfg代表哪些GPIO能够唤醒,pw_cfg.gpi_wakeup_pol代表哪些GPIO的反相器要设置!
注意:SYD系列的芯片对于GPIO的睡眠有一个要求,在进入睡眠的时候MCU看到的唤醒源的状态必须是低电平,而这个状态是可以通过反相器来设置的,在SYD8801和SYD8811中,唤醒源的反相器和GPIO的反相器是同一个寄存器,所以这里要设置GPIO的状态,而在SYD8821中,唤醒源的反相器和GPIO的反相器是两个不一样的寄存器,所以SYD8821的唤醒源的反相器的设置只需要设置pw_cfg.gpi_wakeup_pol即可!
2.在ble_init函数中设置好wakeup_config后,只要调用SystemSleep函数,在满足上述的条件后芯片就会进入睡眠,该函数注释如下
/*************************************************************************************************
*函数名:SystemSleep
*输入参数:POWER_SAVING_TYPE mode 电源省电类型,为POWER_SAVING_TYPE枚举成员
MODULE_CONTROL_TYPE c 模块控制类型,为MODULE_CONTROL_TYPE枚举类型
uint32_t ldo_delay MCU唤醒后“nop"执行执行的次数
PMU_WAKEUP_CONFIG_TYPE 唤醒源使能控制
*输出参数:无
*说明:该函数使SYD8821进入浅度睡眠模式,低功耗的程度由mode和c两个变量控制
建议调用方式:SystemSleep(POWER_SAVING_RC_OFF, FLASH_LDO_MODULE, 11000 ,
(PMU_WAKEUP_CONFIG_TYPE)(FSM_SLEEP_EN|PIN_WAKE_EN|TIMER_WAKE_EN|RTC_WAKE_EN));
**************************************************************************************************/
extern uint8_t SystemSleep(POWER_SAVING_TYPE mode, MODULE_CONTROL_TYPE c,uint32_t ldo_delay,PMU_WAKEUP_CONFIG_TYPE w);
其中该函数的第一个变量和第二个变量对睡眠的功耗都有作用,他们的解释如下:
/*************************************************************************************************
*枚举名:POWER_SAVING_TYPE
*成员: POWER_SAVING_RC_ON 睡眠后高频RC时钟依旧打开
POWER_SAVING_RC_OFF 睡眠后高频RC时钟将被关闭
POWER_SAVING_DSLEEP_LPO_ON_RETAIN 睡眠后低频RC(LPO)依旧打开,并且唤醒后接着睡眠前的位置执行
POWER_SAVING_DSLEEP_LPO_OFF_RETAIN 睡眠后低频RC(LPO)被关闭,并且唤醒后接着睡眠前的位置执行
POWER_SAVING_DSLEEP_LPO_ON_RESET 睡眠后低频RC(LPO)依旧打开,并且唤醒后将会复位
POWER_SAVING_DSLEEP_LPO_OFF_RESET 睡眠后低频RC(LPO)被关闭,并且唤醒后将会复位
POWER_SAVING_TYPE_NUM 省电模式的数量
*说明: 省电模式类型决定高频RC振荡器和低频RC振荡器在睡眠后是否打开,数字越大越省电,并且设置LPO的
模式下RC振荡器是被关闭的,比如设置POWER_SAVING_DSLEEP_LPO_ON_RETAIN那么随带着也设置了
POWER_SAVING_RC_OFF
带有“DSLEEP”字样的意味着将会进入深度睡眠模式
带有“RESET”字样的意味着唤醒后将会复位,内存等将不复存在
**************************************************************************************************/
typedef enum {
POWER_SAVING_RC_ON = 0,
POWER_SAVING_RC_OFF = 1,
POWER_SAVING_DSLEEP_LPO_ON_RETAIN = 2,
POWER_SAVING_DSLEEP_LPO_OFF_RETAIN = 3,
POWER_SAVING_DSLEEP_LPO_ON_RESET = 4,
POWER_SAVING_DSLEEP_LPO_OFF_RESET = 5,
POWER_SAVING_TYPE_NUM,
} POWER_SAVING_TYPE;
/*************************************************************************************************
*枚举名:MODULE_CONTROL_TYPE
*成员: NO_MODULE 睡眠后不关闭任何模块
PER_MODULE 睡眠后关闭外设模块,包括GPIO SPI iic等,设置该模块唤醒后必须要重设这些模块
BLE_MODULE 睡眠后关闭BLE模块,连接上后不能够设置,当时在不广播的时候必须设置
FLASH_LDO_MODULE 睡眠后关闭FLASH_LDO,也就是FLASH的电源
PB_MODULE 为PER_MODULE和BLE_MODULE的集合
PF_MODULE 为PER_MODULE和FLASH_LDO_MODULE的集合
PBF_MODULE 为PER_MODULE和FLASH_LDO_MODULE以及FLASH_LDO_MODULE的集合
*说明: 模块控制类型用于控制在睡眠后某些模块的开关
FLASH_LDO_MODULE模式下唤醒的时候必须要给flash足够的事件,也就是SystemSleep传入的第三个参数
**************************************************************************************************/
typedef enum {
NO_MODULE = 0,
PER_MODULE = BIT0,
BLE_MODULE = BIT1,
FLASH_LDO_MODULE = BIT2,
PB_MODULE = PER_MODULE | BLE_MODULE,
PF_MODULE = PER_MODULE | FLASH_LDO_MODULE,
BF_MODULE = BLE_MODULE | FLASH_LDO_MODULE,
PBF_MODULE = PER_MODULE | BLE_MODULE | FLASH_LDO_MODULE,
} MODULE_CONTROL_TYPE;
注意:因为在BLE芯片中,蓝牙这个外设十分特殊,所以这里如果想在睡眠的时候关闭蓝牙,或者进入深度睡眠,那么调用SystemSleep函数传的第二个函数必须传入带有BLE_MODULE的参数,也就是说这里只能够传入:BLE_MODULE 、PB_MODULE、BF_MODULE和PBF_MODULE这四个参数,具体需要什么等级的功耗请斟酌!
对于SYD8801和SYD8811的芯片,他们的睡眠就简单很多,只是单单调用systemsleep函数即可!
关于SYD8801的睡眠可看博客:
https://blog.csdn.net/chengdong1314/article/details/70233652
芯片功耗的测试:
在SYD8821的开发板上有这样一个接口:
这里可以认为VBAT是芯片内部电路消耗的功耗,他的电流就是芯片内部电路的电流,VDDIO是IO口上的漏电,他的电流就是IO口的电流,通过测量这两个位置的电流就可以大概知道电流消耗的方向!