<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > stm32低功耗設(shè)計(jì)經(jīng)驗(yàn)

          stm32低功耗設(shè)計(jì)經(jīng)驗(yàn)

          作者: 時間:2016-11-27 來源:網(wǎng)絡(luò) 收藏
          只看帖不發(fā)帖是不好的,我也來發(fā)發(fā)帖子吧,寫的不好諒解啊。

          前兩個月在公司做了一個低功耗項(xiàng)目,現(xiàn)在功耗最低10uA不到,平均功耗40uA左右,算是達(dá)標(biāo)了。因?yàn)槭枪井a(chǎn)品,就不方便貼代碼、原理圖了,該產(chǎn)品是一個小模塊,可以方便的嵌入到各種系統(tǒng)里面。跟原子哥他們賣的NRF2401類似,是一個讀卡器。
          做這個項(xiàng)目中間也請了技術(shù)支持,因?yàn)橥鈬娐沸酒墓囊恢苯挡幌聛?,?jīng)過與對方的反復(fù)交流,對方提供了低功耗的測試結(jié)果、硬件方案、軟件方案,經(jīng)過修改測試,最終成為我們的產(chǎn)品,功耗比較滿意。
          硬件方案選擇的是STM32,外加某公司的讀卡芯片。前期完成了讀卡等功能的開發(fā),最后一項(xiàng)開發(fā)內(nèi)容是最艱巨也是最困難的---低功耗。在開發(fā)過程中,從硬件設(shè)計(jì)上不斷裁剪元器件,軟件上不斷精簡代碼,功耗最低都保持在3-4mA。

          本文引用地址:http://www.ex-cimer.com/article/201611/322432.htm

          電路設(shè)計(jì)上,只用到了一個LED、串口1、一個模擬SPI、一個中斷線、一個讀卡芯片RESET線,硬件上就只剩下這么點(diǎn)東西了,這個時候我采用的是待機(jī) 模式,使用的是讀卡芯片的中斷接PA0喚醒STM32,在此之前要先使得讀卡芯片進(jìn)入低功耗、然后STM32進(jìn)入低功耗,這一步完成了,貌似沒什么問題, 功耗確實(shí)從幾十mA驟降到3mA左右,開始還挺滿意的,但是測試廠商提供的樣板,功耗卻只有幾十uA,有點(diǎn)郁悶了。為什么會這樣?反復(fù)查看硬件、程序,都 找不出原因,而且這個時候的工作效果很爛,根本就不能喚醒,所以我就懷疑是讀卡芯片一端低功耗有問題,因?yàn)槲覍A0腳直接短接VCC,這樣就可以產(chǎn)生一 個邊沿觸發(fā)STM32喚醒了,但是用讀卡芯片無法喚醒,所以我懷疑是讀卡芯片的RESET腳電平不對,經(jīng)檢查,確實(shí)是因?yàn)镽ESET腳加了上拉電阻,讀卡 芯片是高電平復(fù)位,在STM32進(jìn)入待機(jī)后,管腳全都浮空了,導(dǎo)致RESET被拉高,一直在復(fù)位;我去掉上拉電阻,覺得很有希望解決問題了,但是測試結(jié)果 是:有時候能喚醒,有時候不能,我仔細(xì)一想難道是因?yàn)镾TM32待機(jī)后管腳電平不確定,導(dǎo)致讀卡芯片RESET腳電平不定,而工作不正常,看樣子只有換用 其他方案了。后面確實(shí)驗(yàn)證了我的想法,使用STOP模式后,喚醒問題引刃而解。
          就在關(guān)鍵時刻,芯片原廠火種送炭,送來急需的技術(shù)支持資料,一個包含低功耗源代碼,趕緊拿過來測試,先研讀下代碼,使用的是STOP模式,而不是待機(jī)模 式,使用的是任意外部中斷喚醒,功耗低制40uA,這個時候就相當(dāng)激動啊,趕快下載測試啊,結(jié)果功耗確實(shí)降了,但還是有1mA,更人家一比多了幾十倍 啊。。。
          我第一反應(yīng)是硬件不對,經(jīng)過測試修改,首先找到第一個原因,讀卡芯片RESET管腳上拉電阻又給焊上去了...,拆掉后功耗驟降到幾百uA,還是不行。。 測試過程中,為了去掉LDO的干擾,整板采用3.3V供電,但是后面經(jīng)過測試,LDO的功耗其實(shí)也只有5uA不到,這LDO功耗值得贊一個;雖然結(jié)果還是 沒達(dá)到預(yù)期,但是看到了希望,勝利就在眼前啊。
          為此我反復(fù)看了技術(shù)支持提供的程序,發(fā)現(xiàn)他們的STM32的所有管腳都的設(shè)置都有所考究:(因?yàn)楣颈C茉瓌t,代碼中刪除掉了關(guān)于該讀卡芯片的前綴信息等)

          GPIO_InitTypeDef GPIO_InitStructure;


          RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);

          RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, 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這些管腳應(yīng)該設(shè)置為推挽輸出,TXD設(shè)置為復(fù)用輸出,而IRQ、RXD、MISO設(shè)置浮空輸入,什么都沒 接的管腳全都設(shè)置為下拉輸入,而TESTI、TESO我一直不解是什么東東,開始就沒管,而開始的時候MISO我也沒怎么注意,設(shè)置成上拉輸入(而不是浮 空輸入),反正大部分按照廠家提供的參考,我并沒有照搬,測試效果一樣,但功耗確是還有80-90uA,期間我找了好久沒找到原因,給技術(shù)支持一看,原來 是因?yàn)镸ISO沒有設(shè)置成浮空輸入,我是設(shè)置成了上拉輸入,上拉電阻一直在消耗大約40uA的電流。。。 好吧,這是自己不夠細(xì)心導(dǎo)致的,以后做低功耗的項(xiàng)目管腳配置是個大問題,不能再這么馬虎了!??! 我將MISO設(shè)置成浮空輸入之后,最低功耗還是有40+,離10uA的最低功耗還有段距離,到底是為什么呢?最后我發(fā)現(xiàn)

          ,該讀卡芯片有個TESTIN/TESTOUT管腳,是用來測試用的,出廠后也就用不上了,我也一直以為這兩個腳確實(shí)沒什么用,就沒接;可是我發(fā)現(xiàn) 廠家提供的樣板居然接了這兩個腳,但是廠商也沒說這兩個腳接或不接會影響功耗啊,抱著試一試的心態(tài),我我把TESTIN/TESTOUT兩個管腳接到單片 機(jī)上進(jìn)行相應(yīng)的配置,接下來是見證奇跡的時刻了,功耗居然真的、真的降到10uA了。。。。。。。。。。。 此處省略n個字
          這時候真的很激動,真的很想罵人啊,坑爹的廠家,為什么不給提示說這兩個腳不接單片機(jī)會消耗電流呢?(也許是文檔里面提到了,但是幾百頁的文檔,還是全英文的,一堆堆的文字,我再看一遍,確實(shí)沒有提到這兩個管腳會有漏電流。)
          項(xiàng)目就這樣完工了,中間最重要的是技術(shù)支持的強(qiáng)力支持,不然項(xiàng)目不能完工了,這個項(xiàng)目低功耗STM32方面難度不高,主要是讀卡芯片上面的低功耗調(diào)試起來 問題很多,還是人家原廠的出馬才解決了問題,因?yàn)楸姸嘣?,不能公布該芯片的資料,包括該芯片怎么進(jìn)入低功耗也無法公開,所以抱歉~~。
          關(guān)于STM32進(jìn)入低功耗,我簡單的總結(jié)了一下:
          1.管腳設(shè)置,這個很關(guān)鍵,還是跟你電路有關(guān)系,外加上拉、下拉電阻切記不能隨便加
          2.STM32的systick clock、DMA、TIM什么的,能關(guān)就全都關(guān)掉,STM32低功耗很簡單,關(guān)鍵是外圍電路功耗是關(guān)鍵
          3.選擇一個低功耗的LDO,這個項(xiàng)目用到的LDO功耗就很不錯,靜態(tài)功耗10uA都不到。
          4.確定STM32設(shè)置沒問題,進(jìn)入低功耗有好幾種情況可以選擇(睡眠、停機(jī)、待機(jī)),我還是推薦選擇STOP模式,這個我覺的比較好是因?yàn)榭梢匀我馔獠恐袛喽伎梢詥拘眩夜苣_可以保留之前的設(shè)置,進(jìn)入停機(jī)模式的代碼使用庫函數(shù)自帶的,就一句:

          PWR_EnterSTOPMode(PWR_Regulator_LowPower, PWR_STOPEntry_WFI);
          意思是,在進(jìn)入停機(jī)模式之前,也關(guān)掉電壓調(diào)節(jié)器,進(jìn)一步降低功耗,使用WFI指令(任意中斷喚醒),但是經(jīng)過測試,使用WFE(任事件喚醒)指令效果、功耗一模一樣。
          最后一步是從STOP模式怎么恢復(fù)了,恢復(fù)其實(shí)也很簡單,外部中斷來了會進(jìn)入中斷函數(shù),然后STM32就被喚醒,喚醒還要做一些工作,需要開啟外部晶振(當(dāng)然你也可以選擇使用內(nèi)部自帶振蕩器)、開啟你需要的外設(shè)等等。

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

          關(guān)于低功耗,我也做過,
          STM32這端,建議:
          1用STANDARD模式,用wkup喚醒要比STOP模式更省電不少。
          2將外部所有設(shè)備的時鐘關(guān)閉[除非有必要],并置所有IO為模擬輸入狀態(tài)(或者浮空輸入)


          那個電流表測整板的工作電流,沒必要一一去測某一個模塊。不同的IO設(shè)置會導(dǎo)致不同的漏電流,所以IO要設(shè)置正確,這個要注意額。TIM的時鐘也建議都關(guān)掉吧,很耗電,采用外部中斷喚醒或者RTC喚醒都可以的


          給的代碼就是在進(jìn)入stop之前要把管腳這樣設(shè)置的是么?

          思路是不是這樣:
          1,進(jìn)入stop之前將管腳重新設(shè)置,關(guān)閉不用的外設(shè)和時鐘
          2,進(jìn)入stop指令
          3,退出時進(jìn)入中斷,先重新配置管腳以及開啟時鐘和外設(shè)



          關(guān)鍵詞: stm32低功耗設(shè)

          評論


          技術(shù)專區(qū)

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();