其實單片機中的串口和中斷問題就像設定使碗接到10滴水就溢出
///插播一條:我自己在今年年初錄製了一套還比較系統的入門單片機教程,想要的同學找我拿就行了免費的,私信我就可以哦~點我頭像黑色字體加我地球呺也能領取哦。最近比較閒,帶做畢設,帶學生參加省級或以上比賽///在學習單片機的過程中,我們經常會發現中斷、串口是學習的難點,對於初學者來說,這幾部分的內容是很難理解的。但是我個人覺得這幾部分內容是重點,如果在一個學期的課堂學習或者自學中沒有理解這幾部分內容,那就等於還沒有掌握51單片機,那更談不上單片機的開發了,我們都知道在成品的單片機項目中,有很多是以這幾部分為理論基礎的,萬年曆是以定時器為主的,報警器是以中斷為主的,聯機通訊是以串口為主的。
在這幾部分內容中,計數器/定時器對於初學者說很容易搞混淆,下面我將對這方面的內容結合自己的學習經驗來講一下。
記數器和定時器是相同的,他們都是對單片機中產生的脈衝進行計數,只不過計數器是單片機外部觸發的脈衝,定時器是單片機內部在晶振的觸發下產生的脈衝。當他們的脈衝間隔相同的時候,計數器和定時器就是一個概念。
在定時器和計數器中都有一個溢出的概念,那什麼是溢出了。我們可以從一個生活小常識得到答案,當一個碗放在水龍頭下接水的時候,過了一會兒,碗的水滿了,就發生溢出。同樣的道理,假設水龍頭的水是一滴滴的往碗里滴,那麼總有一滴水是導致碗中的水溢出的。在碗中溢出的水就浪費了,但是在單片機的中溢出將導致一次中斷。
在定時器計數器中,我們有個概念叫容量,就是最大計數量。
把水滴比喻成脈衝,那麼導致碗中水溢出的最後一滴水就是定時計數器溢出的最後一個脈衝。
在各種單片機書本中,在介紹定時計數器時都講到一個計數初值,那什麼是計數初值呢?在這裡我們還是假設水滴碗。假設第一百滴水能夠使碗中的水溢出,我們就知道這個碗的容量是100。
舉例:我如何才能使碗接到10滴水就溢出呢?我可以想像,如果拿一個空碗去接水,那麼還是得要100滴水才能溢出,但是如果我們拿一個已經裝有水的碗去接,那就不用100滴了。
類似這種引起硬體中斷衝突的問題,通常是代碼不良問題。中斷處理占用時間太久,導致其他中斷異常。比如,我見過的糟糕的代碼,是在中斷里用CPU延時的。
硬體中斷要求快進快出,一般不要在中斷中處理實際業務。
比方說,串口接收中斷中,只處理將數據加入緩存,然後置標誌位或發信號量方式通知主程序或任務進行數據解析。定時中斷也是如此。除非進行I/O操作,都應採用通知方式處理業務。
少數情況下,業務時序要求特別高的,那也應該採用在硬中斷中開啟軟中斷方式,來處理業務。這樣優先級會低於所有的硬中斷,不會影響其他中斷觸發,又保證業務實時處理。
Stm32f407已經非常強悍了,不用懷疑處理器會有問題。我曾經的一個407應用,幾乎開啟了所有的外設,乙太網,USB,串口,SPI,I2C,Camera,外掛液晶屏,還跑一個很耗處理器的算法,一點沒問題。
1,波特率調低
2,定時器調長
3,中斷裡面少干一點活,需要乾的活弄成隊列緩衝好到主函數中去處理。
要堅信一點,無論優先級高低,所有代碼都有被調用的機會。串口中斷,定時器中斷,CPU代碼,都是被同時調度。
如果偏監控,最好不要用定時器。我用STC的8位機也遇到過類似問題,定時器運轉的太快,導致外部中斷響應的非常不流暢。這個應該是業務邏輯和程度架構問題,應該從程序框架從新設計……