diff --git a/miosix/arch/cortexM0_stm32f0/common/interfaces-impl/gpio_impl.h b/miosix/arch/cortexM0_stm32f0/common/interfaces-impl/gpio_impl.h
index 4b0d495db07bbc164f57dd35765f95c69d0f86ca..0fb39e18e129ede6dae44c2a27cbc84a17e95d52 100644
--- a/miosix/arch/cortexM0_stm32f0/common/interfaces-impl/gpio_impl.h
+++ b/miosix/arch/cortexM0_stm32f0/common/interfaces-impl/gpio_impl.h
@@ -57,14 +57,22 @@ public:
      */
     enum Mode_
     {
-        INPUT              =  0, ///Floating Input       (MODE=00 TYPE=0 PUP=00)
-        INPUT_PULL_UP      =  1, ///Pullup   Input       (MODE=00 TYPE=0 PUP=01)
-        INPUT_PULL_DOWN    =  2, ///Pulldown Input       (MODE=00 TYPE=0 PUP=10)
-        INPUT_ANALOG       = 24, ///Analog   Input       (MODE=11 TYPE=0 PUP=00)
-        OUTPUT             =  8, ///Push Pull  Output    (MODE=01 TYPE=0 PUP=00)
-        OPEN_DRAIN         = 12, ///Open Drain Output    (MODE=01 TYPE=1 PUP=00)
-        ALTERNATE          = 16, ///Alternate function   (MODE=10 TYPE=0 PUP=00)
-        ALTERNATE_OD       = 20, ///Alternate Open Drain (MODE=10 TYPE=1 PUP=00)
+        INPUT_ANALOG           = 0b11000, ///Input Analog            (MODE=11 TYPE=0 PUP=00)
+        INPUT                  = 0b00000, ///Input Floating          (MODE=00 TYPE=0 PUP=00)
+        INPUT_PULL_UP          = 0b00001, ///Input PullUp            (MODE=00 TYPE=0 PUP=01)
+        INPUT_PULL_DOWN        = 0b00010, ///Input PullDown          (MODE=00 TYPE=0 PUP=10)
+        OUTPUT                 = 0b01000, ///Push Pull  Output       (MODE=01 TYPE=0 PUP=00)
+        OUTPUT_PULL_UP         = 0b01001, ///Push Pull  Output PU    (MODE=01 TYPE=0 PUP=01)
+        OUTPUT_PULL_DOWN       = 0b01010, ///Push Pull  Output PD    (MODE=01 TYPE=0 PUP=10)
+        OPEN_DRAIN             = 0b01100, ///Open Drain Output       (MODE=01 TYPE=1 PUP=00)
+        OPEN_DRAIN_PULL_UP     = 0b01101, ///Open Drain Output PU    (MODE=01 TYPE=1 PUP=01)
+        OPEN_DRAIN_PULL_DOWN   = 0b01110, ///Open Drain Output PD    (MODE=01 TYPE=1 PUP=10)
+        ALTERNATE              = 0b10000, ///Alternate function      (MODE=10 TYPE=0 PUP=00)
+        ALTERNATE_PULL_UP      = 0b10001, ///Alternate function PU   (MODE=10 TYPE=0 PUP=01)
+        ALTERNATE_PULL_DOWN    = 0b10010, ///Alternate function PD   (MODE=10 TYPE=0 PUP=10)
+        ALTERNATE_OD           = 0b10100, ///Alternate Open Drain    (MODE=10 TYPE=1 PUP=00)
+        ALTERNATE_OD_PULL_UP   = 0b10101, ///Alternate Open Drain PU (MODE=10 TYPE=1 PUP=01)
+        ALTERNATE_OD_PULL_DOWN = 0b10110, ///Alternate Open Drain PD (MODE=10 TYPE=1 PUP=10)
     };
 private:
     Mode(); //Just a wrapper class, disallow creating instances
