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。

 

posted @ 2020-06-03 15:01  上官梦舞  阅读(1260)  评论(0编辑  收藏  举报