




全文預覽已結束
下載本文檔
版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
STM32 串口 首字節(jié)和尾字節(jié)少 STM32 串口 發(fā)送 必須 先檢測 狀態(tài),否則 第一個 字節(jié) 無法 發(fā)出,發(fā)送完畢,必須檢測發(fā)送狀態(tài)是否完成,否則,發(fā)送不成功, 使用stm32f10x調試串口通訊時,發(fā)現(xiàn)一個出錯的現(xiàn)象,硬件復位重啟之后,發(fā)送測試數(shù)據(jù)0x01 0x02 0x03 0x04.接收端收到的數(shù)據(jù)為:0x02 0x03 0x04,第一個數(shù)據(jù)丟失。換成發(fā)送別的數(shù)值的數(shù)據(jù),如0x06 0x0ff,則接收到0x0ff,0x06丟失。錯誤依舊。 故障排除過程: 1、剛開始懷疑是接收端的錯誤,我是使用電腦串口,運行串口輔助調試工具接收,換成其他軟件后,發(fā)現(xiàn)故障依舊,而且電腦軟件一直是開啟狀態(tài),不像和電腦軟件有關。 2、使用單步調試,單步運行各個發(fā)送指令,都正常。能收到0x01 0x02 0x03 0x04的數(shù)據(jù)。間接的排除了不是電腦軟件的問題,而是其他的錯誤。 3、單步調試運行雖然正常了,但連續(xù)運行時,錯誤依舊。現(xiàn)在有點摸不到頭緒了,單步運行正常,看起來編程沒有出錯,那故障在哪里呢?測試程序如下 USART_SendData(USART2, 0x01); /A while(USART_GetFlagStatus(USART2, USART_FLAG_TC) = RESET); /B USART_SendData(USART2, 0x02); /C while(USART_GetFlagStatus(USART2, USART_FLAG_TC) = RESET); USART_SendData(USART2, 0x03); while(USART_GetFlagStatus(USART2, USART_FLAG_TC) = RESET); USART_SendData(USART2, 0x04); while(USART_GetFlagStatus(USART2, USART_FLAG_TC) = RESET); 4、猜測,也許是因為某個特殊原因,使第二個數(shù)據(jù)覆蓋了首個數(shù)據(jù),使得首個數(shù)據(jù)丟失。假設:在執(zhí)行B指令時,USART的 TC 狀態(tài)位=SET,那么就會緊接著執(zhí)行C指令,也就有可能發(fā)生數(shù)據(jù)的覆蓋。于是,在A指令前,加入如下指令: USART_ClearFlag(USART2,USART_FLAG_TC); 5、加入上一條指令后,運行,錯誤消失了。說明上一個假設,應該是成立的。 6、查閱stm32f10x參考手冊,找到這樣一句話: TC:發(fā)送完成當包含有數(shù)據(jù)的一幀發(fā)送完成后,由硬件將該位置位。如果USART_CR1中的TCIE為1,則產生中斷。由軟件序列清除該位(先讀USART_SR,然后寫入USART_DR)。TC位也可以通過寫入0來清除,只有在多緩存通訊中才推薦這種清除程序。0:發(fā)送還未完成;1:發(fā)送完成。 7、注意到這一句:由軟件序列清除該位(先讀USART_SR,然后寫入USART_DR)。 也就是說,要先read USART_SR,然后write USART_DR,才能完成TC狀態(tài)位的清除。而硬件復位后,串口發(fā)送的首個數(shù)據(jù)之前沒有read SR的操作,是直接write DR,也就是說,TC沒有被清除掉。 說明第4步的猜測是對的。 8、那么,應該把指令A前面加的USART_ClearFlag(USART2,USART_FLAG_TC); 改為USART_GetFlagStatus(USART2, USART_FLAG_TC);,應該也能消除錯誤。測試后證實,確實如此,在發(fā)送首個數(shù)據(jù)之前,先讀取一下USART_SR,那么就不會出現(xiàn)首個數(shù)據(jù)丟失的情況了。 9、總結:硬件復位后,串口發(fā)送首個數(shù)據(jù)之前,先讀取一下USART_SR,則能夠保證首個數(shù)據(jù)發(fā)送時,不出現(xiàn)覆蓋的情況。當然,也有別的方法,比如先清除TC狀態(tài)位,或是,在write USART_DR之后,加入一個小延時,讓數(shù)據(jù)發(fā)送完畢,應該也能間接排除這個錯誤。 STM32的USART發(fā)送數(shù)據(jù)時如何使用TXE和TC標志 在USART的發(fā)送端有2個寄存器,一個是程序可以看到的USART_DR寄存器(下圖中陰影部分的TDR),另一個是程序看不到的移位寄存器(下圖中陰影部分Transmit Shift Register)。 對應USART數(shù)據(jù)發(fā)送有兩個標志,一個是TXE=發(fā)送數(shù)據(jù)寄存器空,另一個是TC=發(fā)送結束;對照下圖,當TDR中的數(shù)據(jù)傳送到移位寄存器后,TXE被設置,此時移位寄存器開始向TX信號線按位傳輸數(shù)據(jù),但因為TDR已經變空,程序可以把下一個要發(fā)送的字節(jié)(操作USART_DR)寫入TDR中,而不必等到移位寄存器中所有位發(fā)送結束,所有位發(fā)送結束時(送出停止位后)硬件會設置TC標志。 另一方面,在剛剛初始化好USART還沒有發(fā)送任何數(shù)據(jù)時,也會有TXE標志,因為這時發(fā)送數(shù)據(jù)寄存器是空的。 TXEIE和TCIE的意義很簡單,TXEIE允許在TXE標志為1時產生中斷,而TCIE允許在TC標志為
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 注冊土木工程師考試成功備考經驗試題及答案
- 燃料電池汽車的挑戰(zhàn)與機遇試題及答案
- 大學物理的重要性2025年試題及答案
- 家具行業(yè)設計品牌價值塑造試題及答案
- 小麥倉儲與配套設施建設可行性分析
- 現(xiàn)代漢語導論試題及答案
- 英語市場定位能力測試試題及答案
- 無菌知識考試題及答案
- 水污染治理設施建設提標改造項目設計方案優(yōu)化
- 化工項目工程合同標準文本
- 敏捷跨文化團隊協(xié)作-全面剖析
- 2025年3月29日全國事業(yè)單位聯(lián)考A類《職測》真題及答案
- 八年級勞動教育測試題目及答案
- 球團焙燒工(高級)技能鑒定備考試題庫-上(單選、多選題)
- 知識寶庫中的寶藏知識產權的投資潛力和實踐路徑探索
- 基于深度學習的圖像修復算法研究
- 隱私與保密信息管理制度
- 《隧道防火保護板系統(tǒng)技術規(guī)程》
- 2025年安徽黃山旅游集團招聘筆試參考題庫含答案解析
- 中銅國際貿易集團有限公司招聘筆試沖刺題2025
- 商演服務合同
評論
0/150
提交評論