打印
[STM8]

STM8L101+si4463低功耗和自动唤醒配置

[复制链接]
734|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
晓伍|  楼主 | 2021-6-4 20:33 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
刚开始接触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,仍远远大于标称值。


图1 整板电路图


最后问题定位在SI4463的GIO设置上,亿佰特的SI4463模块采用的是TX和RX分离的模拟电路设计(图2),GIO2和GIO3控制选通开关,它们根据TX和RX的状态输出0和1,比如芯片处于TX状态时GIO2输出1、GIO3输出0,此时天线与TX形成通路,调制信号从TX口经过电感电路被发送出去。在使si4463进入低功耗之前,必须将GIO2、GIO3拉低。



图2 si4463参考电路设计                       

SI446X_GPIO_CONFIG(3, 3, 2, 2, 3, 0, 0x60);
SI446X_CHANGE_STATE(1);
最后功率降到了1uA以下,与标称值相符。


使用特权

评论回复
沙发
晓伍|  楼主 | 2021-6-4 20:34 | 只看该作者
二、关于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写了个函数

#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)   


/**
  * @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模式唤醒。





使用特权

评论回复
板凳
god9987| | 2021-6-5 09:57 | 只看该作者
学习学习!
感谢分享!

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

60

主题

4103

帖子

1

粉丝