STM32+CC1101 低功耗2


  測試完基於STM32的CC1101通信,后期需要低功耗配置。查閱關於STM32低功耗的資料,可參考 http://www.ichanging.org/stm32-power.html ,在此,也非常感謝上述博主的無私分享!!!

       1.stm32低功耗

         (1)進入stop模式

          由於項目需要在睡眠時也保留RAM的數據,顧考慮采用stop模式以減少STM32 的功耗,進入stop的方法很簡單,直接調用庫函數中的 PWR_EnterSTOPMode(PWR_Regulator_LowPower, PWR_STOPEntry_WFI); 此處,我選擇了關閉電壓轉換器以進一步降低功耗,使用指令WFI進入,關於STOP進入方式的選擇,可參考前文提供的博客。

     (2)STM32的喚醒

         由於,應用中采用發送完數據變進入休眠,並定時喚醒發送,且STOP模式下RTC正常工作,所以在本應用中采用了RTC鬧鍾周期中斷喚醒,對於RTC的使用即配置可如下:

void RTC_Configuration(void)
{

  RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE);

 
 EXTI_InitTypeDef  EXTI_InitStructure;
 
 EXTI_ClearITPendingBit(EXTI_Line17);
 EXTI_InitStructure.EXTI_Line = EXTI_Line17;
 EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
 EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;
 EXTI_InitStructure.EXTI_LineCmd = ENABLE;
 EXTI_Init(&EXTI_InitStructure);


 PWR_BackupAccessCmd(ENABLE);

 
  BKP_DeInit();

#ifdef RCC_LSE  
 
  RCC_LSEConfig(RCC_LSE_ON);
 
  while(RCC_GetFlagStatus(RCC_FLAG_LSERDY) == RESET)
  {
  }

 
  RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE);
#else

 
 RCC_LSICmd(ENABLE);
 
 while (RCC_GetFlagStatus(RCC_FLAG_LSIRDY) == RESET)
 {
 }
 
 RCC_RTCCLKConfig(RCC_RTCCLKSource_LSI);
#endif
 
 
  RCC_RTCCLKCmd(ENABLE);

 
 
  RTC_WaitForSynchro();

 
  RTC_SetPrescaler(32767); 
 
  RTC_WaitForLastTask();

 
  RTC_ITConfig(RTC_IT_ALR, ENABLE);
 
  RTC_WaitForLastTask();

  RTC_Alarm_Interrupt(DISABLE);
}
       以上,主要注意RTC時鍾的選擇,選擇RCC_LSE ,時間比較精確,但會產生相對長一點的喚醒時延選擇;RCC_LSI,時間則不那么准確,且功耗要多一點,但產生的喚醒時延較小,具體可查閱STM32使用手冊關於低功耗部分的介紹。

2.CC1101低功耗

(1)進入掉電模式

    CC1101進入IDEL狀態 一> 使用掉電模式(SPWD)即可。

(2)喚醒

     直接操作拉低CS管腳即可。

 

3.調試低功耗

    前期調試,只分別測試了STM32和CC1101在休眠功能上的實現,即是否能進入休眠以及是否能夠成功進行喚醒,未對實際功耗進行測試(由於硬件的特殊性)。

    后期第一次測試STM32+CC1101整體模塊低功耗模式下功耗為4點幾mA,頓時就無語了關於STM32低功耗+CC1101低功耗;然后果斷挑斷模塊上的所有LED燈,再次測試,功耗直接降到1mA左右,此時雖然有所下降,但離手冊上的幾uA真不是一個檔次的,但對於菜鳥的我此時根本不知道怎么繼續減少功耗了,好吧,我只有去茫茫網絡中尋找低功耗的蛛絲馬跡了,果然在http://www.openedv.com/posts/list/18372.htm#116532里找到了希望,真心感謝博主的分享,於是趕緊把用到的SPI管腳以及串口管腳安裝博主提供的修改,並關閉所有不用的PIN,但最終測試功耗依然未降低,這就納悶了,為啥還是每降低呢關於STM32低功耗+CC1101低功耗,突然想起了不久前看過的STM32L系列低功耗的芯片,同時在有個低功耗經驗師兄的提醒下,果斷參考了其官方提供的超低功耗代碼關於STM32低功耗+CC1101低功耗,並在自己的項目中進行如下操作:

        在每次進入休眠前:

        #關閉所有時鍾以及外設(如本項目中用到的串口、SPI、timer)

        #將所有I/O口改為GPIO_Mode_AIN狀態

