Bugfix/detect baudrate (#3188)
* Expose uartStartDetectBaudrate(uart_t *) in esp32-hal-uart.h and call it from HardwareSerial::begin() if baudrate detection is requested (by passing a baudrate of 0) to solve baudrate detection problems * Avoid a division by zero error in uartGetBaudRate()
This commit is contained in:
		
							parent
							
								
									5f77b0108b
								
							
						
					
					
						commit
						f71a4bd406
					
				| @ -55,6 +55,7 @@ void HardwareSerial::begin(unsigned long baud, uint32_t config, int8_t rxPin, in | ||||
|     _uart = uartBegin(_uart_nr, baud ? baud : 9600, config, rxPin, txPin, 256, invert); | ||||
| 
 | ||||
|     if(!baud) { | ||||
|         uartStartDetectBaudrate(_uart); | ||||
|         time_t startMillis = millis(); | ||||
|         unsigned long detectedBaudRate = 0; | ||||
|         while(millis() - startMillis < timeout_ms && !(detectedBaudRate = uartDetectBaudrate(_uart))) { | ||||
|  | ||||
| @ -401,7 +401,12 @@ uint32_t uartGetBaudRate(uart_t* uart) | ||||
|     if(uart == NULL) { | ||||
|         return 0; | ||||
|     } | ||||
| 
 | ||||
|     uint32_t clk_div = (uart->dev->clk_div.div_int << 4) | (uart->dev->clk_div.div_frag & 0x0F); | ||||
|     if(!clk_div) { | ||||
|         return 0; | ||||
|     } | ||||
| 
 | ||||
|     return ((getApbFrequency()<<4)/clk_div); | ||||
| } | ||||
| 
 | ||||
| @ -522,6 +527,14 @@ unsigned long uartBaudrateDetect(uart_t *uart, bool flg) | ||||
|  * detected calling uartBadrateDetect(). The raw baudrate is computed using the UART_CLK_FREQ. The raw baudrate is  | ||||
|  * rounded to the closed real baudrate. | ||||
| */ | ||||
| void uartStartDetectBaudrate(uart_t *uart) { | ||||
|   if(!uart) return; | ||||
| 
 | ||||
|   uart->dev->auto_baud.glitch_filt = 0x08; | ||||
|   uart->dev->auto_baud.en = 0; | ||||
|   uart->dev->auto_baud.en = 1; | ||||
| } | ||||
| 
 | ||||
| unsigned long | ||||
| uartDetectBaudrate(uart_t *uart) | ||||
| { | ||||
|  | ||||
| @ -72,6 +72,7 @@ size_t uartResizeRxBuffer(uart_t* uart, size_t new_size); | ||||
| void uartSetDebug(uart_t* uart); | ||||
| int uartGetDebug(); | ||||
| 
 | ||||
| void uartStartDetectBaudrate(uart_t *uart); | ||||
| unsigned long uartDetectBaudrate(uart_t *uart); | ||||
| 
 | ||||
| bool uartRxActive(uart_t* uart); | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user