[STM32F0] stm32f030 低功耗 stop模式的5.6uA 程序配置

[复制链接]
3050|5
 楼主| qingyu_lv 发表于 2018-7-23 19:55 | 显示全部楼层 |阅读模式

真正的从项目中的经验,不是单纯的配置引脚测试。希望对大家有帮助。

最近一个项目,需要 stm32f030K6 单片机低功耗,3种模式的区别哪儿都有介绍我就不再赘述了,我需要stop 模式,外部是5个按键,每个按下都能将单片机唤醒。

刚开始功耗休眠为200uA,经过几天查找,发现时钟芯片第二脚不能加上拉(可是手册上推荐的有这个上拉啊,好郁闷)。然后功耗就降到了60uA,接下来,就怎么也降不下来了。


我先贴正确的代码:

  1. void Sleep_IO_Init(void)
  2. {
  3.         GPIO_InitTypeDef GPIO_InitStructure;

  4.         RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE);  //
  5.         RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOB, ENABLE);  //
  6.         RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOF, ENABLE);  //
  7.         
  8.         /*初始化GPIOA*/
  9.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7|GPIO_Pin_9|GPIO_Pin_10|
  10.                                  GPIO_Pin_11|GPIO_Pin_12|GPIO_Pin_15;                                                                                                   
  11.   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
  12.         GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
  13.   GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
  14.   GPIO_Init(GPIOA, &GPIO_InitStructure);

  15.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1|
  16.                                   GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5;           
  17.   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
  18.         GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
  19.   GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
  20.   GPIO_Init(GPIOB, &GPIO_InitStructure);
  21.         GPIO_WriteBit(GPIOB,GPIO_Pin_0,Bit_RESET);
  22.         GPIO_WriteBit(GPIOB,GPIO_Pin_1,Bit_RESET);
  23.         GPIO_WriteBit(GPIOB,GPIO_Pin_3,Bit_RESET);
  24.         GPIO_WriteBit(GPIOB,GPIO_Pin_5,Bit_RESET);
  25.         GPIO_WriteBit(GPIOB,GPIO_Pin_4,Bit_RESET);
  26.         

  27.         GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_2|GPIO_Pin_8|GPIO_Pin_6|GPIO_Pin_7;           
  28.   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
  29.   GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
  30.   GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
  31.   GPIO_Init(GPIOB, &GPIO_InitStructure);
  32.         ZI2C_SCL_O(1);
  33.         ZI2C_SDA_O(1);
  34.         
  35.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1;           
  36.   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN;
  37.   GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_DOWN;
  38.   GPIO_Init(GPIOF, &GPIO_InitStructure);


  39. void Sleep_Con(void)
  40. {
  41.         ADC_Cmd(ADC1, DISABLE);                                                                //失能ADC
  42.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, DISABLE);        
  43.         ADC_DeInit(ADC1);

  44.         USART_DeInit(USART1);
  45.         USART_Cmd(USART1,DISABLE);                              //失能串口

  46.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, DISABLE );
  47.         
  48.         TIM_Cmd(TIM14, DISABLE);                                //停止计数
  49.         TIM_Cmd(TIM3, DISABLE);
  50.         TIM_CtrlPWMOutputs(TIM3, DISABLE);                            //PWM输出關
  51.         RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,DISABLE);    //关闭TIM3  时钟
  52.         RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM14,DISABLE);    //关闭TIM14  时钟

  53.         RCC_HSI14Cmd(DISABLE);
  54.         RCC_LSICmd(DISABLE);
  55.         RCC_LSEConfig(RCC_LSE_OFF);                                                                //关外部时钟

  56.         Sleep_IO_Init();                                                                                //IO 初始化

  57.         RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE);
  58.         PWR_EnterSTOPMode(PWR_Regulator_LowPower, PWR_STOPEntry_WFI);
  59.         sleepdelaycnt = 0;                                     //被唤醒后,休眠延时清0,
  60. }

1. 我在程序中用到的外设有 UART1、TIM14、PWM(TIM3-CH4)、ADC、模拟IIC,这个我没见到其他人用这么多的 *_*,确定引脚和外围之间没有漏电流了。我当时的程序没有 ADC_DeInit(ADC1); 这句话,无意中加上后,居然瞬间降到了30uA,不知道为啥,明明我都把它的时钟关过了啊。不过算是有效。

2. 管脚配置:  不管将管脚配成 输入下拉、模拟输入下拉、还是推挽输出低,功耗不会降低一点,所以我觉得只要是不与外围形成压差,配成什么模式无所谓,我觉得为了抗干扰可以设成推挽输出低。当然还有模拟 IIC,不管你是输入上拉还是推挽高,功耗也是一样的。

3. 继续查问题,是我的供电芯片问题。手册是1uA,我居然信了。我原来测功耗是供5V(包括了电源芯片),最后实在没辙了才怀疑芯片,拆掉供电芯片,单片机供3.3V,(此时整个世界都安静了)5.6uA,说明我的外围电流做的还是可以的,没有漏电流。这个电源芯片太坑了。

所以我写这篇**,希望对大家有所帮助吧,每个人遇到问题的地方都不一样,静下来慢慢找。

另外告诉大家一个技巧,在查找外围漏电时候用到的。我把那些上拉电阻、下拉电阻、限流电阻一个个用镊子短路一会儿(看好不要把3.3-GND短路了啊,),观察电流有没有变化。如果没有变化说明不是这个的原因,我在排查时钟芯片那个管脚上拉电阻就是用的这个方法。那个10K被短路后,电流表瞬间上升了,激动死我了,果断把这个电阻拆了,验证确实有效。



junpeng324 发表于 2018-7-23 21:21 | 显示全部楼层
ADC_DeInit(ADC1); 这个是复位ADC吧,可以研究下底层的库。
junpeng324 发表于 2018-7-23 21:23 | 显示全部楼层
的确像你这样去探索得人不多,多发现就有收获。
磨砂 发表于 2018-7-24 06:17 来自手机 | 显示全部楼层
大赞  楼主你的经验很宝贵啊
aaron96031 发表于 2020-5-17 13:51 | 显示全部楼层
楼主才是真正 懂技术,发现问题自己回分析推敲查找, 搞技术就是需要这种执着
lrzxc1 发表于 2020-5-29 08:52 | 显示全部楼层
楼主你的经验很不错啊,特别是镊子短路电阻,谢谢分享
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

49

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部