diff --git a/miosix/arch/common/drivers/stm32_serial_common.cpp b/miosix/arch/common/drivers/stm32_serial_common.cpp index 79cea0669c7d77019f6acd808c8a7ac529931baf..64fa397a2a692790a1ecd0e58cf7d9458efbcd80 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 bede0933ca61c9b44f9910e751c988f338e07932..7174c9bac3bf3a7548f1218e313c03eb347548f8 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 13d352c823f814a530a9e145f620808d73e7283d..1e6eca5f632aa26f4262915255fa49fd30d38da6 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 812eb3eefdcdbecee3d841978ee4717132b3ce75..f417427ea90a239a2af0f572faaa077d3ec8c526 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);