diff --git a/miosix/arch/cortexM3_stm32f2/common/interfaces-impl/gpio_impl.h b/miosix/arch/cortexM3_stm32f2/common/interfaces-impl/gpio_impl.h
index 50181a0e2082994cfa4c278472c83b18cbeec17f..38f55cd8ac6e2cabaf8e4890574d23c9225a2474 100644
--- a/miosix/arch/cortexM3_stm32f2/common/interfaces-impl/gpio_impl.h
+++ b/miosix/arch/cortexM3_stm32f2/common/interfaces-impl/gpio_impl.h
@@ -57,14 +57,22 @@ public:
      */
     enum Mode_
     {
-        INPUT              =  0, ///Floating Input       (MODE=00 TYPE=0 PUP=00)
-        INPUT_PULL_UP      =  1, ///Pullup   Input       (MODE=00 TYPE=0 PUP=01)
-        INPUT_PULL_DOWN    =  2, ///Pulldown Input       (MODE=00 TYPE=0 PUP=10)
-        INPUT_ANALOG       = 24, ///Analog   Input       (MODE=11 TYPE=0 PUP=00)
-        OUTPUT             =  8, ///Push Pull  Output    (MODE=01 TYPE=0 PUP=00)
-        OPEN_DRAIN         = 12, ///Open Drain Output    (MODE=01 TYPE=1 PUP=00)
-        ALTERNATE          = 16, ///Alternate function   (MODE=10 TYPE=0 PUP=00)
-        ALTERNATE_OD       = 20, ///Alternate Open Drain (MODE=10 TYPE=1 PUP=00)
+        INPUT_ANALOG           = 0b11000, ///Input Analog            (MODE=11 TYPE=0 PUP=00)
+        INPUT                  = 0b00000, ///Input Floating          (MODE=00 TYPE=0 PUP=00)
+        INPUT_PULL_UP          = 0b00001, ///Input PullUp            (MODE=00 TYPE=0 PUP=01)
+        INPUT_PULL_DOWN        = 0b00010, ///Input PullDown          (MODE=00 TYPE=0 PUP=10)
+        OUTPUT                 = 0b01000, ///Push Pull  Output       (MODE=01 TYPE=0 PUP=00)
+        OUTPUT_PULL_UP         = 0b01001, ///Push Pull  Output PU    (MODE=01 TYPE=0 PUP=01)
+        OUTPUT_PULL_DOWN       = 0b01010, ///Push Pull  Output PD    (MODE=01 TYPE=0 PUP=10)
+        OPEN_DRAIN             = 0b01100, ///Open Drain Output       (MODE=01 TYPE=1 PUP=00)
+        OPEN_DRAIN_PULL_UP     = 0b01101, ///Open Drain Output PU    (MODE=01 TYPE=1 PUP=01)
+        OPEN_DRAIN_PULL_DOWN   = 0b01110, ///Open Drain Output PD    (MODE=01 TYPE=1 PUP=10)
+        ALTERNATE              = 0b10000, ///Alternate function      (MODE=10 TYPE=0 PUP=00)
+        ALTERNATE_PULL_UP      = 0b10001, ///Alternate function PU   (MODE=10 TYPE=0 PUP=01)
+        ALTERNATE_PULL_DOWN    = 0b10010, ///Alternate function PD   (MODE=10 TYPE=0 PUP=10)
+        ALTERNATE_OD           = 0b10100, ///Alternate Open Drain    (MODE=10 TYPE=1 PUP=00)
+        ALTERNATE_OD_PULL_UP   = 0b10101, ///Alternate Open Drain PU (MODE=10 TYPE=1 PUP=01)
+        ALTERNATE_OD_PULL_DOWN = 0b10110, ///Alternate Open Drain PD (MODE=10 TYPE=1 PUP=10)
     };
 private:
     Mode(); //Just a wrapper class, disallow creating instances
