日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

STM32 产品低功耗待机方案处理

發布時間:2024/3/24 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 STM32 产品低功耗待机方案处理 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
關于STM32進入低功耗,我簡單的總結了一下:

1.管腳電路設置 ,端口設置,外加上拉、下拉電阻切記不能隨便加
2.時鐘設置, STM32的systick clock、DMA、TIM什么的,時鐘能關就全都關掉,STM32低功耗很簡單,關鍵是外圍電路功耗是關鍵
3.降壓芯片 ,選擇一個低功耗的LDO***,這個項目用到的LDO功耗就很不錯,靜態功耗10uA都不到。
4.模式選擇, 確定STM32設置沒問題,進入低功耗有好幾種情況可以選擇(睡眠、停機、待機),我還是推薦選擇STOP模式,這個我覺的比較好是因為可以任意外部中斷都可以喚醒,而且管腳可以保留之前的設置,進入停機模式的代碼使用庫函數自帶的,就一句:
PWR_EnterSTOPMode(PWR_Regulator_LowPower, PWR_STOPEntry_WFI);
5.引腳模式設置, 首先,想MOSI、SCK、CS、LED、RST
輸出這些管腳應該設置為推挽輸出*,TXD設置為復用輸出,而IRQ、RXD、MISO設置輸入浮空輸入,什么都沒接的管腳全都設置為**下拉輸入*
6.利用~~開關~~ 關閉外設。
意思是,在進入停機模式之前,也關掉電壓調節器,進一步降低功耗,使用WFI指令(任意中斷喚醒),但是經過測試,使用WFE(任事件喚醒)指令效果、功耗一模一樣。

前兩個月在公司做了一個低功耗項目,現在功耗最低**10uA**不到,平均功耗**40uA**左右,算是達標了。因為是公司產品,就不方便貼代碼、原理圖了,該產品是一個小模塊,可以方便的嵌入到各種系統里面。跟原子哥他們賣的NRF2401類似,是一個讀卡器。做這個項目中間也請了技術支持,因為外圍電路芯片的功耗一直降不下來,經過與對方的反復交流,對方提供了低功耗的測試結果、硬件方案、軟件方案,經過修改測試,最終成為我們的產品,功耗比較滿意。硬件方案選擇的是STM32,外加某公司的讀卡芯片。前期完成了讀卡等功能的開發,最后一項開發內容是最艱巨也是最困難的---低功耗。在開發過程中,從硬件設計上不斷裁剪元器件,軟件上不斷精簡代碼,功耗最低都保持在3-4mA。電路設計上,只用到了一個LED、串口1、一個模擬SPI、一個中斷線、一個讀卡芯片RESET線,硬件上就只剩下這么點東西了,這個時候我采用的是待機模式,使用的是讀卡芯片的中斷接PA0喚醒STM32,在此之前要先使得讀卡芯片進入低功耗、然后STM32進入低功耗,這一步完成了,貌似沒什么問題,功耗確實從幾十mA驟降到3mA左右,開始還挺滿意的,但是測試廠商提供的樣板,功耗卻只有幾十uA,有點郁悶了。為什么會這樣?反復查看硬件、程序,都找不出原因,而且這個時候的工作效果很爛,根本就不能喚醒,所以我就懷疑是讀卡芯片一端低功耗有問題,因為我將PA0腳直接短接VCC,這樣就可以產生一個邊沿觸發STM32喚醒了,但是用讀卡芯片無法喚醒,所以我懷疑是讀卡芯片的RESET腳電平不對,經檢查,確實是因為RESET腳加了上拉電阻,讀卡芯片是高電平復位,在STM32進入待機后,管腳全都浮空了,導致RESET被拉高,一直在復位;我去掉上拉電阻,覺得很有希望解決問題了,但是測試結果是:有時候能喚醒,有時候不能,我仔細一想難道是因為STM32待機后管腳電平不確定,**導致讀卡芯片RESET腳電平不定**,而工作不正常,看樣子只有換用其他方案了。后面確實驗證了我的想法,**使用STOP模式**后,喚醒問題引刃而解。就在關鍵時刻,芯片原廠火種送炭,送來急需的技術支持資料,一個包含低功耗源代碼,趕緊拿過來測試,先研讀下代碼,使用的是STOP模式,而不是待機模式,使用的是任意外部中斷喚醒,**功耗到40uA**,這個時候就相當激動啊,趕快下載測試啊,結果功耗確實降了,但還是有1mA,更人家一比多了幾十倍啊。。。 我第一反應是硬件不對,經過測試修改,首先找到第一個原因,讀卡芯片RESET管腳上拉電阻又給焊上去了...,拆掉后功耗驟降到幾百uA,還是不行。。 測試過程中,為了去掉LDO的干擾,整板采用3.3V供電,但是后面經過測試,LDO的功耗其實也只有5uA不到,這LDO功耗值得贊一個;雖然結果還是沒達到預期,但是看到了希望,勝利就在眼前啊。 為此我反復看了技術支持提供的程序,發現他們的STM32的所有管腳都的設置都有所考究:(因為公司保密原則,代碼中刪除掉了關于該讀卡芯片的前綴信息等)

GPIO_InitTypeDef GPIO_InitStructure;

/* GPIOA Periph clock enable /
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
/ GPIOB Periph clock enable /
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
/ GPIOC Periph clock enable */
//RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);

RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE);

RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
//####################################################
//USART1 Port Set
//TXD
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_Init(GPIOA, &GPIO_InitStructure);
//RXD
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOAtiNG;
GPIO_Init(GPIOA, &GPIO_InitStructure);

