初涉STM32之淺談時(shí)鐘使能問(wèn)題
作為一個(gè)STM32的菜鳥(niǎo)級(jí)人物,我剛開(kāi)始接觸STM32時(shí),其實(shí)和當(dāng)年開(kāi)始學(xué)習(xí)51單片機(jī)的心理是一樣的。茫然,誰(shuí)說(shuō)不是呢?但是,正常的學(xué)習(xí)途徑無(wú)非就是看書(shū),然后敲代碼,最后燒程序,有問(wèn)題就check,然后再繼續(xù)燒,我都懷疑我快成了火頭工。因?yàn)樵谖业挠∠笾?,只有這類職業(yè)才和“燒”有著密不可分的聯(lián)系。即使當(dāng)一名敬業(yè)又牛逼的火頭工是我畢生的夢(mèng)想。OK,不侃了。我希望,通過(guò)寫日志把我作為一個(gè)菜鳥(niǎo)在學(xué)習(xí)STM32中的問(wèn)題記錄下來(lái),同時(shí)以我為鑒,規(guī)避那些沒(méi)有必要的破事。
1. 學(xué)習(xí)STM32要不要基礎(chǔ)
原則上它應(yīng)該是需要的,但是,我們也能發(fā)現(xiàn)很多人也是沒(méi)有基礎(chǔ)的。比如說(shuō),我們實(shí)驗(yàn)室的大師兄原來(lái)是管理專業(yè),但是現(xiàn)在相當(dāng)牛逼,軟硬皆通。如果你和很多致力于在技術(shù)領(lǐng)域中作出一番成就的人一樣,你必須記住:你再也不能任性地說(shuō)要給自己一大塊時(shí)間系統(tǒng)地學(xué)習(xí)知識(shí),不現(xiàn)實(shí)。更多的時(shí)候,情況是:敲代碼時(shí)需要什么你就去找相應(yīng)的“部分知識(shí)”,然后搞明白,解決當(dāng)前的問(wèn)題。就是這樣。
2. 學(xué)習(xí)STM32需要什么基礎(chǔ)
理論上,需要數(shù)字電路,模擬電路,C語(yǔ)言編程基礎(chǔ),單片機(jī)會(huì)一點(diǎn)就更好了,這樣的話會(huì)能適應(yīng)STM32的編程開(kāi)發(fā)思路。不過(guò)幫助不大,這也是我要寫“淺談時(shí)鐘問(wèn)題”的原因。而我的情況是,全都學(xué)過(guò),但你看清楚,只是學(xué)過(guò)而已。關(guān)于數(shù)字電路和模擬電路這種課程,我也是記不得什么了。好在我們實(shí)驗(yàn)室,技術(shù)方面的書(shū)從來(lái)不缺。
3. 學(xué)習(xí)STM32對(duì)性別有要求嗎
一般,女生都會(huì)問(wèn)這個(gè)問(wèn)題。我也問(wèn)過(guò),所以你就知道我為什么能成為“婦女之友”了。玩笑玩笑啦。其實(shí)沒(méi)有,女生在這方面有先天性的優(yōu)勢(shì),心思細(xì)膩,稍一轉(zhuǎn)化,這就是態(tài)度認(rèn)真的同義詞。而且,世界上第一個(gè)程序員是女性。行啦,女同學(xué)別得瑟了?。?!
4. 進(jìn)入正題
STM32的新手,一般都會(huì)對(duì)一個(gè)問(wèn)題很糾結(jié)。我也是,就是所謂的”時(shí)鐘問(wèn)題“。我們?cè)诒M心STM32編程時(shí),會(huì)痛苦地發(fā)現(xiàn)這樣一個(gè)事實(shí):不管你要干嘛,你首先要做的一件事就是使能時(shí)鐘。而且可能每一次的時(shí)鐘還是不同的。你就會(huì)問(wèn):為什么要使能時(shí)鐘?為什么每次使能的時(shí)鐘還不一樣呢?為什么51單片機(jī)中沒(méi)有這些鬼?
在學(xué)51單片機(jī)的時(shí)候,基本上接觸不到I/O方向和外設(shè)時(shí)鐘的概念,I/O想輸入就直接讀,想輸出就直接賦值,串口、AD轉(zhuǎn)化、外部中斷等等也都是想用就用,不需要單獨(dú)配置時(shí)鐘。這樣在初學(xué)時(shí)的確方便了很多,不需要有亂七八糟的設(shè)置就能讓芯片跑起來(lái),但是隨之帶來(lái)的就是所謂的功耗問(wèn)題。但是作為初學(xué)者,誰(shuí)他媽還管這個(gè)???能讓程序跑起來(lái)就已經(jīng)讓我們興奮得幾個(gè)晚上睡不著覺(jué)了。說(shuō)這話不太合適,但事實(shí)上很多芯片生產(chǎn)廠商也不考慮這個(gè)問(wèn)題。
可是隨著電子產(chǎn)品集成度越來(lái)越高,功耗和發(fā)熱越來(lái)越嚴(yán)重,芯片廠商非常無(wú)奈也在開(kāi)始想辦法避免這個(gè)問(wèn)題,而最直接的思路當(dāng)然就是用多少功能就使能多少功能,對(duì)每個(gè)外設(shè)的時(shí)鐘都設(shè)置了開(kāi)關(guān),讓用戶可以精確地控制,關(guān)閉不需要的設(shè)備,達(dá)到節(jié)省供電的目的。如果不用的就完全關(guān)閉,盡可能降低芯片功耗,所以就出現(xiàn)了這么多的時(shí)鐘和IO配置。說(shuō)白了,時(shí)鐘的功能就好像是一個(gè)小開(kāi)關(guān),你要用什么寄存器就先對(duì)應(yīng)的打開(kāi)開(kāi)關(guān),即:使能對(duì)應(yīng)的時(shí)鐘。
實(shí)際上,在這里面還涉及到一個(gè)時(shí)鐘門控技術(shù),而這又涉及到同步電路,我們都知道(默認(rèn)你們都知道)在同步電路中總是有一個(gè)時(shí)鐘控制。這里我就不贅述了,如果你和我一樣是一個(gè)強(qiáng)迫癥患者,請(qǐng)你回去翻翻一本叫《數(shù)字電子技術(shù)基礎(chǔ)》的書(shū),你一定可以找到答案的,相信我吧。
到這里你就差不多能夠理解為什么STM32編程需要不斷地使能時(shí)鐘了,因?yàn)槟J(rèn)情況下這些時(shí)鐘都是disable的。你要使用它,當(dāng)然需要enable了。如果再不明白,我就想罵了:寄存器是由D觸發(fā)器組成的,只有送來(lái)了時(shí)鐘,觸發(fā)器才能被改寫值,這樣寄存器才能工作。只不過(guò),在51單片機(jī)一個(gè)時(shí)鐘系統(tǒng)把一切都包了,在STM32中,我們很明確地做好了分工,讓大家各司其職,其實(shí)這樣還有一個(gè)好處就是,不是每個(gè)外設(shè)都需要系統(tǒng)時(shí)鐘那么高的頻率,就好像是:哪個(gè)公司會(huì)讓CEO去做底層代碼工作一樣。