• 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。

  • 相关阅读:
    系统架构设计(通用型)
    主流Java数据库连接池分析(C3P0,DBCP,TomcatPool,BoneCP,Druid)
    JS实现多行文本最后是省略号紧随其后还有个超链接在同一行的需求
    java判断集合是否相等
    JavaScript调试技巧
    linux下出现ping:unknown host www.baidu.com问题时的解决办法——ubuntu下局域网络的配置
    linux网络配置相关命令、虚拟网络接口eth0:0
    网络游戏服务器架构设计
    Linux 下使用静态google protocl buffer
    php-fpm nginx 使用 curl 请求 https 出现 502 错误
  • 原文地址:https://www.cnblogs.com/IdeaMing/p/13037607.html
Copyright © 2020-2023  润新知