STM32串口接收不定長(zhǎng)數(shù)據(jù)原理與源程序
出處:21ic 發(fā)布于:2018-07-09 11:52:30
今天說(shuō)一下STM32單片機(jī)的接收不定長(zhǎng)度字節(jié)數(shù)據(jù)的方法。由于STM32單片機(jī)帶IDLE中斷,所以利用這個(gè)中斷,可以接收不定長(zhǎng)字節(jié)的數(shù)據(jù),由于STM32屬于ARM單片機(jī),所以這篇文章的方法也適合其他的ARM單片機(jī)。
IDLE中斷什么時(shí)候發(fā)生?
IDLE就是串口收到一幀數(shù)據(jù)后,發(fā)生的中斷。什么是一幀數(shù)據(jù)呢?比如說(shuō)給單片機(jī)發(fā)來(lái)1個(gè)字節(jié),或者發(fā)來(lái)8個(gè)字節(jié),這些發(fā)來(lái)的數(shù)據(jù),就稱(chēng)為一幀數(shù)據(jù),也可以叫做一包數(shù)據(jù)。
如何判斷一幀數(shù)據(jù)結(jié)束,就是我們今天討論的問(wèn)題。因?yàn)楹芏囗?xiàng)目中都要用到這個(gè),因?yàn)橹挥薪邮盏揭粠瑪?shù)據(jù)以后,你才可以判斷這次收了幾個(gè)字節(jié)和每個(gè)字節(jié)的內(nèi)容是否符合協(xié)議要求。
看了前面IDLE中斷的定義,你就會(huì)明白了,一幀數(shù)據(jù)結(jié)束后,就會(huì)產(chǎn)生IDLE中斷。這個(gè)中斷真是太TMD有用了。省去了好多判斷的麻煩。
如何配置好IDLE中斷?
下面我們就配置好串口IDLE中斷吧。
這是串口CR1寄存器,其中,對(duì)bit4寫(xiě)1開(kāi)啟IDLE中斷,對(duì)bit5寫(xiě)1開(kāi)啟接收數(shù)據(jù)中斷。(注意:不同系列的STM32,對(duì)應(yīng)的寄存器位可能不同)
(RXNE中斷和IDLE中斷的區(qū)別?
當(dāng)接收到1個(gè)字節(jié),就會(huì)產(chǎn)生RXNE中斷,當(dāng)接收到一幀數(shù)據(jù),就會(huì)產(chǎn)生IDLE中斷。比如給單片機(jī)性發(fā)送了8個(gè)字節(jié),就會(huì)產(chǎn)生8次RXNE中斷,1次IDLE中斷。)
這是狀態(tài)寄存器,當(dāng)串口接收到數(shù)據(jù)時(shí),bit5就會(huì)自動(dòng)變成1,當(dāng)接收完一幀數(shù)據(jù)后,bit4就會(huì)變成1.
需要注意的是,在中斷函數(shù)里面,需要把對(duì)應(yīng)的位清0,否則會(huì)影響下數(shù)據(jù)的接收。比如RXNE接收數(shù)據(jù)中斷,只要把接收到的一個(gè)字節(jié)讀出來(lái),就會(huì)清除這個(gè)中斷。IDLE中斷,如何是F0系列的單片機(jī),需要用ICR寄存器來(lái)清除,如果是F1系列的單片機(jī),清除方法是“先讀SR寄存器,再讀DR寄存器”。(我怎么知道?手冊(cè)上寫(xiě)的)
下面以STM32F103為例給出源程序。
我們先來(lái)看程序中的主要部分。
串口初始化函數(shù)片段
如果你原來(lái)的串口初始化函數(shù)具有打開(kāi)串口接收中斷的話(huà),實(shí)際上就是在初始化函數(shù)中多了一條打開(kāi)空閑中斷的語(yǔ)句。
串口中斷函數(shù)
串口中斷函數(shù)里面,重要的兩條語(yǔ)句,就是上圖中圈出來(lái)的兩條語(yǔ)句。條語(yǔ)句用來(lái)判斷是否接收到1個(gè)字節(jié),第二條語(yǔ)句用來(lái)判斷是否接收到1幀數(shù)據(jù)。(是不是感覺(jué)超級(jí)方便?媽媽再也不用擔(dān)心我如何判斷是否接收完1幀數(shù)據(jù)了。)
主函數(shù)
我寫(xiě)的這個(gè)主函數(shù),是用來(lái)驗(yàn)證接收的正確性的。RxCounter表示的是這一幀數(shù)據(jù)有幾個(gè)字節(jié),接收完一幀數(shù)據(jù),會(huì)在中斷函數(shù)里面把ReceiveState置1,然后,通過(guò)串口把接收到的數(shù)據(jù)發(fā)送回串口。這樣,既驗(yàn)證了接收了多少字節(jié)的正確性,又驗(yàn)證了接收到的數(shù)據(jù)是否正確。
上圖是結(jié)果驗(yàn)證。
版權(quán)與免責(zé)聲明
凡本網(wǎng)注明“出處:維庫(kù)電子市場(chǎng)網(wǎng)”的所有作品,版權(quán)均屬于維庫(kù)電子市場(chǎng)網(wǎng),轉(zhuǎn)載請(qǐng)必須注明維庫(kù)電子市場(chǎng)網(wǎng),http://hbjingang.com,違反者本網(wǎng)將追究相關(guān)法律責(zé)任。
本網(wǎng)轉(zhuǎn)載并注明自其它出處的作品,目的在于傳遞更多信息,并不代表本網(wǎng)贊同其觀點(diǎn)或證實(shí)其內(nèi)容的真實(shí)性,不承擔(dān)此類(lèi)作品侵權(quán)行為的直接責(zé)任及連帶責(zé)任。其他媒體、網(wǎng)站或個(gè)人從本網(wǎng)轉(zhuǎn)載時(shí),必須保留本網(wǎng)注明的作品出處,并自負(fù)版權(quán)等法律責(zé)任。
如涉及作品內(nèi)容、版權(quán)等問(wèn)題,請(qǐng)?jiān)谧髌钒l(fā)表之日起一周內(nèi)與本網(wǎng)聯(lián)系,否則視為放棄相關(guān)權(quán)利。
- USB-C接口全解析:協(xié)議兼容、快充原理與常見(jiàn)問(wèn)題排查2025/12/16 9:50:42
- 簡(jiǎn)述計(jì)算機(jī)總線(xiàn)的分類(lèi)2025/9/4 17:12:23
- 深度剖析三進(jìn)線(xiàn)兩母聯(lián)供電系統(tǒng)設(shè)計(jì)方案2025/9/3 10:37:39
- 匯流排是什么匯流排好還是線(xiàn)接好2025/8/28 17:13:00
- 安森美 USB - C 電池充電器解決方案2025/8/28 15:45:10
- 編碼器的工作原理及作用1
- 超強(qiáng)整理!PCB設(shè)計(jì)之電流與線(xiàn)寬的關(guān)系2
- 三星(SAMSUNG)貼片電容規(guī)格對(duì)照表3
- 電腦藍(lán)屏代碼大全4
- 國(guó)標(biāo)委發(fā)布《電動(dòng)汽車(chē)安全要求第3部分:人員觸電防護(hù)》第1號(hào)修改單5
- 通俗易懂談上拉電阻與下拉電阻6
- 繼電器的工作原理以及驅(qū)動(dòng)電路7
- 電容單位8
- 跟我學(xué)51單片機(jī)(三):?jiǎn)纹瑱C(jī)串口通信實(shí)例9
- 一種三極管開(kāi)關(guān)電路設(shè)計(jì)10
- 高速PCB阻抗控制核心實(shí)操規(guī)范
- 高速數(shù)字系統(tǒng)(如DDR、SerDes)中的信號(hào)完整性濾波
- MOSFET在UPS電源中的應(yīng)用解析
- 電源管理IC在物聯(lián)網(wǎng)設(shè)備中的應(yīng)用
- SMT連接器焊接缺陷分析
- MOSFET在汽車(chē)電子中的應(yīng)用要求
- 通信設(shè)備電源管理IC應(yīng)用解析
- 通信設(shè)備連接器選型與設(shè)計(jì)
- PCB電磁兼容性(EMC)設(shè)計(jì)核心實(shí)操規(guī)范
- 物聯(lián)網(wǎng)節(jié)點(diǎn)低功耗設(shè)計(jì):信號(hào)鏈中的濾波與功耗管理