void DisableGPIO(void)
{
 GPIO_InitTypeDef  GPIO_InitStructure

;
 
 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOD|RCC_APB2Periph_GPIOC\
                               |RCC_APB2Periph_GPIOE|RCC_APB2Periph_AFIO, ENABLE);

//Configure all GPIO port pins in Analog Input mode (floating input trigger OFF)
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_All;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
  GPIO_Init(GPIOA, &GPIO_InitStructure);
  GPIO_Init(GPIOB, &GPIO_InitStructure);
  GPIO_Init(GPIOC, &GPIO_InitStructure);
  GPIO_Init(GPIOD, &GPIO_InitStructure);
  GPIO_Init(GPIOE, &GPIO_InitStructure);

  //GPIOs Periph clock disable
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOC  

                                            |RCC_APB2Periph_GPIOD | RCC_APB2Periph_GPIOE, DISABLE);

}

        在每次喚醒后:

        #開啟休眠前所關閉的對應時鍾以及外設

        #初始化使用到的GPIO口

        添加了如上的處理后,再次測試低功耗,終於讓我看見了uA級別的功耗關於STM32低功耗+CC1101低功耗,但功耗最低時在40uA左右,與根據芯片手冊提供的低功耗數據相比,還是有很大的距離,不過至此,通過軟件進一步實現低功耗,我已經無法再想到其他的方法,外設該關的都已經關掉,功耗在40uA左右,目前能想到的就是硬件上功耗降降低,畢竟測試平台的硬件是自己同學做的,對於硬件上的功耗降低超出了我的工作范圍,對於軟件上的低功耗也只能到這兒,如果大牛們有更多在軟件上實現低功耗的建議,也非常希望給我留言,將感激不盡,畢竟沒有做到理想的低功耗,還是有很多遺憾關於STM32低功耗+CC1101低功耗

        對於STM32和CC1101低功耗的聯合使用,無非是先讓CC1101休眠,接着關閉外設,然后STM32進入休眠;中斷喚醒STM32后,開啟所有外設,然后再喚醒CC1101就OK了。

       個人愚見

      (1) 在STM32與其他設備(例如本文的CC1101)聯合休眠時,在休眠前,將所有GPIO管腳配置為GPIO_Mode_AIN狀態,並不是每一個項目都合適,例如有的外設會應為其與MCU的通信的管腳被配置為GPIO_Mode_AIN狀態而被喚醒,在此種情況下,我們需要保留該進入休眠外設用到GPIO,只將其他GPIO口配置為GPIO_Mode_AIN狀態。

     (2)很多論壇中對STM32的喚醒時間有很多探討,覺得RTC定時喚醒后,在去開啟外設、時鍾以及初始化GPIO口會產生一些列時延,本文在初始化GPIO時,直接將該函數放到了STM32醒來后,重新配置系統時鍾時的等待時鍾穩定的while語句前,最后再開啟GPIO時鍾,這樣可一定程度上減少時延。


注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



STM32低功耗總結 STM32F0的低功耗模式 STM32與FreeRTOS實現低功耗 stm32低功耗模式總結 STM32低功耗配置 STM32的低功耗設置 STM32的低功耗模式 STM32低功耗實驗總結 STM32低功耗實驗總結 STM32低功耗模式實踐
 
粤ICP备14056181号  © 2014-2021 ITdaan.com