diff --git a/miosix/arch/cortexM3_stm32l1/common/interfaces-impl/gpio_impl.h b/miosix/arch/cortexM3_stm32l1/common/interfaces-impl/gpio_impl.h
index 9ddd3053be6061b18016f8f99180f0425c5dbb83..e527f3ce8e36a67325de617ddf95825356cb0b96 100644
--- a/miosix/arch/cortexM3_stm32l1/common/interfaces-impl/gpio_impl.h
+++ b/miosix/arch/cortexM3_stm32l1/common/interfaces-impl/gpio_impl.h
@@ -57,14 +57,22 @@ public:
      */
     enum Mode_
     {
-        INPUT              =  0, ///Floating Input       (MODE=00 TYPE=0 PUP=00)
-        INPUT_PULL_UP      =  1, ///Pullup   Input       (MODE=00 TYPE=0 PUP=01)
-        INPUT_PULL_DOWN    =  2, ///Pulldown Input       (MODE=00 TYPE=0 PUP=10)
-        INPUT_ANALOG       = 24, ///Analog   Input       (MODE=11 TYPE=0 PUP=00)
-        OUTPUT             =  8, ///Push Pull  Output    (MODE=01 TYPE=0 PUP=00)
-        OPEN_DRAIN         = 12, ///Open Drain Output    (MODE=01 TYPE=1 PUP=00)
-        ALTERNATE          = 16, ///Alternate function   (MODE=10 TYPE=0 PUP=00)
-        ALTERNATE_OD       = 20, ///Alternate Open Drain (MODE=10 TYPE=1 PUP=00)
+        INPUT_ANALOG           = 0b11000, ///Input Analog            (MODE=11 TYPE=0 PUP=00)
+        INPUT                  = 0b00000, ///Input Floating          (MODE=00 TYPE=0 PUP=00)
+        INPUT_PULL_UP          = 0b00001, ///Input PullUp            (MODE=00 TYPE=0 PUP=01)
+        INPUT_PULL_DOWN        = 0b00010, ///Input PullDown          (MODE=00 TYPE=0 PUP=10)
+        OUTPUT                 = 0b01000, ///Push Pull  Output       (MODE=01 TYPE=0 PUP=00)
+        OUTPUT_PULL_UP         = 0b01001, ///Push Pull  Output PU    (MODE=01 TYPE=0 PUP=01)
+        OUTPUT_PULL_DOWN       = 0b01010, ///Push Pull  Output PD    (MODE=01 TYPE=0 PUP=10)
+        OPEN_DRAIN             = 0b01100, ///Open Drain Output       (MODE=01 TYPE=1 PUP=00)
+        OPEN_DRAIN_PULL_UP     = 0b01101, ///Open Drain Output PU    (MODE=01 TYPE=1 PUP=01)
+        OPEN_DRAIN_PULL_DOWN   = 0b01110, ///Open Drain Output PD    (MODE=01 TYPE=1 PUP=10)
+        ALTERNATE              = 0b10000, ///Alternate function      (MODE=10 TYPE=0 PUP=00)
+        ALTERNATE_PULL_UP      = 0b10001, ///Alternate function PU   (MODE=10 TYPE=0 PUP=01)
+        ALTERNATE_PULL_DOWN    = 0b10010, ///Alternate function PD   (MODE=10 TYPE=0 PUP=10)
+        ALTERNATE_OD           = 0b10100, ///Alternate Open Drain    (MODE=10 TYPE=1 PUP=00)
+        ALTERNATE_OD_PULL_UP   = 0b10101, ///Alternate Open Drain PU (MODE=10 TYPE=1 PUP=01)
+        ALTERNATE_OD_PULL_DOWN = 0b10110, ///Alternate Open Drain PD (MODE=10 TYPE=1 PUP=10)
     };
 private:
     Mode(); //Just a wrapper class, disallow creating instances
