Skip to content

Commit 5315214

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

File tree

3 files changed

+37
-0
lines changed

3 files changed

+37
-0
lines changed

cores/arduino/HardwareSerial.cpp

+1
Original file line numberDiff line numberDiff line change
@@ -373,5 +373,6 @@ void HardwareSerial::setRx(PinName _rx) {
373373
void HardwareSerial::setTx(PinName _tx){
374374
_serial.pin_tx = _tx;
375375
}
376+
376377
#endif // HAVE_HWSERIALx
377378
#endif // !NO_HWSERIAL

cores/arduino/HardwareSerial.h

+2
Original file line numberDiff line numberDiff line change
@@ -124,6 +124,8 @@ class HardwareSerial : public Stream
124124
void setRx(PinName _rx);
125125
void setTx(PinName _tx);
126126

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

cores/arduino/stm32/uart.c

+34
Original file line numberDiff line numberDiff line change
@@ -128,12 +128,20 @@ void uart_init(serial_t *obj)
128128

129129
// Enable USART clock
130130
if(obj->uart == USART1) {
131+
#ifdef STM32L4xx
132+
// Configure HSI as source clock for low power wakeup clock
133+
__HAL_RCC_USART1_CONFIG(RCC_USART1CLKSOURCE_HSI);
134+
#endif
131135
__HAL_RCC_USART1_FORCE_RESET();
132136
__HAL_RCC_USART1_RELEASE_RESET();
133137
__HAL_RCC_USART1_CLK_ENABLE();
134138
obj->index = 0;
135139
obj->irq = USART1_IRQn;
136140
} else if(obj->uart == USART2) {
141+
#ifdef STM32L4xx
142+
// Configure HSI as source clock for low power wakeup clock
143+
__HAL_RCC_USART2_CONFIG(RCC_USART2CLKSOURCE_HSI);
144+
#endif
137145
__HAL_RCC_USART2_FORCE_RESET();
138146
__HAL_RCC_USART2_RELEASE_RESET();
139147
__HAL_RCC_USART2_CLK_ENABLE();
@@ -142,6 +150,10 @@ void uart_init(serial_t *obj)
142150
}
143151
#if defined(USART3_BASE)
144152
else if(obj->uart == USART3) {
153+
#ifdef STM32L4xx
154+
// Configure HSI as source clock for low power wakeup clock
155+
__HAL_RCC_USART3_CONFIG(RCC_USART3CLKSOURCE_HSI);
156+
#endif
145157
__HAL_RCC_USART3_FORCE_RESET();
146158
__HAL_RCC_USART3_RELEASE_RESET();
147159
__HAL_RCC_USART3_CLK_ENABLE();
@@ -151,6 +163,10 @@ void uart_init(serial_t *obj)
151163
#endif
152164
#if defined(UART4_BASE)
153165
else if(obj->uart == UART4) {
166+
#ifdef STM32L4xx
167+
// Configure HSI as source clock for low power wakeup clock
168+
__HAL_RCC_UART4_CONFIG(RCC_UART4CLKSOURCE_HSI);
169+
#endif
154170
__HAL_RCC_UART4_FORCE_RESET();
155171
__HAL_RCC_UART4_RELEASE_RESET();
156172
__HAL_RCC_UART4_CLK_ENABLE();
@@ -168,6 +184,10 @@ void uart_init(serial_t *obj)
168184
#endif
169185
#if defined(UART5_BASE)
170186
else if(obj->uart == UART5) {
187+
#ifdef STM32L4xx
188+
// Configure HSI as source clock for low power wakeup clock
189+
__HAL_RCC_UART5_CONFIG(RCC_UART5CLKSOURCE_HSI);
190+
#endif
171191
__HAL_RCC_UART5_FORCE_RESET();
172192
__HAL_RCC_UART5_RELEASE_RESET();
173193
__HAL_RCC_UART5_CLK_ENABLE();
@@ -284,6 +304,7 @@ void uart_init(serial_t *obj)
284304
huart->Init.Mode = UART_MODE_TX_RX;
285305
huart->Init.HwFlowCtl = UART_HWCONTROL_NONE;
286306
huart->Init.OverSampling = UART_OVERSAMPLING_16;
307+
huart->AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT;
287308
// huart->Init.OneBitSampling = UART_ONE_BIT_SAMPLE_DISABLE;
288309

289310
if(HAL_UART_Init(huart) != HAL_OK) {
@@ -854,6 +875,19 @@ void UART10_IRQHandler(void)
854875
}
855876
#endif
856877

878+
/**
879+
* @brief HAL UART Call Back
880+
* @param UART handler
881+
* @retval None
882+
*/
883+
void HAL_UARTEx_WakeupCallback(UART_HandleTypeDef *huart)
884+
{
885+
uint8_t index = uart_index(huart);
886+
serial_t *obj = rx_callback_obj[index];
887+
888+
HAL_UART_Receive_IT(huart, &(obj->recv), 1);
889+
}
890+
857891
#ifdef __cplusplus
858892
}
859893
#endif

0 commit comments

Comments
 (0)