新聞中心

        EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > stm32 串口發(fā)送數(shù)據(jù)第一字節(jié)丟失

        stm32 串口發(fā)送數(shù)據(jù)第一字節(jié)丟失

        作者: 時(shí)間:2016-11-09 來源:網(wǎng)絡(luò) 收藏
        使用stm32f10x調(diào)試串口通訊時(shí),發(fā)現(xiàn)一個(gè)出錯(cuò)的現(xiàn)象,硬件復(fù)位重啟之后,發(fā)送測試數(shù)據(jù)0x01 0x02 0x03 0x04..接收端收到的數(shù)據(jù)為:0x02 0x03 0x04,第一個(gè)數(shù)據(jù)丟失。
        查閱stm32f10x參考手冊,找到這樣一句話:
        TC:發(fā)送完成
        當(dāng)包含有數(shù)據(jù)的一幀發(fā)送完成后,由硬件將該位置位。如果USART_CR1中的TCIE為1,則產(chǎn)生中斷。由軟件序列清除該位(先讀USART_SR,然后寫入U(xiǎn)SART_DR)。TC位也可以通過寫入0來清除,只有在多緩存通訊中才推薦這種清除程序。
        0:發(fā)送還未完成;
        1:發(fā)送完成。
        注意到這一句:由軟件序列清除該位(先讀USART_SR,然后寫入U(xiǎn)SART_DR)。 也就是說,要先read USART_SR,然后write USART_DR,才能完成TC狀態(tài)位的清除。而硬件復(fù)位后,串口發(fā)送的首個(gè)數(shù)據(jù)之前沒有read SR的操作,是直接write DR,也就是說,TC沒有被清除掉。


        硬件復(fù)位后,串口發(fā)送首個(gè)數(shù)據(jù)之前,先讀取一下USART_SR,則能夠保證首個(gè)數(shù)據(jù)發(fā)送時(shí),不出現(xiàn)覆蓋的情況。當(dāng)然,也有別的方法,比如先清除TC狀態(tài)位,USART_ClearFlag(USART1, USART_FLAG_TC);或USART1->SR&=~(1<<7);


        評論


        技術(shù)專區(qū)

        關(guān)閉
        主站蜘蛛池模板: 富锦市| 北安市| 阿拉善右旗| 乌什县| 双桥区| 苏尼特右旗| 芜湖县| 腾冲县| 鸡泽县| 都昌县| 信宜市| 胶南市| 崇义县| 沂源县| 和林格尔县| 红河县| 合川市| 成武县| 龙岩市| 虎林市| 阿拉善右旗| 铁岭市| 汉源县| 肃宁县| 鹤峰县| 河间市| 鄄城县| 呼图壁县| 安丘市| 博乐市| 宁城县| 滕州市| 梧州市| 安新县| 龙海市| 陆河县| 万盛区| 南岸区| 彭山县| 崇信县| 屯门区|