Skip to content

Commit eb61637

Browse files
author
fpr
committed
Update uart driver for low power mode
Signed-off-by: fpr <[email protected]>
1 parent 39db47b commit eb61637

File tree

3 files changed

+40
-0
lines changed

3 files changed

+40
-0
lines changed

cores/arduino/HardwareSerial.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -380,5 +380,6 @@ void HardwareSerial::setRx(PinName _rx) {
380380
void HardwareSerial::setTx(PinName _tx){
381381
_serial.pin_tx = _tx;
382382
}
383+
383384
#endif // HAVE_HWSERIALx
384385
#endif // !NO_HWSERIAL

cores/arduino/HardwareSerial.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -125,6 +125,8 @@ class HardwareSerial : public Stream
125125
void setRx(PinName _rx);
126126
void setTx(PinName _tx);
127127

128+
friend class STM32LowPower;
129+
128130
// Interrupt handlers
129131
static void _rx_complete_irq(serial_t* obj);
130132
static int _tx_complete_irq(serial_t* obj);

cores/arduino/stm32/uart.c

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -125,9 +125,14 @@ void uart_init(serial_t *obj)
125125
printf("ERROR: UART pins mismatch\n");
126126
return;
127127
}
128+
128129
// Enable USART clock
129130
#if defined(USART1_BASE)
130131
else if(obj->uart == USART1) {
132+
#ifdef STM32L4xx
133+
// Configure HSI as source clock for low power wakeup clock
134+
__HAL_RCC_USART1_CONFIG(RCC_USART1CLKSOURCE_HSI);
135+
#endif
131136
__HAL_RCC_USART1_FORCE_RESET();
132137
__HAL_RCC_USART1_RELEASE_RESET();
133138
__HAL_RCC_USART1_CLK_ENABLE();
@@ -137,6 +142,10 @@ void uart_init(serial_t *obj)
137142
#endif
138143
#if defined(USART2_BASE)
139144
else if(obj->uart == USART2) {
145+
#ifdef STM32L4xx
146+
// Configure HSI as source clock for low power wakeup clock
147+
__HAL_RCC_USART2_CONFIG(RCC_USART2CLKSOURCE_HSI);
148+
#endif
140149
__HAL_RCC_USART2_FORCE_RESET();
141150
__HAL_RCC_USART2_RELEASE_RESET();
142151
__HAL_RCC_USART2_CLK_ENABLE();
@@ -146,6 +155,10 @@ void uart_init(serial_t *obj)
146155
#endif
147156
#if defined(USART3_BASE)
148157
else if(obj->uart == USART3) {
158+
#ifdef STM32L4xx
159+
// Configure HSI as source clock for low power wakeup clock
160+
__HAL_RCC_USART3_CONFIG(RCC_USART3CLKSOURCE_HSI);
161+
#endif
149162
__HAL_RCC_USART3_FORCE_RESET();
150163
__HAL_RCC_USART3_RELEASE_RESET();
151164
__HAL_RCC_USART3_CLK_ENABLE();
@@ -155,6 +168,10 @@ void uart_init(serial_t *obj)
155168
#endif
156169
#if defined(UART4_BASE)
157170
else if(obj->uart == UART4) {
171+
#ifdef STM32L4xx
172+
// Configure HSI as source clock for low power wakeup clock
173+
__HAL_RCC_UART4_CONFIG(RCC_UART4CLKSOURCE_HSI);
174+
#endif
158175
__HAL_RCC_UART4_FORCE_RESET();
159176
__HAL_RCC_UART4_RELEASE_RESET();
160177
__HAL_RCC_UART4_CLK_ENABLE();
@@ -172,6 +189,10 @@ void uart_init(serial_t *obj)
172189
#endif
173190
#if defined(UART5_BASE)
174191
else if(obj->uart == UART5) {
192+
#ifdef STM32L4xx
193+
// Configure HSI as source clock for low power wakeup clock
194+
__HAL_RCC_UART5_CONFIG(RCC_UART5CLKSOURCE_HSI);
195+
#endif
175196
__HAL_RCC_UART5_FORCE_RESET();
176197
__HAL_RCC_UART5_RELEASE_RESET();
177198
__HAL_RCC_UART5_CLK_ENABLE();
@@ -288,6 +309,9 @@ void uart_init(serial_t *obj)
288309
huart->Init.Mode = UART_MODE_TX_RX;
289310
huart->Init.HwFlowCtl = UART_HWCONTROL_NONE;
290311
huart->Init.OverSampling = UART_OVERSAMPLING_16;
312+
#if defined(STM32F0xx) || defined(STM32F3xx) || defined(STM32F7xx) || defined(STM32L0xx) || defined(STM32L4xx)
313+
huart->AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT;
314+
#endif // STM32F0xx || STM32F3xx || STM32F7xx || STM32L0xx || STM32L4xx
291315
// huart->Init.OneBitSampling = UART_ONE_BIT_SAMPLE_DISABLE;
292316

293317
if(HAL_UART_Init(huart) != HAL_OK) {
@@ -866,6 +890,19 @@ void UART10_IRQHandler(void)
866890
}
867891
#endif
868892

893+
/**
894+
* @brief HAL UART Call Back
895+
* @param UART handler
896+
* @retval None
897+
*/
898+
void HAL_UARTEx_WakeupCallback(UART_HandleTypeDef *huart)
899+
{
900+
uint8_t index = uart_index(huart);
901+
serial_t *obj = rx_callback_obj[index];
902+
903+
HAL_UART_Receive_IT(huart, &(obj->recv), 1);
904+
}
905+
869906
#ifdef __cplusplus
870907
}
871908
#endif

0 commit comments

Comments
 (0)