OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 6687|回复: 12

STM8l低功耗模式下电流较大

[复制链接]

9

主题

87

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1435
金钱
1435
注册时间
2015-5-19
在线时间
132 小时
发表于 2016-11-24 16:27:43 | 显示全部楼层 |阅读模式
20金钱
      这几天一直在做STM8l的低功耗模式调试,STM8l有三种低功耗模式(Wait 、Active-halt 、halt),这里对Active-halt模式进行调试,采用内部RTC进行唤醒,整个测试系统由STM8l芯片以及一个收发芯片构成,STM8l芯片睡眠唤醒后控制收发芯片进行收发数据。在STM8l进入Active-halt之前关闭所有外设时钟以及将外设失能,RTC的时钟采用内部LSI时钟二分频,对于IO口的设置,有文档说明:对于外设是高电平工作的,那么设置成推挽输出低,对于是低电平工作的那么设置成推挽输出高。按照以上文档配置IO口,测得的电流配置IO使收发芯片正常工作时测得的电流大。现在有几个问题:1、IO口的设置问题,在STM8l的低功耗模式下,应当如何设置其IO口尽量降低其功耗。
2、STM8l外设关闭问题?以前看到过文档说STM8l外设是默认关闭的,这与实际中自己测试得到的结果相一致,即对  ClosePeripheralClk()设置与不设置测得的电量几乎没有差别。
3、STM8l的低功耗模式:文档上写明STM8l在Active-halt模式下,电流为1 μA,现在已经关闭所有外设以及配置IO口,姑且认为收发芯片会产生一部分电流消耗,但实际测得的电流为2.5mA,电流太大(电流测量采用万用表进行测量)。
程序如下,希望大神帮忙看看问题出在哪里。
void RTC_timer(u16 m)
{
  RTC_Config();
  ClosePeripheralClk();  
  InIo();
  RTC_WakeUpCmd(DISABLE);      
  RTC_SetWakeUpCounter(m); //设置RTC Weakup计算器初值
  PWR_FastWakeUpCmd(ENABLE);  //快速唤醒使能      
  PWR_UltraLowPowerCmd(ENABLE);//超低功耗      
  RTC_WakeUpCmd(ENABLE);//RTC唤醒使能
  halt();
  RTC_WakeUpCmd(DISABLE);  
}


void RTC_Config(void)
{
  RTC_DeInit(); //初始化默认状态
  CLK_HSICmd(DISABLE);
  CLK_LSICmd(ENABLE);  
  CLK_PeripheralClockConfig(CLK_Peripheral_RTC, ENABLE); //允许RTC时钟
  CLK_RTCClockConfig(CLK_RTCCLKSource_LSI, CLK_RTCCLKDiv_2); //选择RTC时钟源LSI、2=19K
  while (CLK_GetFlagStatus(CLK_FLAG_LSIRDY) == RESET);//等待时钟源就绪  
  RTC_WakeUpClockConfig(RTC_WakeUpClock_RTCCLK_Div16); //19k/16=1.1875KHz t=0.85ms
  RTC_ITConfig(RTC_IT_WUT, ENABLE); //开启中断   
}


void InIo(void)//初始化IO口,降低功耗
{
  GPIO_Init(GPIOC, GPIO_Pin_2, GPIO_Mode_Out_PP_High_Slow);//pc2---out
  GPIO_Init(GPIOC, GPIO_Pin_3, GPIO_Mode_Out_PP_Low_Slow);//pc3 ---vcc
  GPIO_Init(GPIOC, GPIO_Pin_4, GPIO_Mode_Out_PP_Low_Slow);//PC4--LED
  GPIO_Init(GPIOD, GPIO_Pin_4, GPIO_Mode_Out_PP_High_Slow);//PD4--DIO0
  GPIO_Init(GPIOB, GPIO_Pin_7, GPIO_Mode_Out_PP_High_Slow);//PB7--DIO1
  GPIO_Init(GPIOB, GPIO_Pin_6, GPIO_Mode_Out_PP_High_Slow);//PB6--DIO2
  GPIO_Init(GPIOB, GPIO_Pin_5, GPIO_Mode_Out_PP_Low_Slow);//PB5--DIO3
  GPIO_Init(GPIOB, GPIO_Pin_4, GPIO_Mode_Out_PP_Low_Slow);//PB4--DIO4
  GPIO_Init(GPIOB, GPIO_Pin_3, GPIO_Mode_Out_PP_Low_Slow);//PB3--DIO5
  GPIO_Init(GPIOB, GPIO_Pin_2, GPIO_Mode_Out_PP_High_Slow);//PB2--SCLK
  GPIO_Init(GPIOB, GPIO_Pin_1, GPIO_Mode_Out_PP_High_Slow);//PB1--MISO
  GPIO_Init(GPIOB, GPIO_Pin_0, GPIO_Mode_Out_PP_High_Slow);//PB0--MOSI
  GPIO_Init(GPIOD, GPIO_Pin_3, GPIO_Mode_Out_PP_High_Slow);//PD3--NSS
  GPIO_Init(GPIOD, GPIO_Pin_2, GPIO_Mode_Out_PP_High_Slow);//PD2--RXTX
  GPIO_Init(GPIOD, GPIO_Pin_1, GPIO_Mode_Out_PP_High_Slow);//PD1--V2
  GPIO_Init(GPIOD, GPIO_Pin_0, GPIO_Mode_Out_PP_High_Slow);//PD0--V1
  GPIO_Init(GPIOA, GPIO_Pin_0, GPIO_Mode_Out_PP_High_Slow);//PA0
}


