1. POLL :使用HAL提供的函式:HAL_UART_Transmit
HAL_UART_Receive
2. INTERRUPT:使用HAL提供的函式:HAL_UART_Transmit_IT
HAL_UART_Receive_IT
3. DMA :使用HAL提供的函式:HAL_UART_Transmit_DMA
HAL_UART_Receive_DMA
1. POLL
一般是用所謂的blocking mode(阻斷模式),就是傳送/接收data時不被中斷,一直到傳送/接收完成為止,因此,如果只是使用UART沒有做其它的事,可用這種方式,但是如果還有其它的事要做,可能會受影響。
基本上,用POLL方式有幾個地方要注意。POLL使用HAL提供的函式形式如下,
HAL_UART_Transmit (&huart, Tx_data, sizeof (data), time);
HAL_UART_Receive(&huart, Rx_data, n, time); //接收 n bytes data
其中huart是Uart handle, Tx_data是要傳送的data buffer位址,sizeof (data)是傳輸量,Rx_data是接收buffer,time是timeout時間,timeout稱超時時間,也就是在此時間必須把data傳輸/接收完成,否則會有error或異常現象出現。因此傳大量data時,timeout要設長一點,timeout是以1ms為單位。
從上述可知,若有重要的事要做,又必須等它傳完data才能去做,在此情況下,可以改用INTERRUPT或DMA方式。
2. INTERRUPT
在INTERRUPT 模式,是使用所謂的non-blocking mode 模式(非阻斷模式),當傳送完成會呼叫 HAL_UART_TxCpltCallback( )函式,接收完成會呼叫HAL_UART_RxCpltCallback( )函式,使用者可在這些函式內寫上傳送/接收完成後要做的事情。
3. DMA
DMA也是使用non-blocking mode 模式(非阻斷模式),在DMA模式,DATA傳送/接收一半會有一個半傳輸完成的INTERRUPT被觸發產生,呼叫 HAL_UART_TxHalfCpltCallback /HAL_UART_RxHalfCpltCallback函式。
而當DATA傳送/接收完成,會呼叫 HAL_UART_TxCpltCallback / HAL_UART_RxCpltCallback 函式。
這樣的設計意義,對傳送端來說,是當後半段的DATA開始要傳輸時,便可將新的DATA寫入前半段,以加速資料的傳輸,這也是所謂的circular mode。
總結:
1. 關於STM32的UART 串連通訊,最重要的是使用INTERRUPT模式,POLL模式一般不使用,因系統不會只單純做UART通訊,且效率不好。
2. 在實際的應用上,往往不知要接收的資料有多長,所以使用HAL提供的函式,有點不切實際,唯一可以利用的是只接收一個CHARACTER就產生INTERRUPT的方式,再以接收的DATA來判斷是否是最後一個CHARACTER,(例如以"ENTER"做判斷標準),若不是最後字元,就照順序存入接收BUFFER,等收到"ENTER"後,就知道已完整收到DATA,可以繼續處理後續的事。
沒有留言:
張貼留言