diff --git a/miosix/arch/cortexM4_stm32f3/common/interfaces-impl/gpio_impl.h b/miosix/arch/cortexM4_stm32f3/common/interfaces-impl/gpio_impl.h
index f81ea15911d2385f4458df0dae7a506c746073d3..5273fdcf533fceb4e67194749675c46d6ece723c 100644
--- a/miosix/arch/cortexM4_stm32f3/common/interfaces-impl/gpio_impl.h
+++ b/miosix/arch/cortexM4_stm32f3/common/interfaces-impl/gpio_impl.h
@@ -57,14 +57,22 @@ public:
      */
     enum Mode_
     {
-        INPUT              =  0, ///Floating Input       (MODE=00 TYPE=0 PUP=00)
-        INPUT_PULL_UP      =  1, ///Pullup   Input       (MODE=00 TYPE=0 PUP=01)
-        INPUT_PULL_DOWN    =  2, ///Pulldown Input       (MODE=00 TYPE=0 PUP=10)
-        INPUT_ANALOG       = 24, ///Analog   Input       (MODE=11 TYPE=0 PUP=00)
-        OUTPUT             =  8, ///Push Pull  Output    (MODE=01 TYPE=0 PUP=00)
-        OPEN_DRAIN         = 12, ///Open Drain Output    (MODE=01 TYPE=1 PUP=00)
-        ALTERNATE          = 16, ///Alternate function   (MODE=10 TYPE=0 PUP=00)
-        ALTERNATE_OD       = 20, ///Alternate Open Drain (MODE=10 TYPE=1 PUP=00)
+        INPUT_ANALOG           = 0b11000, ///Input Analog            (MODE=11 TYPE=0 PUP=00)
+        INPUT                  = 0b00000, ///Input Floating          (MODE=00 TYPE=0 PUP=00)
+        INPUT_PULL_UP          = 0b00001, ///Input PullUp            (MODE=00 TYPE=0 PUP=01)
+        INPUT_PULL_DOWN        = 0b00010, ///Input PullDown          (MODE=00 TYPE=0 PUP=10)
+        OUTPUT                 = 0b01000, ///Push Pull  Output       (MODE=01 TYPE=0 PUP=00)
+        OUTPUT_PULL_UP         = 0b01001, ///Push Pull  Output PU    (MODE=01 TYPE=0 PUP=01)
+        OUTPUT_PULL_DOWN       = 0b01010, ///Push Pull  Output PD    (MODE=01 TYPE=0 PUP=10)
+        OPEN_DRAIN             = 0b01100, ///Open Drain Output       (MODE=01 TYPE=1 PUP=00)
+        OPEN_DRAIN_PULL_UP     = 0b01101, ///Open Drain Output PU    (MODE=01 TYPE=1 PUP=01)
+        OPEN_DRAIN_PULL_DOWN   = 0b01110, ///Open Drain Output PD    (MODE=01 TYPE=1 PUP=10)
+        ALTERNATE              = 0b10000, ///Alternate function      (MODE=10 TYPE=0 PUP=00)
+        ALTERNATE_PULL_UP      = 0b10001, ///Alternate function PU   (MODE=10 TYPE=0 PUP=01)
+        ALTERNATE_PULL_DOWN    = 0b10010, ///Alternate function PD   (MODE=10 TYPE=0 PUP=10)
+        ALTERNATE_OD           = 0b10100, ///Alternate Open Drain    (MODE=10 TYPE=1 PUP=00)
+        ALTERNATE_OD_PULL_UP   = 0b10101, ///Alternate Open Drain PU (MODE=10 TYPE=1 PUP=01)
+        ALTERNATE_OD_PULL_DOWN = 0b10110, ///Alternate Open Drain PD (MODE=10 TYPE=1 PUP=10)
     };
 private:
     Mode(); //Just a wrapper class, disallow creating instances
diff --git a/miosix/arch/cortexM4_stm32f4/common/interfaces-impl/gpio_impl.h b/miosix/arch/cortexM4_stm32f4/common/interfaces-impl/gpio_impl.h
index d730d44dca16f7115a2501f2677e795dd96ce5f3..ec794137f039a368eb1c67a9d690411aec0f796d 100644
--- a/miosix/arch/cortexM4_stm32f4/common/interfaces-impl/gpio_impl.h
+++ b/miosix/arch/cortexM4_stm32f4/common/interfaces-impl/gpio_impl.h
@@ -57,14 +57,22 @@ public:
      */
     enum Mode_
     {
-        INPUT              =  0, ///Floating Input       (MODE=00 TYPE=0 PUP=00)
-        INPUT_PULL_UP      =  1, ///Pullup   Input       (MODE=00 TYPE=0 PUP=01)
-        INPUT_PULL_DOWN    =  2, ///Pulldown Input       (MODE=00 TYPE=0 PUP=10)
-        INPUT_ANALOG       = 24, ///Analog   Input       (MODE=11 TYPE=0 PUP=00)
-        OUTPUT             =  8, ///Push Pull  Output    (MODE=01 TYPE=0 PUP=00)
-        OPEN_DRAIN         = 12, ///Open Drain Output    (MODE=01 TYPE=1 PUP=00)
-        ALTERNATE          = 16, ///Alternate function   (MODE=10 TYPE=0 PUP=00)
-        ALTERNATE_OD       = 20, ///Alternate Open Drain (MODE=10 TYPE=1 PUP=00)
+        INPUT_ANALOG           = 0b11000, ///Input Analog            (MODE=11 TYPE=0 PUP=00)
+        INPUT                  = 0b00000, ///Input Floating          (MODE=00 TYPE=0 PUP=00)
+        INPUT_PULL_UP          = 0b00001, ///Input PullUp            (MODE=00 TYPE=0 PUP=01)
+        INPUT_PULL_DOWN        = 0b00010, ///Input PullDown          (MODE=00 TYPE=0 PUP=10)
+        OUTPUT                 = 0b01000, ///Push Pull  Output       (MODE=01 TYPE=0 PUP=00)
+        OUTPUT_PULL_UP         = 0b01001, ///Push Pull  Output PU    (MODE=01 TYPE=0 PUP=01)
+        OUTPUT_PULL_DOWN       = 0b01010, ///Push Pull  Output PD    (MODE=01 TYPE=0 PUP=10)
+        OPEN_DRAIN             = 0b01100, ///Open Drain Output       (MODE=01 TYPE=1 PUP=00)
+        OPEN_DRAIN_PULL_UP     = 0b01101, ///Open Drain Output PU    (MODE=01 TYPE=1 PUP=01)
+        OPEN_DRAIN_PULL_DOWN   = 0b01110, ///Open Drain Output PD    (MODE=01 TYPE=1 PUP=10)
+        ALTERNATE              = 0b10000, ///Alternate function      (MODE=10 TYPE=0 PUP=00)
+        ALTERNATE_PULL_UP      = 0b10001, ///Alternate function PU   (MODE=10 TYPE=0 PUP=01)
+        ALTERNATE_PULL_DOWN    = 0b10010, ///Alternate function PD   (MODE=10 TYPE=0 PUP=10)
+        ALTERNATE_OD           = 0b10100, ///Alternate Open Drain    (MODE=10 TYPE=1 PUP=00)
+        ALTERNATE_OD_PULL_UP   = 0b10101, ///Alternate Open Drain PU (MODE=10 TYPE=1 PUP=01)
+        ALTERNATE_OD_PULL_DOWN = 0b10110, ///Alternate Open Drain PD (MODE=10 TYPE=1 PUP=10)
     };
 private:
     Mode(); //Just a wrapper class, disallow creating instances
