From cbbfe2b4d15c8317d7e4196b9080d240f66ef25a Mon Sep 17 00:00:00 2001
From: Terraneo Federico <fede.tft@miosix.org>
Date: Sun, 5 Jan 2025 15:25:37 +0100
Subject: [PATCH] Activate pullup on serial port RX pin to prevent spurious
 received characters on unconnected ports

---
 miosix/arch/common/drivers/stm32_serial_common.cpp  | 5 +++--
 miosix/arch/common/drivers/stm32_serial_common.h    | 7 ++++---
 miosix/arch/common/drivers/stm32f1_f2_f4_serial.cpp | 5 +++--
 miosix/arch/common/drivers/stm32f7_serial.cpp       | 2 +-
 4 files changed, 11 insertions(+), 8 deletions(-)

diff --git a/miosix/arch/common/drivers/stm32_serial_common.cpp b/miosix/arch/common/drivers/stm32_serial_common.cpp
index 79cea066..64fa397a 100644
--- a/miosix/arch/common/drivers/stm32_serial_common.cpp
+++ b/miosix/arch/common/drivers/stm32_serial_common.cpp
@@ -31,11 +31,12 @@ using namespace miosix;
 
 #if defined(ALTFUNC_STM32F2_SPLIT)
 
-void STM32SerialAltFunc::set(GpioPin& pin) const
+void STM32SerialAltFunc::set(GpioPin& pin, bool pullUp) const
 {
     //First we set the AF then the mode to avoid glitches
     pin.alternateFunction(lookup(pin));
-    pin.mode(Mode::ALTERNATE);
+    if(pullUp) pin.mode(Mode::ALTERNATE_PULL_UP);
+    else pin.mode(Mode::ALTERNATE);
 }
 
 inline unsigned char STM32SerialAltFunc::lookup(GpioPin& gpio) const
diff --git a/miosix/arch/common/drivers/stm32_serial_common.h b/miosix/arch/common/drivers/stm32_serial_common.h
index bede0933..7174c9ba 100644
--- a/miosix/arch/common/drivers/stm32_serial_common.h
+++ b/miosix/arch/common/drivers/stm32_serial_common.h
@@ -242,11 +242,12 @@ struct STM32SerialAltFunc
 
 struct STM32SerialAltFunc
 {
-    void set(GpioPin& pin) const
+    void set(GpioPin& pin, bool pullUp=false) const
     {
         //First we set the AF then the mode to avoid glitches
         pin.alternateFunction(af);
-        pin.mode(Mode::ALTERNATE);
+        if(pullUp) pin.mode(Mode::ALTERNATE_PULL_UP);
+        else pin.mode(Mode::ALTERNATE);
     }
     unsigned char af;
 };
@@ -278,7 +279,7 @@ struct STM32SerialAltFunc
     };
     const Span *spans;
 
-    void set(GpioPin& pin) const;
+    void set(GpioPin& pin, bool pullUp=false) const;
 private:
     inline unsigned char lookup(GpioPin& gpio) const;
 };
diff --git a/miosix/arch/common/drivers/stm32f1_f2_f4_serial.cpp b/miosix/arch/common/drivers/stm32f1_f2_f4_serial.cpp
index 13d352c8..1e6eca5f 100644
--- a/miosix/arch/common/drivers/stm32f1_f2_f4_serial.cpp
+++ b/miosix/arch/common/drivers/stm32f1_f2_f4_serial.cpp
@@ -256,7 +256,8 @@ void STM32SerialBase::commonInit(int id, int baudrate, GpioPin tx, GpioPin rx,
         //Quirk: stm32f1 rx pin has to be in input mode, while stm32f2 and up
         //want it in ALTERNATE mode. Go figure...
         tx.mode(Mode::ALTERNATE);
-        rx.mode(Mode::INPUT);
+        rx.mode(Mode::INPUT_PULL_UP_DOWN);
+        rx.pullup(); //Pullup: prevent spurious rx if unconnected
         if(flowControl)
         {
             rts.mode(Mode::ALTERNATE);
@@ -264,7 +265,7 @@ void STM32SerialBase::commonInit(int id, int baudrate, GpioPin tx, GpioPin rx,
         }
     #else
         port->getAltFunc().set(tx);
-        port->getAltFunc().set(rx);
+        port->getAltFunc().set(rx,true); //Pullup: prevent spurious rx if unconnected
         if(flowControl)
         {
             port->getAltFunc().set(rts);
diff --git a/miosix/arch/common/drivers/stm32f7_serial.cpp b/miosix/arch/common/drivers/stm32f7_serial.cpp
index 812eb3ee..f417427e 100644
--- a/miosix/arch/common/drivers/stm32f7_serial.cpp
+++ b/miosix/arch/common/drivers/stm32f7_serial.cpp
@@ -428,7 +428,7 @@ void STM32SerialBase::commonInit(int id, int baudrate, GpioPin tx, GpioPin rx,
                     GpioPin rts, GpioPin cts)
 {
     port->getAltFunc().set(tx);
-    port->getAltFunc().set(rx);
+    port->getAltFunc().set(rx,true); //Pullup: prevent spurious rx if unconnected
     if(flowControl)
     {
         port->getAltFunc().set(rts);
-- 
GitLab