void ClosePeripheralClk(void)//关闭不用的外设
{
  USART_DeInit(USART1);
  TIM1_DeInit();
  TIM2_DeInit();
  TIM3_DeInit();  
  TIM4_DeInit();
  ADC_DeInit(ADC1);
  I2C_DeInit(I2C1);
  DAC_DeInit();  
  CLK_PeripheralClockConfig(CLK_Peripheral_USART1,DISABLE);  
  CLK_PeripheralClockConfig(CLK_Peripheral_TIM1,DISABLE);  
  CLK_PeripheralClockConfig(CLK_Peripheral_TIM2,DISABLE);
  CLK_PeripheralClockConfig(CLK_Peripheral_TIM3,DISABLE);
  CLK_PeripheralClockConfig(CLK_Peripheral_TIM4,DISABLE);
  CLK_PeripheralClockConfig(CLK_Peripheral_ADC1,DISABLE);
  CLK_PeripheralClockConfig(CLK_Peripheral_I2C1,DISABLE);
  CLK_PeripheralClockConfig(CLK_Peripheral_DAC,DISABLE);
  USART_Cmd (USART1,DISABLE);
  TIM1_Cmd(DISABLE);
  TIM2_Cmd(DISABLE);
  TIM3_Cmd(DISABLE);
  TIM4_Cmd(DISABLE);
  ADC_Cmd(ADC1,DISABLE);
  I2C_Cmd(I2C1,DISABLE);
  DAC_Cmd(DAC_Channel_1,DISABLE);
}



