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。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM