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