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。

  • 相关阅读:
    webpack learn2-vue的jsx写法和postcss 1
    浏览器缓存旧的js文件或css文件导致没出现预期效果
    webpack learn1-webpack-dev-server的配置和使用3
    Python正课60 —— configparser模块
    Python正课59 —— json与pickle模块
    Python正课58 —— 小说阅读项目 初级
    Python正课57 —— ATM+购物车 前戏
    Python正课56 —— shutil模块
    Python正课55 —— sys模块
    Python正课54 —— os模块
  • 原文地址:https://www.cnblogs.com/IdeaMing/p/13037607.html
Copyright © 2011-2022 走看看