usart(通用同步非同步收發器)是乙個序列通訊裝置,可以靈活地與外部裝置進行全雙工資料交換。有別於 usart 還有乙個uart,它是在 usart 基礎上裁剪掉了同步通訊功能,只有非同步通訊。
● 全雙工的,非同步通訊
● 分數波特率發生器系統
─ 傳送和接收共用的可程式設計波特率,最高達4.5mbits/s
● 可程式設計資料字長度(8位或9位)
● 可配置的停止位-支援1或2個停止位
● 傳送方為同步傳輸提供時鐘
● 單獨的傳送器和接收器使能位
● 檢測標誌
─ 接收緩衝器滿
─ 傳送緩衝器空
─ 傳輸結束標誌
● 校驗控制
─ 傳送校驗位
─ 對接收資料進行校驗
● 四個錯誤檢測標誌
任何usart雙向通訊至少需要兩個腳:接收資料輸入(rx)和傳送資料輸出(tx)。
● 匯流排在傳送或接收前應處於空閒狀態
● 乙個起始位
● 乙個資料字(8或9位),最低有效位在前
● 0.5,1.5,2個的停止位,由此表明資料幀的結束
● 使用分數波特率發生器 —— 12位整數和4位小數的表示方法。
● 乙個狀態暫存器(usart_sr)
● 資料暫存器(usart_dr)
● 乙個波特率暫存器(usart_brr),12位的整數和4位小數
由於使用的庫函式版所以可直接呼叫函式。
1.要使能gpoa和usart1,
2.根據資料手冊,配置pa9(tx)必須是gpio_mode_af_pp(推挽復用輸出),配置pa10(rx)必須是gpio_mode_in_floating(規定浮空輸入),至於引腳速度沒有必須要求。
3.usart配置
我們使用的是非同步的通訊所以要提前配置好雙方的波特率usart_initstructure.usart_baudrate=9600; (在串列埠助手上也要調製9600否則可能出現亂碼)
usart_initstructure.usart_mode= usart_mode_tx|usart_mode_rx; 使能收發資料
串**們可以配置奇偶校驗,有8位資料區,加乙個停止位
usart_initstructure.usart_parity=usart_parity_no; //無奇偶校驗
usart_initstructure.usart_wordlength=usart_wordlength_8b; //字長
usart_initstructure.usart_stopbits=usart_stopbits_1; //停止位
一定要記得開啟usart串列埠和接收區中斷
usart_cmd(usart1,enable);//開啟usart串列埠
usart_itconfig(usart1,usart_it_rxne,enable);//接收區中斷
4.exti中斷配置,最好是在主函式提前宣告一下nvic_prioritygroupconfig(nvic_prioritygroup_2);中斷分組,這樣可以使**更加穩定。
void
usart1_irqhandler
(void
)//串列埠1中斷服務程式
else
//其他情況熄滅led
}}
此服務函式代表,進入中斷,每次傳送資料,led2可以閃爍一次,當傳送』1』時led1亮,傳送其他資料led1滅。
usart的配置還是上述**,只不過是服務函式有所變更
void
usart1_sendstr
(char
*str)
}
可以將此函式發在主函式的while(1)迴圈中,他就可以不停的向串列埠傳送資料。
在這裡注意:等待傳送完畢有兩種寫法while( (usart_getflagstatus(usart1,usart_flag_tc)) !=set);和while( (usart_getflagstatus(usart1,usart_flag_txe)) !=set);
當傳送移位暫存器中的1位元組資料已經通過tx腳一位一位的移出去後,該標誌位就會被置1,從而引發該事件的中斷。所以,其實usart_flag_tc就是用來標誌「傳送移位暫存器中的資料有沒有全部傳送出去」這件事。
當傳送資料暫存器中的資料已經取完了,該標誌位就會被置1,從而引發該事件的中斷。所以,其實usart_flag_txe就是用來標誌乙個事件的,通過這個標誌可以知道該事件有沒有發生(即傳送資料暫存器中的資料有沒有被取走)。
1.常見寫法一
這種寫法在不是特殊情況下,問題不大,usart資料會成功傳送出去。 但是在上面說的特殊情況下,問題就來了,**只將資料放到了傳送緩衝區,而沒有傳送出去就掉電或待機了,這個時候其實最後兩個字元是沒有傳送出去的。
2.常見寫法二
這種寫法達到的效果和上面存在不同的就是倒數第二個資料傳送出去了,也就是只有最後乙個字元是沒有傳送出去的。
3.常見寫法三
這種寫法達到的效果和上面兩種寫法有不一樣,傳送了10個字元。
4.寫法四
這種寫法按理說可以實現功能,但實際多次試驗結果確實第一位元組資料丟失了。
5.寫法五(正確寫法)
void
usart1_sendstr
(char
*str)
}
![在這裡插入圖
這種寫法是比較確保傳送完整資料的
STM32F103 串列埠 DMA中斷實現資料收發
02 stm32f103 串列埠 dma中斷實現資料收發 講了 串列埠 dma空閒中斷實現不定長資料收發的功能,除了利用空閒中斷實現資料收發,還可以利用dma的中斷實現資料的收發,不同之處是後者不能實現不定長資料的接收,本文講解dma中斷的方式實現資料的收發。使用dma的中斷時,無需配置串列埠的中斷...
STM32F103 串列埠DMA 庫函式程式設計
串列埠dma實質上就是在dma控制器的控制下將記憶體中的資料 比如我們定義的乙個陣列 乙個位元組乙個位元組複製到,串列埠資料暫存器,然後傳送出去,傳送過程由dma控制,不用我們 控制。而對於傳統串列埠傳送,要傳送字串一般是要用迴圈語句,而用dma只需要配置好相關暫存器就可以自動傳送字串。dma時鐘和...
STM32F103串列埠接收中斷溢位問題分析
stm32f103串列埠接收中斷溢位問題分析 本人目前正在做的機械人專案中,存在如下問題 1 小車舵機容易燒毀 分析原因 舵機不能堵轉,堵轉電流瞬間變大,將舵機燒毀,懷疑舵機質量問題以及存在舵機連桿機構不順滑導致堵轉的問題。2 小車手動模式能夠正常長時間執行,一旦上位機bringup指令啟動,建圖d...