76
76
#define UART_NUM (10)
77
77
#elif defined(STM32F0xx ) || defined(STM32F7xx )
78
78
#define UART_NUM (8)
79
- #elif defined(STM32F2xx )
79
+ #elif defined(STM32F2xx ) || defined( STM32L4xx )
80
80
#define UART_NUM (6)
81
81
#elif defined(STM32F1xx ) || defined(STM32F3xx ) || \
82
- defined(STM32L0xx ) || defined(STM32L1xx ) || defined( STM32L4xx )
82
+ defined(STM32L0xx ) || defined(STM32L1xx )
83
83
#define UART_NUM (5)
84
84
#else
85
85
#error "Unknown Family - unknown UART_NUM"
@@ -198,6 +198,19 @@ void uart_init(serial_t *obj)
198
198
obj -> irq = USART6_IRQn ;
199
199
}
200
200
#endif
201
+ #if defined(LPUART1_BASE )
202
+ else if (obj -> uart == LPUART1 ) {
203
+ __HAL_RCC_LPUART1_FORCE_RESET ();
204
+ __HAL_RCC_LPUART1_RELEASE_RESET ();
205
+ __HAL_RCC_LPUART1_CLK_ENABLE ();
206
+ #if !defined(USART3_BASE )
207
+ obj -> index = 2 ;
208
+ #else
209
+ obj -> index = 5 ;
210
+ #endif
211
+ obj -> irq = LPUART1_IRQn ;
212
+ }
213
+ #endif
201
214
#if defined(UART7_BASE )
202
215
else if (obj -> uart == UART7 ) {
203
216
__HAL_RCC_UART7_FORCE_RESET ();
@@ -280,6 +293,7 @@ void uart_init(serial_t *obj)
280
293
#endif /* STM32F1xx */
281
294
HAL_GPIO_Init (port , & GPIO_InitStruct );
282
295
296
+
283
297
//Configure uart
284
298
uart_handlers [obj -> index ] = huart ;
285
299
huart -> Instance = (USART_TypeDef * )(obj -> uart );
@@ -296,6 +310,56 @@ void uart_init(serial_t *obj)
296
310
#endif
297
311
// huart->Init.OneBitSampling = UART_ONE_BIT_SAMPLE_DISABLE;
298
312
313
+ #if defined(LPUART1_BASE )
314
+ /* Note that LPUART clock source must be in the range [3 x baud rate, 4096 x baud rate], check Ref Manual */
315
+ if (obj -> uart == LPUART1 ) {
316
+ if (obj -> baudrate <= 9600 ) {
317
+ HAL_UARTEx_EnableClockStopMode (huart );
318
+ HAL_UARTEx_EnableStopMode (huart );
319
+ } else {
320
+ HAL_UARTEx_DisableClockStopMode (huart );
321
+ HAL_UARTEx_DisableStopMode (huart );
322
+ }
323
+ /* Trying default LPUART clock source */
324
+ if (HAL_UART_Init (huart ) == HAL_OK ) {
325
+ return ;
326
+ }
327
+ /* Trying to change LPUART clock source */
328
+ /* If baudrate is lower than or equal to 9600 try to change to LSE */
329
+ if (obj -> baudrate <= 9600 ) {
330
+ /* Enable the clock if not already set by user */
331
+ if (__HAL_RCC_GET_FLAG (RCC_FLAG_LSERDY ) == RESET ) {
332
+ #ifdef __HAL_RCC_LSEDRIVE_CONFIG
333
+ __HAL_RCC_LSEDRIVE_CONFIG (RCC_LSEDRIVE_LOW );
334
+ #endif
335
+ RCC_OscInitTypeDef RCC_OscInitStruct = {0 };
336
+ RCC_OscInitStruct .OscillatorType = RCC_OSCILLATORTYPE_LSE ;
337
+ RCC_OscInitStruct .PLL .PLLState = RCC_PLL_NONE ;
338
+ RCC_OscInitStruct .LSEState = RCC_LSE_ON ;
339
+ if (HAL_RCC_OscConfig (& RCC_OscInitStruct ) != HAL_OK ) {
340
+ Error_Handler ();
341
+ }
342
+ }
343
+
344
+ __HAL_RCC_LPUART1_CONFIG (RCC_LPUART1CLKSOURCE_LSE );
345
+ if (HAL_UART_Init (huart ) == HAL_OK ) {
346
+ return ;
347
+ }
348
+ }
349
+ if (__HAL_RCC_GET_FLAG (RCC_FLAG_HSIRDY )) {
350
+ __HAL_RCC_LPUART1_CONFIG (RCC_LPUART1CLKSOURCE_HSI );
351
+ if (HAL_UART_Init (huart ) == HAL_OK ) {
352
+ return ;
353
+ }
354
+ }
355
+ __HAL_RCC_LPUART1_CONFIG (RCC_LPUART1CLKSOURCE_PCLK1 );
356
+ if (HAL_UART_Init (huart ) == HAL_OK ) {
357
+ return ;
358
+ }
359
+ __HAL_RCC_LPUART1_CONFIG (RCC_LPUART1CLKSOURCE_SYSCLK );
360
+ }
361
+ #endif
362
+
299
363
if (HAL_UART_Init (huart ) != HAL_OK ) {
300
364
return ;
301
365
}
@@ -330,6 +394,12 @@ void uart_deinit(serial_t *obj)
330
394
__HAL_RCC_USART3_RELEASE_RESET ();
331
395
__HAL_RCC_USART3_CLK_DISABLE ();
332
396
break ;
397
+ #elif defined(LPUART1_BASE )
398
+ case 2 :
399
+ __HAL_RCC_LPUART1_FORCE_RESET ();
400
+ __HAL_RCC_LPUART1_RELEASE_RESET ();
401
+ __HAL_RCC_LPUART1_CLK_DISABLE ();
402
+ break ;
333
403
#endif
334
404
#if defined(UART4_BASE )
335
405
case 3 :
@@ -363,6 +433,12 @@ void uart_deinit(serial_t *obj)
363
433
__HAL_RCC_USART6_RELEASE_RESET ();
364
434
__HAL_RCC_USART6_CLK_DISABLE ();
365
435
break ;
436
+ #elif defined(LPUART1_BASE )
437
+ case 5 :
438
+ __HAL_RCC_LPUART1_FORCE_RESET ();
439
+ __HAL_RCC_LPUART1_RELEASE_RESET ();
440
+ __HAL_RCC_LPUART1_CLK_DISABLE ();
441
+ break ;
366
442
#endif
367
443
#if defined(UART7_BASE )
368
444
case 6 :
@@ -467,6 +543,17 @@ void uart_config_lowpower(serial_t *obj)
467
543
__HAL_RCC_UART5_CONFIG (RCC_UART5CLKSOURCE_HSI );
468
544
}
469
545
break ;
546
+ #endif
547
+ #if defined(LPUART1_BASE ) && defined(__HAL_RCC_LPUART1_CONFIG )
548
+ #if !defined(USART3_BASE )
549
+ case 2 :
550
+ #else
551
+ case 5 :
552
+ #endif
553
+ if (__HAL_RCC_GET_LPUART1_SOURCE () != RCC_LPUART1CLKSOURCE_HSI ) {
554
+ __HAL_RCC_LPUART1_CONFIG (RCC_LPUART1CLKSOURCE_HSI );
555
+ }
556
+ break ;
470
557
#endif
471
558
}
472
559
}
@@ -883,6 +970,19 @@ void USART6_IRQHandler(void)
883
970
}
884
971
#endif
885
972
973
+ /**
974
+ * @brief LPUART 1 IRQ handler
975
+ * @param None
976
+ * @retval None
977
+ */
978
+ #if defined(LPUART1_BASE )
979
+ void LPUART1_IRQHandler (void )
980
+ {
981
+ HAL_NVIC_ClearPendingIRQ (LPUART1_IRQn );
982
+ HAL_UART_IRQHandler (uart_handlers [5 ]);
983
+ }
984
+ #endif
985
+
886
986
/**
887
987
* @brief UART 7 IRQ handler
888
988
* @param None
0 commit comments