zoukankan      html  css  js  c++  java
  • STM8L051F3P6低功耗配置

    最低功耗是halt();

    因为halt会关闭所有时钟,所以不用刻意去关时钟。

    重要的是管脚的配置,根据不同情况配置板上的管脚

    我的空板上用PB1作为外部中断来唤醒所以配置为上拉输入,下降沿触发。

    GPIO_Init(GPIOB, GPIO_Pin_1, GPIO_Mode_In_PU_IT);
    EXTI_SetPinSensitivity(EXTI_Pin_1, EXTI_Trigger_Falling);
    ITC_SetSoftwarePriority(EXTI1_IRQn, ITC_PriorityLevel_2);

    有一个指示灯

    GPIO_Init(GPIOD, GPIO_Pin_0, GPIO_Mode_Out_PP_Low_Slow);

    因为PA1是复位电路10K上拉,100nF电容接地,所以没管,其余的引脚设置推挽输出低

    代码如下:

    时钟配置

    void SysClock_Init(void)
    {
      CLK_SYSCLKDivConfig(CLK_SYSCLKDiv_1);//SysClock = ClockFreq/1即16MHz/1=16MHz;
      if(CLK_GetSYSCLKSource() != CLK_SYSCLKSource_HSI)//if not HSI
      {
        CLK_SYSCLKSourceSwitchCmd(ENABLE);  // enable switch sysclock source
        CLK_SYSCLKSourceConfig(CLK_SYSCLKSource_HSI);   // wait switch finished
      }
      SysClockFreq = CLK_GetClockFreq();
    }

    端口配置

    void IO_Init(void)
    {
      GPIO_Init(GPIOA, GPIO_Pin_0|GPIO_Pin_2|GPIO_Pin_3, GPIO_Mode_Out_PP_Low_Slow);//没有配置PA1
      GPIO_Init(GPIOB, GPIO_Pin_0|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7, GPIO_Mode_Out_PP_Low_Slow);
      GPIO_Init(GPIOC, GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6, GPIO_Mode_Out_PP_Low_Slow);

      GPIO_ResetBits(GPIOA,GPIO_Pin_0|GPIO_Pin_2|GPIO_Pin_3);//没有配置PA1
      GPIO_ResetBits(GPIOB,GPIO_Pin_0|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7);
      GPIO_ResetBits(GPIOC,GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6);

      GPIO_Init(LEDB_PORT, LEDB_PIN, GPIO_Mode_Out_PP_Low_Slow);//指示灯

      //唤醒按键
      GPIO_Init(KEYP_PORT, KEYP_PIN, GPIO_Mode_In_PU_IT);
      EXTI_SetPinSensitivity(EXTI_Pin_1, EXTI_Trigger_Falling);
      ITC_SetSoftwarePriority(EXTI1_IRQn, ITC_PriorityLevel_2);

    }

    主函数

    void main(void)
    {
      SysClock_Init();//时钟配置
      IO_Init();//端口配置
      enableInterrupts();//使能中断
      
      while (1)
      {   
        if (Sys.Mode == RESET)
        {
          PWR_UltraLowPowerCmd(ENABLE);//不加这句1.2uA加入后0.38uA
          halt();
          nop();
        }
    }

    中断处理

    void KeyP_Int(void)
    {
      if (Sys.Mode)
      {
        Sys.Mode = 0;
        GPIO_SetBits(LEDB_PORT, LEDB_PIN);
      }
      else
      {
        Sys.Mode = 1;
        GPIO_ResetBits(LEDB_PORT, LEDB_PIN);
      }
    }

    中断入口

    INTERRUPT_HANDLER(EXTI1_IRQHandler, 9)
    {
      KeyP_Int();
      EXTI_ClearITPendingBit(EXTI_IT_Pin1);
    }

    空板0.38uA,追求不高已经达到了预期,如果有心的朋友,加把劲或许轻松达到官方的350nA。

  • 相关阅读:
    如何实现Canvas图像的拖拽、点击等操作
    HTML5新增核心工具——canvas
    Java API 之 Object
    浅显回顾 Java 面向对象的最后方面的知识
    草叶集 | 在看惠特曼的大路之歌时的一些想法
    关于 static 和 final 的一些理解
    面向对象中的一些概念的理解
    关于前面知识的一些试题
    关于方法的一些浅见和对象的一些理解
    数组的一些应用场景
  • 原文地址:https://www.cnblogs.com/IdeaMing/p/13037607.html
Copyright © 2011-2022 走看看