使用stm32f10x除錯串列埠通訊時,發現乙個出錯的現象,硬體復位重啟之後,傳送測試資料0x01 0x02 0x03 0x04..接收端收到的資料為:0x02 0x03 0x04,第乙個資料丟失。
查閱stm32f10x參考手冊,找到這樣一句話:
tc:傳送完成
當包含有資料的一幀傳送完成後,由硬體將該位置位。如果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);
STM32 串列埠DMA(一)
今天調usart,資料在晶元內部用dma傳到串列埠快取,發現dma真的很好,很快,而且不消耗系統資源。只是在傳輸完的時候中斷的標誌置位。下面解釋一下程式。void dma configuration void 再弄幾個重要的語句。這裡是開始dma傳輸前的一些準備工作,將usart1模組設定成dma方...
stm32串列埠傳送資料復位第乙個資料丟失 已解決
stm32串列埠傳送必須先檢測狀態,否則第乙個位元組無法發出,傳送完畢,必須檢測傳送狀態是否完成,否則,傳送不成功,使用stm32f10x除錯串列埠通訊時,發現乙個出錯的現象,硬體復位重啟之後,傳送測試資料0x01 0x02 0x03 0x04.接收端收到的資料為 0x02 0x03 0x04,第乙...
STM32F407 串列埠資料傳送
1.常用的串列埠相關暫存器 2.串列埠操作相關庫函式 省略入口引數 void usart init 串列埠初始化 波特率,資料字長,奇偶校驗,硬體流控以及收發使能 void usart cmd 使能串列埠 void usart itconfig 使能相關中斷 void usart senddata ...