這幾天對公司的一個生產小工具進行了升級,由于準備將小工具發給客戶使用,因此需要制作的精良一些,于是便卡在低功耗上,
程式是公司前輩幾年前寫的,在stm32f042單片機中使用正常,自己畫的第一版電路板也是f042單片機,刷進去程式后實測功耗低于0.01mA,萬用表顯示0.00mA,
然而將程式刷進更新后的板子,功耗就上去了,達到了0.88mA,翻了百倍,
好的起先是懷疑硬體電路問題,將外圍電路拆除后,功耗竟然上升到1.5mA了,
得,直接找了塊新板子只焊了單片機和幾個電容,測驗還是1.5mA,
這時候基本確定就是程式問題了,當然也有可能是我PCB畫的有問題,但是檢查了一會兒沒發現什么問題,就直接去查程式了,
在網路上檢索了“stm32f0”“低功耗”“STOP模式”“停止模式”等關鍵詞后,查詢到了以下幾篇文章,在這里只列出與現在的問題相關的,可能是檢索詞有問題,最后也只有這幾篇文章,
https://bbs.21ic.com/icview-329660-1-1.html
http://www.stmcu.org.cn/module/forum/thread-613274-1-1.html
https://bbs.21ic.com/icview-2533200-1-1.html
https://blog.csdn.net/qq_16587307/article/details/81739838?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-2.nonecase&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-2.nonecase
https://blog.csdn.net/hanping1020/article/details/89431935
前輩說可能是單片機有什么功能沒有關掉,所以檢索的時候也著重檢索了“STOP模式”和“耗電”相關內容,
翻了一會兒帖子,基本上都是說IO口配置沒有配置好,覺得還是得自己嘗試一下,
在單片機開機時,將所有IO口都設定為下拉輸入(注意:這里是因為當前PCB只焊了單片機,可以說所有引腳都是懸空狀態),然后直接延時五秒鐘,然后進入STOP模式,這里要注意一定要延時一會兒,不然接下來在STOP模式是無法下載程式的!
程式下載進去,果然,5秒后進入停止模式,單片機功耗達到0.006mA,
OK!
接下來就是要測驗一下什么程式沒有關掉,
ADC、USB、定時器、各IO模塊晶振應該是全部關掉了,沒有檢查出什么問題來,
這時候,重點來了,這時候心知肚明的是,一定是有什么東西沒有關掉,但是不知道是哪里出的問題,
!直接從初始化入手!
把初始化部分的幾個模塊逐個注釋掉!
果然!注釋到USB_Init();時,功耗沒有了,
就是USB的鍋!
繼續檢索,這時候檢索到寫一篇文章,在這里看到了大佬的留言:

USB先復位,再關閉,
檢查一下自己的程式,只關閉了,沒有復位,
然后抱著試試看的成分在USB關閉之前,寫了下面一句話:
RCC->APB1RSTR = RCC_APB1RSTR_USBRST;
我承認有賭的成分,可是......不好意思跳戲了......
功耗正常了,就是USB的問題,USB的關閉除了需要關閉以下幾個模塊之外,需要先將USB復位,
其實在測驗程序中還有個小插曲,到了小插曲就基本上鎖定了問題所在,因為同一個程式,在F042上ok,在F072上GG,區別是F042使用的20pin,F072使用的48pin,在引腳上除了普通IO口之外,有1個區別:
F042的USB是使用的IO口復用功能,將PA9和10重映射到11和12,11和12這兩個引腳擁有USB功能,
總結一下,如果網友們有遇到停止模式或是睡眠模式功耗過高的問題,可以按以下順序著手測驗:
1.先清除PCB上其他元器件,或是只焊單片機,確認GPIO全部懸空,
2.程式初始化階段,將所有GPIO置下拉輸入,延時幾秒鐘,進入STOP模式或是SLEEP模式,檢查功耗是否正常,一般而言,這一步如果正常,那么PCB的問題基本就排除了,當然前提是所有IO都是懸空狀態,如果有直接接到VCC或是其他高電平處,該引腳置上拉輸入,
3.然后將自己的程式中的初始化部分逐個注釋,排查是哪個模塊沒有關掉,到這一步基本能排查出問題了,
4.根據第3步排查出的問題,檢索解決辦法,
需要注意的是:要仔細觀察功耗的變化,如果程式修改完功耗有變化,那么修改處一定是有問題的,
再總結一下可能出現問題的地方:
1.IO口配置,可先全部下拉,然后檢查電路,對需要上拉的地方上拉,懸空腳、接地腳下拉,接VCC或其他高電平信號腳上拉,也可設定輸出模式,具體輸出當時可以自己測驗一下,
2.檢查使用到的模塊,USB,ADC等都是重點,像USB,要關的話,里面有很多地方都需要關,例如:
CRS_AutomaticCalibrationCmd(DISABLE); CRS_FrequencyErrorCounterCmd(DISABLE); RCC_APB1PeriphClockCmd(RCC_APB1Periph_CRS, DISABLE); NVIC_InitStructure.NVIC_IRQChannel = USB_IRQn; NVIC_InitStructure.NVIC_IRQChannelPriority = 1; NVIC_Init(&NVIC_InitStructure); NVIC_DisableIRQ(USB_IRQn); RCC->APB1RSTR = RCC_APB1RSTR_USBRST; RCC_APB1PeriphClockCmd(RCC_APB1Periph_USB, DISABLE);
3.注意各模塊關閉程式的順序,例如:
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 |GPIO_Pin_1; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN; GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_DOWN; GPIO_Init(GPIOF, &GPIO_InitStructure); RCC_AHBPeriphClockCmd( RCC_AHBPeriph_GPIOF, DISABLE);
先設定下拉再關相關IO模塊的時鐘,對于每個模塊,時鐘最后關,
-謝謝-
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/41126.html
標籤:其他
