嗞~~~~~
一股溫和的電流流進(jìn)了我的身體,我從沉睡中醒來,感受著心臟穩(wěn)定的跳動,我的大腦高速的運(yùn)轉(zhuǎn)著,我感覺到了他的運(yùn)轉(zhuǎn)速度,很快,非常快,一秒幾十兆的運(yùn)算速度,我感覺我無所不能。同時,我擁有了幾十上百個手腳。我,是單片機(jī)?
漸漸地,我也發(fā)現(xiàn)了我的缺點(diǎn),我好像腦容量比較小,感覺不能記得很多東西,我雖然思維活躍,但是好像能量很小,我的能量全來自于喚醒我的那股溫和的電流,他雖然穩(wěn)定,但是他所能夠提供的能量很少,我可以靈活地抬放我的手腳,但是它們好像并不能拎起多大多大物體,我好像一無是處。
單片機(jī)又稱微控制器,是把中央處理器(大腦)、存儲器(腦緣系統(tǒng))、時鐘(心臟)、各種輸入輸出接口(手腳口)等都集成在一塊集成電路芯片上的微型計(jì)算機(jī)。一般單片機(jī)的內(nèi)存較小,輸入電壓較低,通常為3.3v-5v。運(yùn)行速度(主頻)在幾十兆赫茲到幾百兆赫茲不等。
▲STM32F103xx增強(qiáng)型模塊框圖隨著環(huán)境的變化,我突然覺得胸口發(fā)蒙,溫度太高或者太低都讓我的心跳異常,經(jīng)常犯錯。但是我卻無可奈何,此時我聽到了一個聲音:你名為單片機(jī),乃是科技的結(jié)晶,雖然你現(xiàn)在像個小丑,但是你可以去闖副本,解鎖新的皮膚,新的地圖。于是我便沉沉睡去。當(dāng)我再起醒來,我感覺背上劇痛,什么!有人在給我紋身,難道是“精忠報(bào)國”?難道我將馳騁沙場,立不世之功!原來我的副本是為了保家衛(wèi)國……后來我才知道,背上紋的是STM32F103RB,這有個啥用啊,哎~我沒想到,這個皮膚有種魔力,讓我解鎖了新的地圖——開發(fā)板。在這個地圖上,我擁有了另一顆心臟,一個我似乎可以使用外部的心臟,那家伙挺厲害,很多我適應(yīng)不了的環(huán)境他都可以,不容易產(chǎn)生心跳紊亂,我只需要在我醒來時啟動它便好,可好用了。現(xiàn)在32位單片機(jī)內(nèi)部都會集成一個晶振,即使不外掛晶振也可以正常工作,但是內(nèi)部晶振收環(huán)境影響較為嚴(yán)重,在一些極端場合可能會造成較大的誤差,所有一般應(yīng)用都會外掛一個高精度晶振,可以使單片機(jī)更好的工作。▲使用8MHz晶體的典型應(yīng)用
探索新地圖:我雖然擁有了強(qiáng)力的心臟,可是我啥也不會呀,我怕黑,想開燈,但是我卻無從下手,我看得到地圖上有個燈,我不知如何打開,直到我遇到了一個神奇的動物——程序猿。他有著人類一樣的外邊,但是怎么看怎么像牛,挺奇怪的。那天,這個程序猿給了我一個開燈的說明書,這個說明書好復(fù)雜,讓我做了好多事,最后讓我用其中一個手拉一下開關(guān)就可以開燈,不明白為啥要這么麻煩。但是他有時候也給我很簡單的說明書,里面只寫了:伸手。然后燈就開了,好神奇。那之前為啥要給我那么復(fù)雜的說明書呢?單片機(jī)本身不含任何功能,需要用戶編寫代碼,編譯成單片機(jī)熟悉的語言燒錄進(jìn)單片機(jī)才可實(shí)現(xiàn)功能。例如我們點(diǎn)燈,就讓控制燈的引腳輸出相應(yīng)電平即可。在ST的開發(fā)環(huán)境中,ST提供了多種開發(fā)方式:直接操作寄存器、標(biāo)準(zhǔn)庫、HAL庫、LL庫。其中,寄存器的方式是最直接的方式,單片機(jī)的響應(yīng)最快,代碼執(zhí)行效率最高,同時難度較高;LL庫及其接近寄存器,效率次之;標(biāo)準(zhǔn)庫對寄存器進(jìn)行了封裝,用戶可以直接使用庫函數(shù)實(shí)現(xiàn)功能,不能直面寄存器,是曾經(jīng)最常用的方式;HAL庫是開發(fā)最簡單的方式,HAL庫將寄存器和開發(fā)者隔離,開發(fā)難度特別小,但是也帶來一個問題,就是執(zhí)行效率相較于前幾個更低。當(dāng)我會點(diǎn)燈之后,我發(fā)現(xiàn)自己的思維邏輯好像有問題,我總是一根筋,不會回頭,做事只會按照一條線去做。好在程序猿給了我一份新的說明書,書中說道:苦海無涯,回頭是岸。反正就是讓我主線任務(wù)做完了再重新來過,還讓我注意自己的手腳,他碰我不同的腳我得暫停主線去做支線任務(wù)。做完支線才能回來繼續(xù)做主線任務(wù)。說明書上還交代任務(wù)的緊急程度,碰我的1腳我得去做1號支線,如果沒做完就碰我的2腳,那我得暫停1號支線去做2號支線的任務(wù),等2號支線任務(wù)做完再回來做1號任務(wù),直到兩個任務(wù)都做完才能回去做主線任務(wù)單片機(jī)就是一根筋,只會按照邏輯一直往下執(zhí)行,當(dāng)有緊急事件需要處理可借助單片機(jī)的中斷系統(tǒng)來處理,單片機(jī)會暫停當(dāng)前執(zhí)行的任務(wù),轉(zhuǎn)向中斷安排的任務(wù),并在完成中斷后返回之前跳轉(zhuǎn)到節(jié)點(diǎn)。▲中斷嵌套及響應(yīng)示意圖
如上圖所示,當(dāng)中斷發(fā)生,單片機(jī)會將中斷發(fā)生時刻的狀態(tài)和參數(shù)保存進(jìn)堆棧,通過中斷向量的指引去完成中斷的服務(wù)任務(wù),執(zhí)行完中斷服務(wù)任務(wù)后會返回之前的被打斷的指令,然后繼續(xù)向下執(zhí)行。當(dāng)正在執(zhí)行的中斷函數(shù)遇到更高優(yōu)先級的中斷請求到來,當(dāng)前的中斷任務(wù)保存,跳轉(zhuǎn)執(zhí)行更高優(yōu)先級的任務(wù),當(dāng)高優(yōu)先級的任務(wù)執(zhí)行完成再返回之前的次優(yōu)先級任務(wù)繼續(xù)執(zhí)行,直至中斷任務(wù)全部執(zhí)行完成后返回主程序。那天,我發(fā)現(xiàn)了另外一塊單片機(jī),好不容易見到同類,好想和它聊天。于是,我向他呼喊(UART),但是只能發(fā)出1和0,它無動于衷。隨后,程序猿給我一本詞典(協(xié)議),我按照詞典的介紹開始發(fā)音,但是對方的語言能力可能不是很好,我說的快了它反應(yīng)不過來,說的慢了它會漏掉我的話(波特率匹配)。在嘗試許久后終于見它有反應(yīng)了,我也收到了它的回復(fù),它也只會說什么1啊,什么0啊之類的,我只能考詞典進(jìn)行翻譯(轉(zhuǎn)碼),但是也只能它說一句我回一句,就像對講機(jī)一樣(異步串行通信),好在雖然比較麻煩,總算能聊上了。隨著時間的推移,我們之間的距離越來越遠(yuǎn),說話都是斷斷續(xù)續(xù)的,即使我叫破了喉嚨也不頂用(遠(yuǎn)距離通信),于是我倆想辦法找到了擴(kuò)音喇叭(RS485芯片),這玩意自帶能量供給,不需要我們提供(單獨(dú)供電),我只需要正常說話,他就會給我放大,即使隔得很遠(yuǎn)我們也能說話。但是不知怎么的,我們的距離越來越遠(yuǎn),遠(yuǎn)到靠擴(kuò)音喇叭都無法起作用,但是難不倒我們,我們又找來更先進(jìn)的設(shè)備——無線通信模組,通過這類設(shè)備,我們可以實(shí)現(xiàn)天南地北通話無誤。在嵌入式開發(fā)中,UART串口通信協(xié)議是我們常用的通信協(xié)議之一,全稱叫作通用異步收發(fā)傳輸器(Universal Asynchronous Receiver / Transmitter),是異步串口通信協(xié)議的一種,其工作原理是將傳輸數(shù)據(jù)的每個字符一位接一位地傳輸,它能將要傳輸?shù)?a href="http://www.wenjunhu.com/soft/special/" target="_blank">資料在串行通信與并行通信之間加以轉(zhuǎn)換,能夠靈活地與外部設(shè)備進(jìn)行全雙工數(shù)據(jù)交換。UART的通信需要遵守通信協(xié)議,同時匹配波特率,才能進(jìn)行正常的通信??梢詫⑼ㄐ胚^程按下圖想象:▲正常通信UART發(fā)送數(shù)據(jù)就類似打開門放數(shù)據(jù)出去,波特率就是控制打開門的速度,當(dāng)發(fā)送方按照一定的速率放出數(shù)據(jù),接收方也按相同的速度開關(guān)自己的閘門,那數(shù)據(jù)就剛好可以一個個進(jìn)來。如果接收方和發(fā)送方的波特率不一樣,就可能出現(xiàn)數(shù)據(jù)當(dāng)接收方門口的時候門關(guān)了,數(shù)據(jù)進(jìn)不去,導(dǎo)致接收異常。▲通信異常當(dāng)通信雙方距離較遠(yuǎn),通信就會受阻,此時可采用485通信,485的出現(xiàn),是為了解決232通信距離受限的問題。RS-485的數(shù)據(jù)最高傳輸速率為10Mbps。RS-485接口是采用平衡驅(qū)動器和差分接收器的組合,抗共模干擾能力增強(qiáng),即抗噪聲干擾性好。
RS-485最大的通信距離約為1219m,最大傳輸速率為10Mbps,傳輸速率與傳輸距離成反比,在100Kb/S的傳輸速率下,才可以達(dá)到最大的通信距離,如果需傳輸更長的距離,需要加485中繼器。RS-485總線一般最大支持32個節(jié)點(diǎn),如果使用特制的485芯片,可以達(dá)到128個或者256個節(jié)點(diǎn),最大的可以支持到400個節(jié)點(diǎn)。485通信只需要+、-兩根線,或者也叫A、B兩根線。A、B兩根線的差分電平信號就是作為數(shù)據(jù)信號傳輸。由于發(fā)送與接收都是用這兩根線,也就是說每次只能用作發(fā)送或者只能用作接收。所以,485是半雙工通信。▲RS-485通信
但是這樣說話好累啊,我想發(fā)出聲音怎么辦呢?這時我發(fā)現(xiàn)自己有一個手上拿著一個蜂鳴器(無源他激型),只要我拼命地?fù)u動,他就會發(fā)出聲音,我搖動的頻率不同,發(fā)出的聲音就不同,這樣我就可以發(fā)出不同的聲音了,我甚至還可以給自己來首曲子(方波信號輸入諧振裝置轉(zhuǎn)換為聲音信號輸出)。就是比較累,我還得算著時間來搖動。音樂都有了,我還要燈光,可是我手上的燈只能發(fā)出一種顏色,要么讓他亮,要么要他滅,于是我找到了身上的定時器,我可以讓它控制我的手去開關(guān)燈(PWM輸出),在一定時間內(nèi)多讓燈多亮一會,再關(guān)掉,控制打開和關(guān)閉的時間燈光就會一會亮,一會暗,但是可能我動作得快點(diǎn)(頻率大于人眼捕捉頻率),不然會一閃一閃的,這好酷啊(動態(tài)更改PWM占空比)。漸漸地,我覺得我還是養(yǎng)一條狗比較好,因?yàn)樯洗挝易鲥e事了,但是我鉆牛角尖,不愿意放棄,一直死等(程序卡死),導(dǎo)致后面好多事都耽擱了,還導(dǎo)致自己差點(diǎn)出事。決定還是養(yǎng)個看門狗(就是看門狗),每隔一段時間就去喂狗,它不餓就不會叫,我要是鉆牛角尖了,就會忘了喂狗,這樣他就會叫,我聽到狗叫就會反應(yīng)過來的。
但是,有問題我也得解決不是,我可以把這件事記在身上的本子上(寫FLASH),這樣以后就能看看到底咋回事了。但是我的筆記本挺不好用的,每次都得把這一頁擦掉才能寫,而且最少得擦掉一頁。但是還是很必要的,因?yàn)槲颐看位杷螅ǖ綦姡┒紩G失一些數(shù)據(jù)(掉電會丟失RAM數(shù)據(jù)),為了防止我忘記也可以寫在上面。但是我的腦子可能真的有問題,每次再做筆記時總是會屏蔽其他的聲音,誰都不能打擾我。在由單片機(jī)構(gòu)成的微型計(jì)算機(jī)系統(tǒng)中,由于單片機(jī)的工作常常會受到來自外界電磁場的干擾,造成程序的跑飛,而陷入死循環(huán),程序的正常運(yùn)行被打斷,由單片機(jī)控制的系統(tǒng)無法繼續(xù)工作,會造成整個系統(tǒng)的陷入停滯狀態(tài),發(fā)生不可預(yù)料的后果,所以出于對單片機(jī)運(yùn)行狀態(tài)進(jìn)行實(shí)時監(jiān)測的考慮,便產(chǎn)生了一種專門用于監(jiān)測單片機(jī)程序運(yùn)行狀態(tài)的芯片,俗稱“看門狗”(watchdog)。
看門狗的作用是系統(tǒng)CPU正常工作時定時給看門狗喂狗,復(fù)位定時器,如果系統(tǒng)出問題,沒有給看門狗喂狗,看門狗就由于超時將CPU復(fù)位。一般工程都會使用兩個看門狗,一個是獨(dú)立看門狗,主要用于在代碼跑飛之后復(fù)位使用,一個是窗口看門狗,主要用于在復(fù)位前對于一些重要數(shù)據(jù)進(jìn)行保存。小數(shù)據(jù)量一般可以保存進(jìn)單片機(jī)自己的FLASH中,下次上電還會存在。注意:1、每一款單片機(jī)的FLASH的大小不盡相同,在操作FLASH之前一定要根據(jù)手冊確定手里的單片的FLASH的大小,超出FLASH容量的寫操作是不被允許的,也無法成功完成數(shù)據(jù)寫入。2、計(jì)算好程序的內(nèi)存,程序也是保存在FLASH中,如果沒有計(jì)算好程序的大小,將寫FLASH寫入程序占用的內(nèi)存中,會導(dǎo)致程序奔潰。3、寫數(shù)據(jù)之前必須先對頁進(jìn)行擦除,因?yàn)镕LASH不能寫1,只能寫0,所以寫之前要通過擦除操作將FLASH頁中的數(shù)據(jù)全部恢復(fù)為FF,才能進(jìn)行寫操作,如果該FLASH中存在需要的數(shù)據(jù),必須要先將數(shù)據(jù)讀出來存在緩存區(qū),再將頁擦除,再進(jìn)行寫數(shù)據(jù)。4、數(shù)據(jù)不超過一頁,可連續(xù)寫入。5、注意FLASH的操作單位,每次最少寫4個字節(jié),可通過手冊查詢頁的大小,因?yàn)橐话悴捎玫氖钦摰牟脸蛯懭耄豢呻S意擦寫。6、操作FLASH時會占用總線,會打斷你的中斷操作,且寫FLASH時間一般較長,所以在操作FLASH時要保證單片機(jī)預(yù)留出足夠的時間。7、詳情參見帖子:國民技術(shù)G435大容量FLASH讓你儲存離線數(shù)據(jù)不必節(jié)衣縮食(地址:https://bbs.21ic.com/icview-3208110-1-1.html)我覺得我還有很多很多的很強(qiáng)很強(qiáng)的能力等我發(fā)現(xiàn),但是我突然覺得體內(nèi)的能量越來越少,漸漸感覺頭暈眼花,我可能需要休息一會,不知道小憩一下會不會恢復(fù)(睡眠模式),不行的話,可能我要好好睡個覺了(深度睡眠),如果能量再少下去我可能就睡昏頭了(待機(jī)模式),這樣再醒來可能之前的事我就全忘記了(停機(jī)模式下會丟失RAM數(shù)據(jù))。
呼呼~~1、睡眠模式:在睡眠模式中,僅關(guān)閉了內(nèi)核時鐘,內(nèi)核停止運(yùn)行,但其片上外設(shè),CPU核心的外設(shè)全都還照常運(yùn)行,在軟件上表現(xiàn)為不再執(zhí)行新的代碼。這個狀態(tài)會保留睡眠前的內(nèi)核寄存器、內(nèi)存的數(shù)據(jù)。喚醒后 ,若由中斷喚醒,先進(jìn)入中斷,退出中斷服務(wù)程序后,接著執(zhí)行 WFI指令后的程序;若由事件喚醒,直接接著執(zhí)行 WFE 后的程序。喚醒延遲:無延遲。(WFI:Wait For Interrupt,WFE:Wait For Event)。2、深度睡眠模式(停止模式):在停止模式中,進(jìn)一步關(guān)閉了其它所有的時鐘,于是所有的外設(shè)都停止了工作,但由于其 1.2V 區(qū)域的部分電源沒有關(guān)閉,還保留了內(nèi)核的寄存器、內(nèi)存的信息,所以從停止模式喚醒,并重新開啟時鐘后,還可以從上次停止處繼續(xù)執(zhí)行代碼。喚醒后,若由中斷喚醒,先進(jìn)入中斷,退出中斷服務(wù)程序后,接著執(zhí)行 WFI指令后的程序;若由事件喚醒,直接接著執(zhí)行 WFE 后的程序。停止模式喚醒后,STM32會使用 HSI(f1的HSI為8M,f4為12M)作為系統(tǒng)時鐘。所以,有必要在喚醒以后,在程序上重新配置系統(tǒng)時鐘,將時鐘切換回HSE。
喚醒延遲 :基礎(chǔ)延遲為 HSI振蕩器的啟動時間,若調(diào)壓器工作在低功耗模式,還需要加上調(diào)壓器從低功耗切換至正常模式下的時間,若 FLASH 工作在掉電模式,還需要加上 FLASH 從掉電模式喚醒的時間。3、待機(jī)模式:它除了關(guān)閉所有的時鐘,還把 1.2V區(qū)域的電源也完全關(guān)閉了,也就是說,從待機(jī)模式喚醒后,由于沒有之前代碼的運(yùn)行記錄,只能對芯片復(fù)位,重新檢測 boot條件,從頭開始執(zhí)行程序。注:以上藍(lán)色內(nèi)容僅是作者個人理解,黑體部分純屬瞎編亂造,如有錯誤,歡迎評論區(qū)留言指正!作者:吶咯密密來源:21ic論壇-END-
-
單片機(jī)
+關(guān)注
關(guān)注
6042文章
44617瀏覽量
637476
發(fā)布評論請先 登錄
相關(guān)推薦
評論