diff --git a/miosix/arch/cortexM4_stm32l4/common/interfaces-impl/gpio_impl.h b/miosix/arch/cortexM4_stm32l4/common/interfaces-impl/gpio_impl.h
index 4b588abbf1c41c9db3afff95fcaf683ad78de53e..07de1756d6299b681e91839b1289d689201bf56a 100644
--- a/miosix/arch/cortexM4_stm32l4/common/interfaces-impl/gpio_impl.h
+++ b/miosix/arch/cortexM4_stm32l4/common/interfaces-impl/gpio_impl.h
@@ -57,14 +57,22 @@ public:
      */
     enum Mode_
     {
-        INPUT              =  0, ///Floating Input       (MODE=00 TYPE=0 PUP=00)
-        INPUT_PULL_UP      =  1, ///Pullup   Input       (MODE=00 TYPE=0 PUP=01)
-        INPUT_PULL_DOWN    =  2, ///Pulldown Input       (MODE=00 TYPE=0 PUP=10)
-        INPUT_ANALOG       = 24, ///Analog   Input       (MODE=11 TYPE=0 PUP=00)
-        OUTPUT             =  8, ///Push Pull  Output    (MODE=01 TYPE=0 PUP=00)
-        OPEN_DRAIN         = 12, ///Open Drain Output    (MODE=01 TYPE=1 PUP=00)
-        ALTERNATE          = 16, ///Alternate function   (MODE=10 TYPE=0 PUP=00)
-        ALTERNATE_OD       = 20, ///Alternate Open Drain (MODE=10 TYPE=1 PUP=00)
+        INPUT_ANALOG           = 0b11000, ///Input Analog            (MODE=11 TYPE=0 PUP=00)
+        INPUT                  = 0b00000, ///Input Floating          (MODE=00 TYPE=0 PUP=00)
+        INPUT_PULL_UP          = 0b00001, ///Input PullUp            (MODE=00 TYPE=0 PUP=01)
+        INPUT_PULL_DOWN        = 0b00010, ///Input PullDown          (MODE=00 TYPE=0 PUP=10)
+        OUTPUT                 = 0b01000, ///Push Pull  Output       (MODE=01 TYPE=0 PUP=00)
+        OUTPUT_PULL_UP         = 0b01001, ///Push Pull  Output PU    (MODE=01 TYPE=0 PUP=01)
+        OUTPUT_PULL_DOWN       = 0b01010, ///Push Pull  Output PD    (MODE=01 TYPE=0 PUP=10)
+        OPEN_DRAIN             = 0b01100, ///Open Drain Output       (MODE=01 TYPE=1 PUP=00)
+        OPEN_DRAIN_PULL_UP     = 0b01101, ///Open Drain Output PU    (MODE=01 TYPE=1 PUP=01)
+        OPEN_DRAIN_PULL_DOWN   = 0b01110, ///Open Drain Output PD    (MODE=01 TYPE=1 PUP=10)
+        ALTERNATE              = 0b10000, ///Alternate function      (MODE=10 TYPE=0 PUP=00)
+        ALTERNATE_PULL_UP      = 0b10001, ///Alternate function PU   (MODE=10 TYPE=0 PUP=01)
+        ALTERNATE_PULL_DOWN    = 0b10010, ///Alternate function PD   (MODE=10 TYPE=0 PUP=10)
+        ALTERNATE_OD           = 0b10100, ///Alternate Open Drain    (MODE=10 TYPE=1 PUP=00)
+        ALTERNATE_OD_PULL_UP   = 0b10101, ///Alternate Open Drain PU (MODE=10 TYPE=1 PUP=01)
+        ALTERNATE_OD_PULL_DOWN = 0b10110, ///Alternate Open Drain PD (MODE=10 TYPE=1 PUP=10)
     };
 private:
     Mode(); //Just a wrapper class, disallow creating instances
