• 正文
  • 推薦器件
  • 相關(guān)推薦
申請入駐 產(chǎn)業(yè)圖譜

STM8L超低功耗程序編寫教學(xué),簡單易懂

2024/03/07
2974
加入交流群
掃碼加入
獲取工程師必備禮包
參與熱點資訊討論

之所以寫這篇博客,是因為最近做一個項目,需要用到單片機低功耗模式。第一次用stm8,我在網(wǎng)上看了很多資料,雖然有些寫的還是挺詳細的,但是我自己實際調(diào)試的時候還是出了不少意外,花了不少時間,因此想寫一篇文章讓你們少走一些彎路。語文水平有限,寫的不好勿怪。

在講程序之前先說明幾點:

1.STM8低功耗的幾種模式我不多說了,這方面的資料很多,自己可以先去了解一下。
2. 我測試用的主控芯片是STM8L151G6。(其他L系列程序上沒有什么區(qū)別,至于功耗是不是一樣我就不知道了)
3. 程序用的是庫函數(shù)的寫法。
4. 低功耗模式用的是Halt模式,也就是停機模式,功耗是最低的,其他模式的功耗我沒有測過,這里不說。
5. 為了更加直觀,我下面寫的程序盡可能簡化。(外設(shè)部分的程序沒寫進去)
6. 如果我有哪里寫錯了,歡迎來指正。

好了廢話不多說,馬上開始程序的編寫。

//main函數(shù)
void mian(void)
{
  //配置時鐘
  CLK_HSICmd(ENABLE);
  CLK_SYSCLKSourceConfig(CLK_SYSCLKSource_HSI);  // 我用的是內(nèi)部時鐘
  CLK_SYSCLKDivConfig(CLK_SYSCLKDiv_1);   //1分頻,也就是16M,實際測試,時鐘分頻對功耗沒什么影響
  
  //下面可以寫外設(shè)的初始化函數(shù)
  
  //下面可以寫外部中斷初始化,halt模式只能通過外部中斷或復(fù)位喚醒,我這里用了PB1,引腳接的是OPT3001光感芯片的中斷腳
  disableInterrupts(); //先關(guān)閉總中斷(也可以不寫,如果是多個外部中斷,最好加上,不然會有個bug,具體這里不說了)
  GPIO_Init(GPIOB, GPIO_Pin_1, GPIO_Mode_In_PU_IT);  //PB1 配置成上拉外部中斷
  EXTI_DeInit();
  EXTI_SetPinSensitivity(EXTI_Pin_1,EXTI_Trigger_Falling);  //PIN1 設(shè)置為下降沿中斷(具體根據(jù)實際情況)
  enableInterrupts();//使能總中斷
  
  //下面可以控制外設(shè)進入休眠模式
  //除了單片機,單片機控制的各個模塊也會耗電,如果不需要一直工作可以進入休眠
  //比如我用到的LORA模塊,不需要一直發(fā)射或接收數(shù)據(jù),所以進入休眠模式
  //比如光照傳感器,需要一直采集數(shù)據(jù),并判斷有沒有超出設(shè)置好的上限或下限,因此不能休眠

  //單片機在進入停機模式之間,關(guān)閉沒有用到的外設(shè)可以降低功耗(根據(jù)實際情況增加和刪減)
  CLK_PeripheralClockConfig(CLK_Peripheral_ADC1,DISABLE); 
  CLK_PeripheralClockConfig(CLK_Peripheral_TIM1,DISABLE);
  CLK_PeripheralClockConfig(CLK_Peripheral_TIM2,DISABLE);
  CLK_PeripheralClockConfig(CLK_Peripheral_TIM3,DISABLE);
  CLK_PeripheralClockConfig(CLK_Peripheral_TIM4,DISABLE);
  CLK_PeripheralClockConfig(CLK_Peripheral_I2C1,DISABLE);
  CLK_PeripheralClockConfig(CLK_Peripheral_SPI1,DISABLE);
  CLK_PeripheralClockConfig(CLK_Peripheral_USART1,DISABLE);

  //把沒有接外設(shè)或者暫時不用的引腳設(shè)置為低速,輸出低(這里需要根據(jù)實際情況配置)
  //千萬別小瞧這些懸空的引腳,如果有幾個懸空的引腳沒有配置可能會多出幾百uA
  //在網(wǎng)上看到一些資料說可以設(shè)為浮空輸入,我實際測試過,在引腳懸空的情況下,引腳輸出低,功耗會更低,有外設(shè)的引腳看情況而定
  //比如引腳接了一個低電平點亮的LED燈時,引腳拉高才能降低功耗
  //我這里只寫單片機引腳不接任何外設(shè)的情況,引腳全部拉低
  GPIO_Init(GPIOA,GPIO_Pin_All, GPIO_Mode_Out_PP_Low_Slow); 
  GPIO_Init(GPIOB,GPIO_Pin_All, GPIO_Mode_Out_PP_Low_Slow);
  GPIO_Init(GPIOC,GPIO_Pin_All, GPIO_Mode_Out_PP_Low_Slow);
  GPIO_Init(GPIOD,GPIO_Pin_All, GPIO_Mode_Out_PP_Low_Slow);

  //進入停機模式
  while(1)
  {
    // 下面這一句很關(guān)鍵,加上這句才能真正進入超低功耗模式(這個函數(shù)在stm8l15x_pwr.c里面,需要把它加到工程里面)
    PWR_UltraLowPowerCmd(ENABLE); 
    //進入停機模式
	halt();
  }
}

//中斷服務(wù)函數(shù)(在stm8l15x_it.c里面)
INTERRUPT_HANDLER(EXTI1_IRQHandler, 9)
{
  EXTI_ClearITPendingBit(EXTI_IT_Pin1); //清除中斷標志
  
  //下面可以寫中斷喚醒單片機之后需要執(zhí)行的程序
  
}

功耗測試結(jié)果(僅供參考):

1.單片機引腳全部懸空,引腳全部拉低,電流為0.4uA,這個和官方手冊上面的最低功耗是一致的。

2.單片機只接一個SX1276 868MLORA模塊,LORA設(shè)置為休眠,除了LORA其他單片機引腳全部拉低,總電流為1.6uA。

3.單片機接SX1276 868MLORA模塊和OPT3001光照IC,LORA休眠,OPT3001工作,中斷不觸發(fā)的時候,電流為14uA左右。中斷喚醒后的功耗和執(zhí)行的程序相關(guān)。

測試功耗需要注意的幾點:

1.電流表接在整個電路電源輸入的地方

2.測試的時候把單片機和下載器、仿真器、串口等斷開連接。

3.測試的時候建議先單獨測試stm8,然后再把外設(shè)一個一個加上去測試,我一開始測試的時候用的是一塊電路完整的模塊,測試的時候很難確定電流降不下去的原因,折騰了很久。

推薦器件

更多器件
器件型號 數(shù)量 器件廠商 器件描述 數(shù)據(jù)手冊 ECAD模型 風(fēng)險等級 參考價格 更多信息
ASDMB-24.000MHZ-XY-T 1 Abracon Corporation MEMS OSC XO 24.0000MHZ LVCMOS
$3.25 查看
24LC64T-I/SN 1 Microchip Technology Inc 8K X 8 I2C/2-WIRE SERIAL EEPROM, PDSO8, 3.90 MM, ROHS COMPLIANT, PLASTIC, SOIC-8

ECAD模型

下載ECAD模型
$0.9 查看
FOATSCU-20D 1 L-com Inc Fiber Optic Attenuator,
暫無數(shù)據(jù) 查看

相關(guān)推薦