V některých situacích může být vhodné, před přechodem do úsporného režimu, UART zrušit. Následně překonfigurovat RX pin na InterruptIn a pověsit na něj rise handler. Po vzbuzení přes přerušení na pinu pak zrušít InterruptIn na RX pinu a znova vytvořit UART. Počítejte s tím, že ztratíte nějaký znak. Ale to je vzhledem k času probuzení ze STOP modu normální. Jedná se, myslím, o poměrně efektivní způsob jak se snadno a energeticky nenáročně probouzet ze STOP modu při příchozí komunikaci na UARTech bez ohledu na nastavenou rychlost a typ UARTu. V principu tedy asi nějak takto:

... 

if(_serialGNSS != NULL) {

    _serialGNSS->attach(NULL, Serial::RxIrq);
    while(_serialGNSS->readable()) { // vyprazdnime buffer
        _serialGNSS->getc();
    }
    delete _serialGNSS;
    _serialGNSS = NULL;    

    GPIO_InitTypeDef GPIO_InitStruct;
    GPIO_InitStruct.Pin = GNSS_UART_TX;
    GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
    GPIO_InitStruct.Pull = GPIO_NOPULL;
    HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);                               
}

__HAL_RCC_USART3_CLK_DISABLE(); // je možné vynechat

if(_uart_pin_int == NULL) {
    _uart_pin_int = new InterruptIn(GNSS_UART_RX);
}
_uart_pin_int->rise(&GNSS::gnss_rx_pin);

...

/* Enter STOP 1 mode */
HAL_PWREx_EnterSTOP1Mode(PWR_STOPENTRY_WFI);

...

if(_uart_pin_int != NULL) {
    _uart_pin_int->rise(NULL);
    delete _uart_pin_int;
    _uart_pin_int = NULL;                                     
}

__HAL_RCC_USART3_CLK_ENABLE(); // je možné vynechat

if(_serialGNSS == NULL) {
    _serialGNSS = new RawSerial(GNSS_UART_TX, GNSS_UART_RX, GNSS_BAUD_RATE);
} 
_serialGNSS->attach(&GNSS::gnss_rx, Serial::RxIrq);

...