diff --git a/miosix/arch/cortexM7_stm32f7/common/interfaces-impl/gpio_impl.h b/miosix/arch/cortexM7_stm32f7/common/interfaces-impl/gpio_impl.h
index 1c3293f415e0a36abff4ac9e8f54390f33cf7299..c0bea78644a8dd006ac0d0935fb7a7cb1f4e2228 100644
--- a/miosix/arch/cortexM7_stm32f7/common/interfaces-impl/gpio_impl.h
+++ b/miosix/arch/cortexM7_stm32f7/common/interfaces-impl/gpio_impl.h
@@ -57,14 +57,22 @@ public:
      */
     enum Mode_
     {
-        INPUT              =  0, ///Floating Input       (MODE=00 TYPE=0 PUP=00)
-        INPUT_PULL_UP      =  1, ///Pullup   Input       (MODE=00 TYPE=0 PUP=01)
-        INPUT_PULL_DOWN    =  2, ///Pulldown Input       (MODE=00 TYPE=0 PUP=10)
-        INPUT_ANALOG       = 24, ///Analog   Input       (MODE=11 TYPE=0 PUP=00)
-        OUTPUT             =  8, ///Push Pull  Output    (MODE=01 TYPE=0 PUP=00)
-        OPEN_DRAIN         = 12, ///Open Drain Output    (MODE=01 TYPE=1 PUP=00)
-        ALTERNATE          = 16, ///Alternate function   (MODE=10 TYPE=0 PUP=00)
-        ALTERNATE_OD       = 20, ///Alternate Open Drain (MODE=10 TYPE=1 PUP=00)
+        INPUT_ANALOG           = 0b11000, ///Input Analog            (MODE=11 TYPE=0 PUP=00)
+        INPUT                  = 0b00000, ///Input Floating          (MODE=00 TYPE=0 PUP=00)
+        INPUT_PULL_UP          = 0b00001, ///Input PullUp            (MODE=00 TYPE=0 PUP=01)
+        INPUT_PULL_DOWN        = 0b00010, ///Input PullDown          (MODE=00 TYPE=0 PUP=10)
+        OUTPUT                 = 0b01000, ///Push Pull  Output       (MODE=01 TYPE=0 PUP=00)
+        OUTPUT_PULL_UP         = 0b01001, ///Push Pull  Output PU    (MODE=01 TYPE=0 PUP=01)
+        OUTPUT_PULL_DOWN       = 0b01010, ///Push Pull  Output PD    (MODE=01 TYPE=0 PUP=10)
+        OPEN_DRAIN             = 0b01100, ///Open Drain Output       (MODE=01 TYPE=1 PUP=00)
+        OPEN_DRAIN_PULL_UP     = 0b01101, ///Open Drain Output PU    (MODE=01 TYPE=1 PUP=01)
+        OPEN_DRAIN_PULL_DOWN   = 0b01110, ///Open Drain Output PD    (MODE=01 TYPE=1 PUP=10)
+        ALTERNATE              = 0b10000, ///Alternate function      (MODE=10 TYPE=0 PUP=00)
+        ALTERNATE_PULL_UP      = 0b10001, ///Alternate function PU   (MODE=10 TYPE=0 PUP=01)
+        ALTERNATE_PULL_DOWN    = 0b10010, ///Alternate function PD   (MODE=10 TYPE=0 PUP=10)
+        ALTERNATE_OD           = 0b10100, ///Alternate Open Drain    (MODE=10 TYPE=1 PUP=00)
+        ALTERNATE_OD_PULL_UP   = 0b10101, ///Alternate Open Drain PU (MODE=10 TYPE=1 PUP=01)
+        ALTERNATE_OD_PULL_DOWN = 0b10110, ///Alternate Open Drain PD (MODE=10 TYPE=1 PUP=10)
     };
 private:
     Mode(); //Just a wrapper class, disallow creating instances