void Systerm_Init(void)
{
  CLK_HSICmd(ENABLE);
  SX1278InitIo();//IO口初始化
  InitUART1();//串口初始化
  InitTIM4();//TIME初始化      
  sx1278LoRaInit(FRFMSB,FRFMID);//lora模式初始化
}


  void main(void)            
  {
    u16 addr=0x4926;
    u8 *p=(u8*)addr;
    u8 buf[4];
    //系统初始化
    SX1278InitIo();//IO口初始化
    InitUART1();//串口初始化
    InitTIM4();//TIME初始化
    sx1278LoRaInit(0x7b,0x00)
    for(t=0;t<4;t++)
    {
      buf[t]=*p++;
    }
    while(1)
    {   
      enableInterrupts();//使能中断
      //此处用RTC睡眠唤醒减小功耗,必要时可以考虑延时进行睡眠
      RTC_timer(3915);
      Systerm_Init();      
      if(Hallout==0)//唤醒后检测某个IO口的状态
      {
        GPIO_ResetBits(GPIOC, GPIO_Pin_3);//pc3脚置低电平
        GPIO_SetBits(LED_GPIO_PORT, LED_GPIO_PINS);
        delayms(500);//固定延时等待发送结束
        GPIO_ResetBits(LED_GPIO_PORT, LED_GPIO_PINS);
      }
      else//进入接收模式,持续时间为T5
      {        
        T5=1;
        enableInterrupts();//使能中断
        TIM4_Cmd(ENABLE);
        TIM4_ITConfig(TIM4_IT_Update, ENABLE);         //允许tim4触发向上溢出中断
        TIM4_TimeBaseInit(TIM4_Prescaler_128, 255);   //定时器定式1s
        while(1)
        {
          if(T5flag==0)//持续接收模式,时间为T5
          {
          }
         else
        {
        }
      }
    }
  }





最佳答案

查看完整内容[请看2#楼]

I/O口是设置为输出高,输出低,还是上拉,上拉,浮空等,取决于你外部的电路。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

39

主题

599

帖子

2

精华

金牌会员

Rank: 6Rank: 6

积分
2102
金钱
2102
注册时间
2011-9-3
在线时间
117 小时
发表于 2016-11-24 16:27:44 | 显示全部楼层
胖子阳 发表于 2016-11-25 21:45
确定芯片已经进入Active-halt模式,IO口设置不知是否正确,但采用万用表测量发现影响不大,外部电路是否 ...

I/O口是设置为输出高,输出低,还是上拉,上拉,浮空等,取决于你外部的电路。
回复

使用道具 举报

39

主题

599

帖子

2

精华

金牌会员

Rank: 6Rank: 6

积分
2102
金钱
2102
注册时间
2011-9-3
在线时间
117 小时
发表于 2016-11-24 20:02:38 | 显示全部楼层
如果确定芯片进入了Active-halt模式,设置合理的I/O口状态,并检查外部电路是否有漏电。
回复

使用道具 举报

9

主题

87

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1435
金钱
1435
注册时间
2015-5-19
在线时间
132 小时
 楼主| 发表于 2016-11-25 21:45:38 | 显示全部楼层
螃蟹爱虫 发表于 2016-11-24 20:02
如果确定芯片进入了Active-halt模式,设置合理的I/O口状态,并检查外部电路是否有漏电。

确定芯片已经进入Active-halt模式,IO口设置不知是否正确,但采用万用表测量发现影响不大,外部电路是否漏电不知怎样测量,平常用什么方法测量呢?
回复

使用道具 举报

9

主题

87

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1435
金钱
1435
注册时间
2015-5-19
在线时间
132 小时
 楼主| 发表于 2016-11-27 19:15:20 | 显示全部楼层
螃蟹爱虫 发表于 2016-11-25 23:19
I/O口是设置为输出高,输出低,还是上拉,上拉,浮空等,取决于你外部的电路。

你好,根据外部的电话,已正确设置IO口,但电流改变不大,心碎了!准备分开测试一下Active-halt模式与收发芯片持续工作下的电流,根据占空比,看测得的是否合理!
回复

使用道具 举报

39

主题

599

帖子

2

精华

金牌会员

Rank: 6Rank: 6

积分
2102
金钱
2102
注册时间
2011-9-3
在线时间
117 小时
发表于 2016-11-28 16:31:08 | 显示全部楼层
胖子阳 发表于 2016-11-27 19:15
你好,根据外部的电话,已正确设置IO口,但电流改变不大,心碎了!准备分开测试一下Active-halt模式与收 ...

先在最小模块上试,排除外部电路的干扰。同时也能确定自身MCU是否已经设置到最低功耗了。
回复

使用道具 举报

9

主题

87

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1435
金钱
1435
注册时间
2015-5-19
在线时间
132 小时
 楼主| 发表于 2016-11-28 22:35:36 | 显示全部楼层
螃蟹爱虫 发表于 2016-11-28 16:31
先在最小模块上试,排除外部电路的干扰。同时也能确定自身MCU是否已经设置到最低功耗了。

因为整个电路板已经设计好,已组成一个系统,如何在小模块上进行测试?修改了一些地方,现Active-halt模式下,电流能达到50ua了,已经满足了,调这个头都疼了。
回复

使用道具 举报

39

主题

599

帖子

2

精华

金牌会员

Rank: 6Rank: 6

积分
2102
金钱
2102
注册时间
2011-9-3
在线时间
117 小时
发表于 2016-11-28 22:48:43 | 显示全部楼层
胖子阳 发表于 2016-11-28 22:35
因为整个电路板已经设计好,已组成一个系统,如何在小模块上进行测试?修改了一些地方,现Active-halt模 ...

不可能只有一块板吧?外围电路不焊不就只是小系统而已……。
回复

使用道具 举报

3

主题

21

帖子

0

精华

初级会员

Rank: 2

积分
119
金钱
119
注册时间
2016-12-12
在线时间
31 小时
发表于 2019-2-18 09:39:51 | 显示全部楼层
老哥 你好,你现在关于低功耗的问题 解决了吗
回复

使用道具 举报

9

主题

87

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1435
金钱
1435
注册时间
2015-5-19
在线时间
132 小时
 楼主| 发表于 2019-2-25 08:19:20 | 显示全部楼层
gdolphin 发表于 2019-2-18 09:39
老哥 你好,你现在关于低功耗的问题 解决了吗

嗯呢,解决了
回复

使用道具 举报

3

主题

21

帖子

0

精华

初级会员

Rank: 2

积分
119
金钱
119
注册时间
2016-12-12
在线时间
31 小时
发表于 2019-2-26 20:53:18 | 显示全部楼层

能交流下吗 最近我也在做这个,现在 ahalt模式下 6ua,可以交流下吗
回复

使用道具 举报

9

主题

87

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1435
金钱
1435
注册时间
2015-5-19
在线时间
132 小时
 楼主| 发表于 2019-2-27 14:37:26 | 显示全部楼层
gdolphin 发表于 2019-2-26 20:53
能交流下吗 最近我也在做这个,现在 ahalt模式下 6ua,可以交流下吗

可以的,那这个电流差不多了啊,qq:1030316482
回复

使用道具 举报

3

主题

21

帖子

0

精华

初级会员

Rank: 2

积分
119
金钱
119
注册时间
2016-12-12
在线时间
31 小时
发表于 2019-2-27 21:06:15 | 显示全部楼层
胖子阳 发表于 2019-2-27 14:37
可以的,那这个电流差不多了啊,qq:1030316482

嗯嗯,还有些问题想请教下,嘿嘿
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-5-29 03:50

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表