我們知道,STM32芯片里有很多系統(tǒng)級(jí)的復(fù)位,比方上電復(fù)位、欠壓復(fù)位、看門(mén)狗復(fù)位、軟件復(fù)位、復(fù)位腳電平觸發(fā)復(fù)位等等。這些系統(tǒng)級(jí)的復(fù)位往往都是針對(duì)整個(gè)芯片或芯片的絕大部分區(qū)域。
其實(shí),我們?cè)趯?shí)際應(yīng)用中有時(shí)候可能并不需要、甚至不接受總是對(duì)整個(gè)芯片做大面積的復(fù)位。正因?yàn)槿绱耍琒TM32的芯片里除了具備那些系統(tǒng)級(jí)復(fù)位功能外,還針對(duì)各個(gè)外設(shè)設(shè)計(jì)了復(fù)位功能,即我們可以只需針對(duì)某特定外設(shè)或特定區(qū)域做復(fù)位而不影響其它。特定區(qū)域一般是指某一塊總線驅(qū)動(dòng)的外設(shè)集,比方掛在APB1總線的所有外設(shè)。
或許有人不了解、或者說(shuō)沒(méi)有使用過(guò)針對(duì)特定外設(shè)復(fù)位的功能,這里就簡(jiǎn)單介紹下,拋磚引玉。在STM32各個(gè)系列的參考手冊(cè)里的RCC章節(jié),有關(guān)于對(duì)外設(shè)或局部外設(shè)集進(jìn)行復(fù)位的介紹。類似下圖所示信息:
結(jié)合上面截圖內(nèi)容,我們可以針對(duì)性地對(duì)某個(gè)特定外設(shè)做強(qiáng)制復(fù)位及復(fù)位釋放。在ST提供的外設(shè)固件庫(kù)里也有相應(yīng)的函數(shù)可以調(diào)用。比方HAL庫(kù)里面就是類似下面這些的代碼【不同版本寫(xiě)法或許略有差異】:
從上面截圖里的代碼不難看出,針對(duì)某個(gè)外設(shè)的復(fù)位和釋放代碼都是成對(duì)地寫(xiě)好了的。那么,針對(duì)STM32外設(shè)做復(fù)位,一般用在哪些場(chǎng)合呢。我這里稍微總結(jié)了下,大致有下面三種情況供參考使用。
一、撥亂反正,歸零再來(lái)
在具體應(yīng)用中,難免可能出現(xiàn)某特定外設(shè)工作異常的情形,這時(shí),我們可以嘗試對(duì)該外設(shè)做強(qiáng)制復(fù)位,然后重新配置后啟動(dòng)運(yùn)行。比方說(shuō),我們?cè)谑褂?a href="http://m.xsypw.cn/tags/i2c/" target="_blank">I2C硬件模式時(shí),有時(shí)會(huì)碰到I2C總是出現(xiàn)busy狀態(tài),這時(shí)我們可以嘗試對(duì)I2C外設(shè)做個(gè)強(qiáng)制復(fù)位,然后再做后續(xù)配置。
__I2C1_FORCE_RESET();
__I2C1_RELEASE_RESET();
再比如,有時(shí)可能碰到芯片外部LSE工作不穩(wěn)定,除了排查其它因素外,我們還可以嘗試在配置系統(tǒng)時(shí)鐘前對(duì)RTC域先做強(qiáng)制復(fù)位操作。
__HAL_RCC_BACKUPRESET_FORCE();
__HAL_RCC_BACKUPRESET_RELEASE();
總之,某外設(shè)工作途中出現(xiàn)異常,對(duì)其進(jìn)行強(qiáng)制復(fù)位,這樣我們可以不受那些不清晰或不確定的狀態(tài)干擾,再做配置后重新運(yùn)行也是比較常見(jiàn)的應(yīng)對(duì)問(wèn)題的一種做法。
二、改頭換面,重拾使命
在程序運(yùn)行過(guò)程中,我們有時(shí)需要對(duì)外設(shè)做參數(shù)或功能的變動(dòng),這時(shí)對(duì)外設(shè)做針對(duì)性地強(qiáng)制復(fù)位就很有必要。其中有些參數(shù)或狀態(tài)的改變本身就要求對(duì)外設(shè)做復(fù)位。比方,有些寄存器是帶LOCK功能的,當(dāng)設(shè)置LOCK位后,若要消除LOCK功能,往往需要對(duì)該外設(shè)做復(fù)位操作,【此時(shí)顯然也沒(méi)必要來(lái)個(gè)系統(tǒng)級(jí)復(fù)位】。又比方,RTC的時(shí)鐘切換也是需要對(duì)RTC域復(fù)位的,否則你變更不了。
當(dāng)然,更為常見(jiàn)的是,我們經(jīng)常會(huì)在代碼中根據(jù)時(shí)間或事件的變化而變更外設(shè)的功能及參數(shù),需要重新配置外設(shè)。這時(shí)來(lái)個(gè)快刀斬亂麻,對(duì)外設(shè)先做個(gè)強(qiáng)制復(fù)位再做配置就非常簡(jiǎn)單清爽。
比方前不久有人問(wèn)起一個(gè)CAN應(yīng)用方面的問(wèn)題。 他開(kāi)始是基于回環(huán)模式對(duì)CAN進(jìn)行測(cè)試,然后想切換到Normal模式。令他費(fèi)解的是,怎么也切換不過(guò)去,除非做模式切換配置之前加入下面這段代碼:
上面代碼的主要功能就是對(duì)CAN1做強(qiáng)制復(fù)位。因?yàn)檫@是ST早期標(biāo)準(zhǔn)庫(kù)的代碼,所以代碼寫(xiě)法上跟我前面貼出來(lái)的很不一樣,但功能一樣。客戶對(duì)上面兩行代碼的功能理解有誤,以為是對(duì)CAN1外設(shè)的時(shí)鐘進(jìn)行開(kāi)啟和關(guān)閉,質(zhì)問(wèn)此處開(kāi)關(guān)時(shí)鐘操作的意義何在,很是覺(jué)得匪夷所思。不難理解,先行對(duì)CAN1做強(qiáng)制復(fù)位,讓所有狀態(tài)先回歸到默認(rèn)初始狀態(tài)【Default state after reset】,然后再做新的配置,就不會(huì)受到之前回環(huán)模式下的那些配置的牽牽絆絆了,做起狀態(tài)切換來(lái)自然是順山順?biāo)?/p>
三、節(jié)能減排,錦上添花
在涉及到STM32芯片低功耗應(yīng)用時(shí),在進(jìn)入低功耗模式前,我們除了做些常規(guī)的動(dòng)作外,比如關(guān)閉相應(yīng)外設(shè)的運(yùn)行、處理不用的或跟外界有連接的GPIO等。如果在進(jìn)入低功耗模式前,對(duì)剛才使用過(guò)的外設(shè),先來(lái)個(gè)強(qiáng)制復(fù)位,有時(shí)或許會(huì)給你帶來(lái)意想不到的收效。
上面我大致介紹了幾種可能用到外設(shè)復(fù)位的場(chǎng)景,當(dāng)然也不排除還有其它場(chǎng)景。總之,適時(shí)恰當(dāng)?shù)厥褂猛庠O(shè)復(fù)位,也是我們STM32開(kāi)發(fā)者可以善加利用的一個(gè)工具或手段。關(guān)于STM32外設(shè)復(fù)位,這里給兩點(diǎn)提醒作為結(jié)尾。
第一點(diǎn),在做外設(shè)復(fù)位前,該外設(shè)的時(shí)鐘一定是開(kāi)啟了的,更不要與外設(shè)時(shí)鐘的開(kāi)啟和關(guān)閉相混淆。
第二點(diǎn),一般來(lái)講,針對(duì)外設(shè)復(fù)位操作要求成對(duì)出現(xiàn)。即先做強(qiáng)制復(fù)位【xxx_Reset_Force】,緊接著做復(fù)位釋放【xxx_Reset_Release】。針對(duì)外設(shè)復(fù)位的代碼,在ST提供的HAL庫(kù)例程里不難看到,多封裝在xxx__MspDeInit()函數(shù)里面。
責(zé)任編輯:彭菁
-
軟件
+關(guān)注
關(guān)注
69文章
5137瀏覽量
89015 -
函數(shù)
+關(guān)注
關(guān)注
3文章
4374瀏覽量
64385 -
STM32芯片
+關(guān)注
關(guān)注
0文章
38瀏覽量
4581
發(fā)布評(píng)論請(qǐng)先 登錄
使用C語(yǔ)言編寫(xiě) 外設(shè)芯片的復(fù)位功能
STM32外設(shè)寄存器簡(jiǎn)介及簡(jiǎn)單用法
STM32芯片異常復(fù)位的原因有哪些

STM32片上外設(shè)時(shí)鐘使能 失能和復(fù)位的區(qū)別
芯片外設(shè)接口的功能

STM32復(fù)位來(lái)源、以及系統(tǒng)和內(nèi)核復(fù)位區(qū)別

經(jīng)典案例解析 | STM32芯片異常復(fù)位

淺析stm32復(fù)位電路方法

評(píng)論