咋看題目,貌似有點(diǎn)情感類文字了。呵呵,當(dāng)然不是,至少不完全是。這里是指在MCU開發(fā)過程中不要完全無(wú)視或忽視復(fù)位后各模塊的初始狀態(tài)及各寄存器的默認(rèn)初始值的意思。
我們知道,除了個(gè)別模塊或寄存器在MCU復(fù)位后其初始值或初始狀態(tài)是不確定的外,其它模塊及相應(yīng)寄存器都呈現(xiàn)一個(gè)確定的初始狀態(tài)或初始值。由于這些復(fù)位后的初始狀態(tài)或初始值可能跟我們應(yīng)用開發(fā)所期待的不一致,常常在應(yīng)用程序的開始部分重新根據(jù)實(shí)際需求對(duì)相關(guān)寄存器做初始化配置。其中有些寄存器對(duì)用戶來(lái)說(shuō)是只讀的,用戶程序一般不必自行手動(dòng)初始化。但這也并不代表我們對(duì)這類寄存器可以完全視而不見或置之不理,比方狀態(tài)寄存器。我們使用相關(guān)外設(shè)時(shí),往往需要對(duì)相關(guān)狀態(tài)寄存器的初始值加以關(guān)注或使用。 這里以某論壇上的一個(gè)咨詢帖的一個(gè)案例具體聊聊。某STM32用戶咨詢?nèi)缦拢?/span> STM32F103的通用定時(shí)器,設(shè)置了TIM2的基本時(shí)基(使能了計(jì)數(shù)器溢出中斷),并沒有用CCRx,但是到了第一次及以后計(jì)數(shù)器溢出,TIM2_SR的CCxIF都被置'1'了。這是為什么呀!糾結(jié)了很久。。。。 void TIM2_IRQHandler(void) { TIM2->SR=~0x0001;// TIM_ClearFlag(TIM2, TIM_FLAG_Update);// GPIOB->ODR^=0X0001; } 咨詢者使用STM32F103 的TIM2 作基本的計(jì)數(shù)定時(shí)功能,溢出中斷里做GPIO的翻轉(zhuǎn)動(dòng)作。令他糾結(jié)郁悶的是,為什么都沒使用IC/OC這些功能,SR里的CCxIF怎么會(huì)被置1了?!

查看手冊(cè)中令咨詢者感到疑惑的CCxIF位,它是定時(shí)器x通道的捕捉或比較中斷標(biāo)志位。該位真正狀態(tài)含義取決于該通道是配置為IC還是OC。那問題來(lái)了,以通道1為例,現(xiàn)在用戶沒有配置它,那通道1在芯片復(fù)位后默認(rèn)的初始狀態(tài)到底是IC還是OC呢? 某定時(shí)器通道是做IC還是OC,得看TIMx_CCMRn寄存器中的CCnS位。 
結(jié)合上面截圖描述,一目了然,定時(shí)器CC1通道在MCU復(fù)位后默認(rèn)為OC模式,那再回頭看SR寄存器里的初始值及相關(guān)描述。  本來(lái),CC1IF位復(fù)位后的初始值為0,但由于咨詢者只使用基本的計(jì)數(shù)定時(shí)功能,沒有開啟CC功能,未對(duì)相關(guān)寄存器做額外的初始化,CC1通道維持默認(rèn)的OC模式,CCR1維持默認(rèn)值0;雖然CNT的值在不停的變化,但也是從0到ARR間變化。當(dāng)CNT= 0時(shí),其值與CCR1的值匹配導(dǎo)致CC1IF被硬件置1也就不奇怪了。

具體結(jié)合到本案,咨詢者主要是糾結(jié)于想搞清是怎么回事,以解心頭之郁悶。具體應(yīng)用時(shí)他可以不予理睬,不開啟相關(guān)中斷就好。
其實(shí),我們?cè)贛CU應(yīng)用開發(fā)過程中因?yàn)楹鲆暬驘o(wú)視某些寄存器的默認(rèn)值而遇到些讓人迷惑不解的情況還很多。這里順便再提個(gè)比較常遇見的一個(gè)關(guān)于ST MCU 的UART 狀態(tài)寄存器默認(rèn)初始值的話題。
STM32各系列的UART狀態(tài)寄存器的不同系列間在具體內(nèi)容和標(biāo)志位的清零方面還略有差異,細(xì)節(jié)請(qǐng)查看各系列參考手冊(cè)相關(guān)部分。但芯片復(fù)位后其初始值均為0x000000C0,其中的TXE/TC標(biāo)志復(fù)位后的初始值為1。在ST MCU UART應(yīng)用中有時(shí)因?yàn)楹鲆曔@兩個(gè)初始值,遇到麻煩一下子找不到原因。比方第一個(gè)數(shù)據(jù)發(fā)送失;還沒開始發(fā)送數(shù)據(jù)就沒完沒了進(jìn)UART發(fā)送中斷啊諸如此類的事情。
從下面兩副截圖可以看出STM32F0與STM32F1在UART 的TXE標(biāo)志清零方式是有差異的。 
這里說(shuō)的都是些溫馨提示,提醒在MCU產(chǎn)品開發(fā)過程中不要完全忽視各模塊及寄存器的默認(rèn)初始值,沒啥高深莫測(cè)的東西。不是古語(yǔ)有云:天下難事做于易,天下大事做于細(xì)嘛!
誠(chéng)然,目前ST MCU的開發(fā)生態(tài)系統(tǒng)非常強(qiáng)大和方便,尤其STM32CubeMxg工具和STM32Cube庫(kù)讓STM32 的開發(fā)變得更為簡(jiǎn)單方便,但在開發(fā)應(yīng)用中遇到問題時(shí)還是不可無(wú)視技術(shù)手冊(cè),尤其是那些細(xì)節(jié)和注意事項(xiàng)。
很多時(shí)候產(chǎn)品開發(fā)過程中遇到的問題能否盡快解決,除了理論基礎(chǔ)外,往往還跟你內(nèi)心的淡定度、查看手冊(cè)或線路的細(xì)致度以及做事的條理性不無(wú)關(guān)系。 寫上這些,與大家分享共勉。勿忘初始,勿忘初心,祝君好運(yùn)!
|