Q:為什么使用串口前要先在電腦上安裝CH340驅動?
中斷的作用?
環形buffer的作用?
static和valitate的作用
三種編程方式簡介
?
也可以通過DMA方式減小CPU資源的消耗
直接把數據在SRAM內存和UART模塊進行傳輸?,流程:
- 把數據在DMA中配置好
- 數據傳輸
- 產生中斷,CPU介入
編程方式改進?
1、查詢方式對應的讀寫會存在時間延遲
比如接收:沒來得及保存RDR寄存器中接受到的數據時,RDR寄存器的值就已經被覆蓋;
2、中斷方式:事先在發送buffer中存好數據,使能發送空中斷;把接受的數據存入buffer
發送
- char tx_buf[100];存數據
- enable TXE
- TXE_ISR:中斷來取出數據發給TDR
接收
- 使能RXNE(接收非空)
- RXNE_ISR:利用中斷從RDR中取數據到緩沖區
3、用環形緩沖區改進中斷
4、用DMA方式減小CPU資源的消耗
一、查詢方式進行編程?
核心:判斷TDR和RDR寄存器的狀態
缺點:當接收時,若沒有來得及讀取數據,RDR中的值容易被覆蓋,進而丟失數據
實現:
- 發送:先判斷發送寄存器是否為空(借助狀態寄存器中的TXE),若為空,往里面(DR)寫入數據,自己的存儲器地址++(pdata16bits++)
- 接收:判斷RXNE是否收到數據(非空RXNE),若非空,讀取DR,存進自己的存儲器
?
二、官方中斷方式進行編程?
while(1){
調用HAL_UART_Transmit_IT使能中斷(中斷處理進行接收)14
等待中斷處理(接收)完畢
打印1(23)
}
核心:通過使能中斷,有字節就會
缺點:必須有函數及時調用HAL_UART_Transmit_IT,若未及時調用,數據也會丟失,實際場景中不會使用。。。。。所以HAL_UART_Transmit_IT沒有什么作用
步驟:cubeMX,選擇UART1串口,使能中斷
代碼邏輯:初始化串口時,同樣使能了中斷和設置了中斷的優先級;在中斷文檔中,增加了串口1 的中斷處理函數。(但只是使能串口1的中斷總開關,沒使能發送或接收中斷,中斷的管理還需要自己實現)
代碼實現:
- 調用HAL_UART_Transmit_IT函數,使能中斷UART_IT_TXE,使能后就返回,并不處理數據(中斷UART_IT_TXE,把數據發給寄存器)
- 在中斷處理函數中,若發送1000字節,則啟動999次TXE中斷和1次TC中斷(調用HAL_UART_TxCpltCallback)
在接收時,因打印比較耗時,若每及時的調用HAL_UART_Transmit_IT函數使能中斷,數據仍然會丟失
要發送數據時,使能“TXE”中斷(發送寄存器空中斷)。在 TXE 中斷處理函數里,從程序的發送 buffer 里取出一個數據,寫入 TDR;(TDR為空時:buffer---TDR---移位寄存器)
對于接收數據,在一開始就使能“RXNE”中斷(接收寄存器非空)。這樣,UART 接收到一個數據就會觸發中斷,在中斷程序里讀取 RDR 得到數據,存入程序的接收 buffer。(RDR非空時:移位寄存器---RDR---buffer)
和查詢相比:多了對事件的實時相應?
TXE中斷:TDR中的數據放入移位寄存器
TC中斷:移位寄存器中的數據全部發送出去
二、中斷方式改造
使能接收中斷
初始化緩沖區
while(1){
HAL_UART_Transmit_IT;
circle_buf_read(&g_uart1_rx_bufs, pVal);
等待數據傳輸完畢;
}
不太懂!!!!
① 一開始就使能接收中斷
② 接收中斷處理函數里,把數據存入環形 buffer,并再次使能接收中斷
三、DMA方式進行編程?
優點:在數據傳輸的過程中不使用CPU的資源?
配置DMA,進而實現在UART串口的TDR,RDR寄存器和芯片內存SRAM之間的直接數據傳輸。
當指定目標數量的數據傳輸完成后才會產生中斷,進而讓CPU介入。