diff --git a/miosix/arch/cortexM7_stm32h7/common/interfaces-impl/gpio_impl.h b/miosix/arch/cortexM7_stm32h7/common/interfaces-impl/gpio_impl.h
index 951b7f15a0cfb86bd2f241322c8c9f654d079e9e..04ec6d3c5f1054360a82ae2f3de236f064994721 100644
--- a/miosix/arch/cortexM7_stm32h7/common/interfaces-impl/gpio_impl.h
+++ b/miosix/arch/cortexM7_stm32h7/common/interfaces-impl/gpio_impl.h
@@ -57,14 +57,22 @@ public:
      */
     enum Mode_
     {
-        INPUT              =  0, ///Floating Input       (MODE=00 TYPE=0 PUP=00)
-        INPUT_PULL_UP      =  1, ///Pullup   Input       (MODE=00 TYPE=0 PUP=01)
-        INPUT_PULL_DOWN    =  2, ///Pulldown Input       (MODE=00 TYPE=0 PUP=10)
-        INPUT_ANALOG       = 24, ///Analog   Input       (MODE=11 TYPE=0 PUP=00)
-        OUTPUT             =  8, ///Push Pull  Output    (MODE=01 TYPE=0 PUP=00)
-        OPEN_DRAIN         = 12, ///Open Drain Output    (MODE=01 TYPE=1 PUP=00)
-        ALTERNATE          = 16, ///Alternate function   (MODE=10 TYPE=0 PUP=00)
-        ALTERNATE_OD       = 20, ///Alternate Open Drain (MODE=10 TYPE=1 PUP=00)
+        INPUT_ANALOG           = 0b11000, ///Input Analog            (MODE=11 TYPE=0 PUP=00)
+        INPUT                  = 0b00000, ///Input Floating          (MODE=00 TYPE=0 PUP=00)
+        INPUT_PULL_UP          = 0b00001, ///Input PullUp            (MODE=00 TYPE=0 PUP=01)
+        INPUT_PULL_DOWN        = 0b00010, ///Input PullDown          (MODE=00 TYPE=0 PUP=10)
+        OUTPUT                 = 0b01000, ///Push Pull  Output       (MODE=01 TYPE=0 PUP=00)
+        OUTPUT_PULL_UP         = 0b01001, ///Push Pull  Output PU    (MODE=01 TYPE=0 PUP=01)
+        OUTPUT_PULL_DOWN       = 0b01010, ///Push Pull  Output PD    (MODE=01 TYPE=0 PUP=10)
+        OPEN_DRAIN             = 0b01100, ///Open Drain Output       (MODE=01 TYPE=1 PUP=00)
+        OPEN_DRAIN_PULL_UP     = 0b01101, ///Open Drain Output PU    (MODE=01 TYPE=1 PUP=01)
+        OPEN_DRAIN_PULL_DOWN   = 0b01110, ///Open Drain Output PD    (MODE=01 TYPE=1 PUP=10)
+        ALTERNATE              = 0b10000, ///Alternate function      (MODE=10 TYPE=0 PUP=00)
+        ALTERNATE_PULL_UP      = 0b10001, ///Alternate function PU   (MODE=10 TYPE=0 PUP=01)
+        ALTERNATE_PULL_DOWN    = 0b10010, ///Alternate function PD   (MODE=10 TYPE=0 PUP=10)
+        ALTERNATE_OD           = 0b10100, ///Alternate Open Drain    (MODE=10 TYPE=1 PUP=00)
+        ALTERNATE_OD_PULL_UP   = 0b10101, ///Alternate Open Drain PU (MODE=10 TYPE=1 PUP=01)
+        ALTERNATE_OD_PULL_DOWN = 0b10110, ///Alternate Open Drain PD (MODE=10 TYPE=1 PUP=10)
     };
 private:
     Mode(); //Just a wrapper class, disallow creating instances