//RST output pushpull mode
GPIO_InitStructure.GPIO_Pin = TRST;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(PORT1, &GPIO_InitStructure);
//IRQ input pull-up mode
GPIO_InitStructure.GPIO_Pin = TIRQ;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(PORT1, &GPIO_InitStructure);
//MISO input pull-up mode
GPIO_InitStructure.GPIO_Pin = MISO;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(PORT2, &GPIO_InitStructure);
//NSS,SCK,MOSI output pushpull mode
GPIO_InitStructure.GPIO_Pin = (NSS|SCK|MOSI);
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(PORT2, &GPIO_InitStructure);
//############################################################################
//TEST Port set
//TESTO input pushpull mode
GPIO_InitStructure.GPIO_Pin = TESTO;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(TEST_PORT, &GPIO_InitStructure);
//############################################################################
//TEST Port set
//TESTI output pushpull mode
GPIO_InitStructure.GPIO_Pin = TESTI;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(TEST_PORT, &GPIO_InitStructure);
//############################################################################
//LED Port Set
//LED output pushpull mode
GPIO_InitStructure.GPIO_Pin = LED;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(LED_PORT, &GPIO_InitStructure);

//############################################################
GPIO_InitStructure.GPIO_Pin = (GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_8|GPIO_Pin_11|GPIO_Pin_12|GPIO_Pin_15);
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD;
GPIO_Init(GPIOA, &GPIO_InitStructure);

GPIO_InitStructure.GPIO_Pin = (GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7|GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_10);
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD;
GPIO_Init(GPIOB, &GPIO_InitStructure);

GPIO_InitStructure.GPIO_Pin = (GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15);
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD;
GPIO_Init(GPIOC, &GPIO_InitStructure);
首先,想MOSI、SCK、CS、LED、RST這些管腳應該設置為推挽輸出,TXD設置為復用輸出,而IRQ、RXD、MISO設置浮空輸入,什么都沒接的管腳全都設置為下拉輸入,而TESTI、TESO我一直不解是什么東東,開始就沒管,而開始的時候MISO我也沒怎么注意,設置成上拉輸入(而不是浮空輸入),反正大部分按照廠家提供的參考,我并沒有照搬,測試效果一樣,但功耗確是還有80-90uA,期間我找了好久沒找到原因,給技術支持一看,原來是因為MISO沒有設置成浮空輸入,我是設置成了上拉輸入,上拉電阻一直在消耗大約40uA的電流。。。 好吧,這是自己不夠細心導致的,以后做低功耗的項目管腳配置是個大問題,不能再這么馬虎了!!! 我將MISO設置成浮空輸入之后,最低功耗還是有40+,離10uA的最低功耗還有段距離,到底是為什么呢?最后我發現
,該讀卡芯片有個TESTIN/TESTOUT管腳,是用來測試用的,出廠后也就用不上了,我也一直以為這兩個腳確實沒什么用,就沒接;可是我發現廠家提供的樣板居然接了這兩個腳,但是廠商也沒說這兩個腳接或不接會影響功耗啊,抱著試一試的心態,我我把TESTIN/TESTOUT兩個管腳接到單片機上進行相應的配置,接下來是見證奇跡的時刻了,功耗居然真的、真的降到10uA了。。。。。。。。。。。 此處省略n個字
這時候真的很激動,真的很想罵人啊,坑爹的廠家,為什么不給提示說這兩個腳不接單片機會消耗電流呢?(也許是文檔里面提到了,但是幾百頁的文檔,還是全英文的,一堆堆的文字,我再看一遍,確實沒有提到這兩個管腳會有漏電流。)
項目就這樣完工了,中間最重要的是技術支持的強力支持,不然項目不能完工了,這個項目低功耗STM32方面難度不高,主要是讀卡芯片上面的低功耗調試起來問題很多,還是人家原廠的出馬才解決了問題,因為眾多原因,不能公布該芯片的資料,包括該芯片怎么進入低功耗也無法公開,所以抱歉~~。
關于STM32進入低功耗,我簡單的總結了一下:
1.管腳設置,這個很關鍵,還是跟你電路有關系,外加上拉、下拉電阻切記不能隨便加
2.STM32的systick clock、DMA、TIM什么的,時鐘能關就全都關掉,STM32低功耗很簡單,關鍵是外圍電路功耗是關鍵
3.選擇一個低功耗的LDO***,這個項目用到的LDO功耗就很不錯,靜態功耗10uA都不到。
4.確定STM32設置沒問題,進入低功耗有好幾種情況可以選擇(睡眠、停機、待機),我還是推薦選擇STOP模式,這個我覺的比較好是因為可以任意外部中斷都可以喚醒,而且管腳可以保留之前的設置,進入停機模式的代碼使用庫函數自帶的,就一句:
PWR_EnterSTOPMode(PWR_Regulator_LowPower, PWR_STOPEntry_WFI);
5.首先,想MOSI、SCK、CS、LED、RST
輸出這些管腳應該設置為推挽輸出*,TXD設置為復用輸出,而IRQ、RXD、MISO設置輸入浮空輸入,什么都沒接的管腳全都設置為**下拉輸入*
意思是,在進入停機模式之前,也關掉電壓調節器,進一步降低功耗,使用WFI指令(任意中斷喚醒),但是經過測試,使用WFE(任事件喚醒)指令效果、功耗一模一樣。
最后一步是從STOP模式怎么恢復了,恢復其實也很簡單,外部中斷來了會進入中斷函數,然后STM32就被喚醒,喚醒還要做一些工作,需要開啟外部晶振(當然你也可以選擇使用內部自帶振蕩器)、開啟你需要的外設等等。

總之,低功耗關鍵我覺得還是在于管腳配置,以及你對于外圍電路的掌握。

總結

以上是生活随笔為你收集整理的STM32 产品低功耗待机方案处理的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。