您的位置 首页 动态

STM8L101+si4463低功耗唤醒设置

STM8L101+si4463低功耗唤醒设置-AWU(Auto Wakeup Unit)的时钟源是独立的LSI(Low Speed Internal Clock),官方datasheet显示LSI的一致性比较差,从25KHz到75KHz不等(确实很差),所以配置AWU之前要先知道每一片芯片的LSI是多少,才能达到唤醒时间的预期值。

刚开端触摸RF通讯,凭借成都亿佰特的demo很快完成了数据互传,可是功耗一向降不下去,ST和SiliconLabs官方的datasheet里分甭说STM8L101在halt形式功耗为1uA(开AWU的情况下)、SI4463在standby形式为50nA,可是即便把STM8和SI4463以外的芯片都拆了,整板的实践测验值也比1uA大两个数量级。

一、关于低功耗

首要,把SI4463拿掉,只剩STM8L,在main函数直接进入halt形式,得到作业电流为0.4uA,到达标称值。

然后,将si4463接上,在main函数直接进入halt形式,作业电流飙升至167uA。为什么呢?

在ST官网找到了《AN3147:Power management in STM8L and STM8AL》,在“第五章 :Power management TIps”中找到了问题的要害点——进入HALT之前必须将GPIO设为固定的电平状况,不然有漏电流存在。所以依据电路规划原理图,除了与SI4463衔接的SPI_CSN设为输出高、SDN设为输出低,其他全设为输入上拉。电流降到了25uA,仍远远大于标称值。

STM8L101+si4463低功耗唤醒设置

图1 整板电路图

最终问题定位在SI4463的GIO设置上,亿佰特的SI4463模块选用的是TX和RX别离的模仿电路规划(图2),GIO2和GIO3操控选通开关,它们依据TX和RX的状况输出0和1,比方芯片处于TX状况时GIO2输出1、GIO3输出0,此刻天线与TX构成通路,调制信号从TX口通过电感电路被发送出去。在使si4463进入低功耗之前,必须将GIO2、GIO3拉低。

STM8L101+si4463低功耗唤醒设置

图2 si4463参阅电路规划

[cpp] view plain copySI446X_GPIO_CONFIG(3, 3, 2, 2, 3, 0, 0x60);

SI446X_CHANGE_STATE(1);

最终功率降到了1uA以下,与标称值相符。

二、关于AWU设置

AWU(Auto Wakeup Unit)的时钟源是独立的LSI(Low Speed Internal Clock),官方datasheet显现LSI的一致性比较差,从25KHz到75KHz不等(的确很差),所以装备AWU之前要先知道每一片芯片的LSI是多少,才干到达唤醒时刻的预期值。首要,用TIM2丈量LSI的频率,官方驱动库就有函数完成,函数原型如下

uint32_t TIM2_ComputeLsiClockFreq(uint32_t TIM2_TimerClockFreq);

官网驱动库也有AWU的装备函数 void AWU_LSICalibrationConfig(uint32_t LSIFreqHz), 这个函数给出的成果很糟糕,唤醒时刻底子不对。所以自己依据datasheet写了个函数

[cpp] view plain copy#define AWU_MAX_INTERNVAL_COEFFICIENT ((uint32_t)3932160)

#define AWU_APR_MAX_VALUE ((uint8_t)64)

#define AWU_TBR_MAX_VALUE ((uint8_t)0x0f)

#define AWU_APR_MIN_VALUE ((uint8_t)2)

#define AWU_TBR_MIN_VALUE ((uint8_t)0x01)

#define AWU_HIGH_RESOLUTION_THRESHOLD ((uint32_t)6889)

[cpp] view plain copy

[cpp] view plain copy/**

* @brief Update APR register with the measured LSI frequency.

Accuracy is much better than AWU_LSICalibrationConfig()。

* @param LSIFreqHz — the LSI frequency, in Hertz.

internval — AWU wake up interval, in milliseconds

* @note AWU must be disabled to avoid unwanted interrupts.

* @retval None

*/

ErrorStatus AWU_ConfigLSI(uint32_t LSIFreqHz, uint32_t internval)

{

uint32_t tmp = 0, z = 0;

uint8_t y = 0, x = 0;

uint8_t flag = 0;

/* Check parameter */

assert_param(IS_LSI_FREQUENCY(LSIFreqHz));

z = LSIFreqHz * internval;

if(internval》AWU_HIGH_RESOLUTION_THRESHOLD)

{

tmp = z / 10240000;

if( tmp》=AWU_APR_MIN_VALUE && tmp 《= AWU_APR_MAX_VALUE)

{

AWU-》TBR |= 0x0e;

AWU-》APR = (tmp)-2;

return SUCCESS;

}

tmp = z / 61440000;

if( tmp》=AWU_APR_MIN_VALUE && tmp 《= AWU_APR_MAX_VALUE)

{

AWU-》TBR |= 0x0f;

AWU-》APR = (tmp)-2;

return SUCCESS;

}

}

/* 2^x*y = LSIFreqHz * internval */

for(y=64;y》1;y=y》》1)

{

tmp = z/((uint32_t)y*1000) ;

if(tmp》=1 && tmp《=4096) /*value is between 2^0 and 2^12*/

{

flag = 1;

break;

}

}

/*核算TBR,再依据TBR推导出APR*/

if(flag!=0)

{

for(x=0;x《13;x++)

{

if( (tmp》》x)==0 )

{

break;

}

}

tmp = (uint32_t)1《《x;

y = z/((uint32_t)tmp*1000);

if(y《2)

{

return ERROR;

}

AWU-》TBR = x+1;

AWU-》APR = y-2;

return SUCCESS;

}

else

{

return ERROR;

}

}

参数internval是希望的唤醒时刻,单位是ms,数值规模是1到60000。

设置好TBR和APR之后,只需运用AWU_Cmd(ENABLE)即可发动AWU,它只会在STM8处于halt形式下才开端计时,当计时到达设置的interval时发生中止,将STM8从halt形式唤醒。

/***** 补丁1:AWU设置函数存在BUG,批改了一下,现在能够放心运用了 20161205 *******/

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/news/dongtai/348032.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部