STM32《串列埠USART收發》第乙個字元丟失問題

2021-09-12 18:08:03 字數 782 閱讀 4005

問題及現象

stm32 串列埠傳送資料第一位元組丟失

使用stm32f10x除錯串列埠通訊時,發現乙個出錯的現象,硬體復位重啟之後,傳送測試資料0x01 0x02 0x03 0x04…接收端收到的資料為:0x02 0x03 0x04,第乙個資料丟失。

當包含有資料的一幀傳送完成後,由硬體將該位置位。如果usart_cr1中的tcie為1,則產生中斷。由軟體序列清除該位(先讀usart_sr,然後寫入usart_dr)。tc位也可以通過寫入0來清除,只有在多快取通訊中才推薦這種清除程式。

0:傳送還未完成;

1:傳送完成。

注意到這一句:由軟體序列清除該位(先讀usart_sr,然後寫入usart_dr)。 也就是說,要先read usart_sr,然後write usart_dr,才能完成tc狀態位的清除。而硬體復位後,串列埠傳送的首個資料之前沒有read sr的操作,是直接write dr,也就是說,tc沒有被清除掉。

硬體復位後,串列埠傳送首個資料之前,先讀取一下usart_sr,則能夠保證首個資料傳送時,不出現覆蓋的情況。當然,也有別的方法,比如先清除tc狀態位,usart_clearflag(usart1, usart_flag_tc);或usart1->sr&=~(1<<7);

總結:硬體復位後,串列埠傳送首個資料之前,先讀取一下usart_sr,則能夠保證首個資料傳送時,不出現覆蓋的情況。當然,也有別的方法,比如先清除tc狀態位,或是,在writeusart_dr之後,加入乙個小延時,讓資料傳送完畢,應該也能間接排除這個錯誤。(建議在連續傳送完資料後加一句 usart1->sr &= 0x1f; //清除tc中斷)

STM32串列埠收發

串列埠初始化 使能串列埠 使能中斷 傳送資料 接收資料 獲取狀態標誌位 清除狀態標誌位 獲取中斷狀態標誌位 清除中斷狀態標誌位 define usart rec len 200 定義最大接收位元組數 200 define en usart1 rx 1 使能 1 禁止 0 串列埠1接收 extern ...

STM32 串列埠USART 通訊

通過stm32向串列埠傳送資料顯示在串列埠終端上 我用的是串列埠除錯工具 並且在除錯工具上傳送認識字元,然後在終端上顯示出來,就是這樣了,分別驗證了usart1和usart2,雖說只是乙個1和2,但是初始化時鐘的時候,並不一樣的,我們先來看卡下圖中 各個模組,io口時鐘分布 在系統初始化各個模組前,...

STM32 二 串列埠收發

使用485介面接收資料,然後返回接收的資料。usart configuration while 1 2.1.usart configuration 開起時鐘 io口時鐘 串列埠開時鐘 開啟復用時鐘 復用設定 中斷初始化 io輸入輸出設定 485共有3個引腳,收發控制引腳 預設為收 收引腳,發引腳。串...