From a9ebd035a021c61bd0a562c9fddcd6aa83bcfd31 Mon Sep 17 00:00:00 2001
From: recallmenot <edmund.raile@proton.me>
Date: Mon, 26 Jun 2023 16:04:38 +0200
Subject: [PATCH] GPIO_branchless 2.0 STstyle pin references

---
 ch32v003fun/ch32v003fun.h                     |   9 +-
 examples/GPIO/GPIO.c                          |  88 +++++-------
 .../exti_pin_change_isr/exti_pin_change_isr.c |   2 +-
 examples/input_capture/input_capture.c        |   6 +-
 extralibs/ch32v003_GPIO_branchless.h          | 128 +++++++-----------
 5 files changed, 94 insertions(+), 139 deletions(-)

diff --git a/ch32v003fun/ch32v003fun.h b/ch32v003fun/ch32v003fun.h
index b65a5a2..d0d04e2 100644
--- a/ch32v003fun/ch32v003fun.h
+++ b/ch32v003fun/ch32v003fun.h
@@ -3345,15 +3345,14 @@ typedef enum
 /* Output Maximum frequency selection */
 typedef enum
 {
-    GPIO_Speed_10MHz = 1,
-    GPIO_Speed_2MHz,
-    GPIO_Speed_50MHz
+	GPIO_Speed_In,
+	GPIO_Speed_10MHz,
+	GPIO_Speed_2MHz,
+	GPIO_Speed_50MHz
 } GPIOSpeed_TypeDef;
 
 #endif
 
-#define GPIO_SPEED_IN 0
-
 #define GPIO_CNF_IN_ANALOG   0
 #define GPIO_CNF_IN_FLOATING 4
 #define GPIO_CNF_IN_PUPD     8
diff --git a/examples/GPIO/GPIO.c b/examples/GPIO/GPIO.c
index e788f78..1922e09 100644
--- a/examples/GPIO/GPIO.c
+++ b/examples/GPIO/GPIO.c
@@ -1,14 +1,14 @@
-// 2023-06-21 recallmenot
+// 2023-06-26 recallmenot
 
 #define DEMO_GPIO_blink					1
 #define DEMO_GPIO_blink_port				0
 #define DEMO_GPIO_out					0
 #define DEMO_GPIO_in_btn				0
-#define DEMO_ADC_bragraph				0
+#define DEMO_ADC_bargraph				0
 #define DEMO_PWM_dayrider				0
 
-#if ((DEMO_GPIO_blink + DEMO_GPIO_blink_port + DEMO_GPIO_out + DEMO_GPIO_in_btn + DEMO_ADC_bragraph + DEMO_PWM_dayrider) > 1 \
-  || (DEMO_GPIO_blink + DEMO_GPIO_blink_port + DEMO_GPIO_out + DEMO_GPIO_in_btn + DEMO_ADC_bragraph + DEMO_PWM_dayrider) < 1)
+#if ((DEMO_GPIO_blink + DEMO_GPIO_blink_port + DEMO_GPIO_out + DEMO_GPIO_in_btn + DEMO_ADC_bargraph + DEMO_PWM_dayrider) > 1 \
+  || (DEMO_GPIO_blink + DEMO_GPIO_blink_port + DEMO_GPIO_out + DEMO_GPIO_in_btn + DEMO_ADC_bargraph + DEMO_PWM_dayrider) < 1)
 #error "please enable ONE of the demos by setting it to 1 and the others to 0"
 #endif
 
@@ -31,12 +31,12 @@ int main() {
 	GPIO_port_enable(GPIO_port_C);
 	GPIO_port_enable(GPIO_port_D);
 	// GPIO D0 Push-Pull
-	GPIO_pinMode(GPIO_port_D, 0, GPIO_pinMode_O_pushPull, GPIO_Speed_10MHz);
+	GPIO_pinMode(GPIOv_from_PORT_PIN(GPIO_port_D, 0), GPIO_pinMode_O_pushPull, GPIO_Speed_10MHz);
 	// GPIO D4 Push-Pull
 	// P function suffix allows to specify port and pin in one parameter
-	GPIO_pinModeP(GPIO_pin_D4, GPIO_pinMode_O_pushPull, GPIO_Speed_10MHz);
+	GPIO_pinMode(GPIOv_from_PORT_PIN(GPIO_port_D, 4), GPIO_pinMode_O_pushPull, GPIO_Speed_10MHz);
 	// GPIO C0 Push-Pull
-	GPIO_pinMode(GPIO_port_C, 0, GPIO_pinMode_O_pushPull, GPIO_Speed_10MHz);
+	GPIO_pinMode(GPIOv_from_PORT_PIN(GPIO_port_C, 0), GPIO_pinMode_O_pushPull, GPIO_Speed_10MHz);
 #elif DEMO_GPIO_blink_port == 1
 	GPIO_port_enable(GPIO_port_C);
 	GPIO_port_pinMode(GPIO_port_C, GPIO_pinMode_O_pushPull, GPIO_Speed_10MHz);
@@ -44,55 +44,41 @@ int main() {
 	GPIO_port_enable(GPIO_port_C);
 	GPIO_port_enable(GPIO_port_D);
 	// GPIO D4 Push-Pull
-	GPIO_pinMode(GPIO_port_D, 4, GPIO_pinMode_O_pushPull, GPIO_Speed_10MHz);
+	GPIO_pinMode(GPIOv_from_PORT_PIN(GPIO_port_D, 4), GPIO_pinMode_O_pushPull, GPIO_Speed_10MHz);
 	// GPIO C0 - C7 Push-Pull
 	GPIO_port_pinMode(GPIO_port_C, GPIO_pinMode_O_pushPull, GPIO_Speed_10MHz);
 	/* faster & lighter than
 	for (int i = 0; i <= 7; i++) {
-		GPIO_pinMode(GPIO_port_C, i, GPIO_pinMode_O_pushPull, GPIO_Speed_10MHz);
+		GPIO_pinMode(GPIOv_from_PORT_PIN(GPIO_port_C, i), GPIO_pinMode_O_pushPull, GPIO_Speed_10MHz);
 	}
 	*/
 #elif DEMO_GPIO_in_btn == 1
 	GPIO_port_enable(GPIO_port_C);
 	GPIO_port_enable(GPIO_port_D);
-	// GPIO D4 Push-Pull
-	GPIO_pinMode(GPIO_port_D, 3, GPIO_pinMode_I_pullUp, GPIO_SPEED_IN);
+	// GPIO D3 Push-Pull
+	GPIO_pinMode(GPIOv_from_PORT_PIN(GPIO_port_D, 3), GPIO_pinMode_I_pullUp, GPIO_Speed_In);
 	// GPIO C0 - C7 Push-Pull
 	GPIO_port_pinMode(GPIO_port_C, GPIO_pinMode_O_pushPull, GPIO_Speed_10MHz);
-	/* faster & lighter than
-	for (int i = 0; i <= 7; i++) {
-		GPIO_pinMode(GPIO_port_C, i, GPIO_pinMode_O_pushPull, GPIO_Speed_10MHz);
-	}
-	*/
-#elif DEMO_ADC_bragraph == 1
+#elif DEMO_ADC_bargraph == 1
 	GPIO_port_enable(GPIO_port_C);
 	GPIO_port_enable(GPIO_port_D);
 	// GPIO D4 Push-Pull
-	GPIO_pinMode(GPIO_port_D, 4, GPIO_pinMode_O_pushPull, GPIO_Speed_10MHz);
+	GPIO_pinMode(GPIOv_from_PORT_PIN(GPIO_port_D, 4), GPIO_pinMode_O_pushPull, GPIO_Speed_10MHz);
 	// GPIO D6 analog in
-	GPIO_pinMode(GPIO_port_D, 6, GPIO_pinMode_I_analog, GPIO_SPEED_IN);
+	GPIO_pinMode(GPIOv_from_PORT_PIN(GPIO_port_D, 6), GPIO_pinMode_I_analog, GPIO_Speed_In);
 	// GPIO C0 - C7 Push-Pull
 	GPIO_port_pinMode(GPIO_port_C, GPIO_pinMode_O_pushPull, GPIO_Speed_10MHz);
-	/* faster & lighter than
-	for (int i = 0; i <= 7; i++) {
-		GPIO_pinMode(GPIO_port_C, i, GPIO_pinMode_O_pushPull, GPIO_Speed_10MHz);
-	}
-	*/
 	GPIO_ADCinit();
 #elif DEMO_PWM_dayrider == 1
 	//SetupUART( UART_BRR );
 	GPIO_port_enable(GPIO_port_C);
 	GPIO_port_enable(GPIO_port_D);
 	// GPIO D4 Push-Pull
-	GPIO_pinMode(GPIO_port_D, 4, GPIO_pinMode_O_pushPull, GPIO_Speed_10MHz);
+	GPIO_pinMode(GPIOv_from_PORT_PIN(GPIO_port_D, 4), GPIO_pinMode_O_pushPull, GPIO_Speed_10MHz);
 	// GPIO D6 analog in
-	GPIO_pinMode(GPIO_port_D, 6, GPIO_pinMode_I_analog, GPIO_SPEED_IN);
+	GPIO_pinMode(GPIOv_from_PORT_PIN(GPIO_port_D, 6), GPIO_pinMode_I_analog, GPIO_Speed_In);
 	// GPIO C0 - C7 Push-Pull
-	/* faster & lighter than
-	for (int i = 0; i <= 7; i++) {
-		GPIO_pinMode(GPIO_port_C, i, GPIO_pinMode_O_pushPull, GPIO_Speed_10MHz);
-	}
-	*/
+	GPIO_port_pinMode(GPIO_port_C, GPIO_pinMode_O_pushPullMux, GPIO_Speed_10MHz);
 	GPIO_tim2_map(GPIO_tim2_output_set_1__C5_C2_D2_C1);
 	GPIO_tim2_init();
 	GPIO_tim2_enableCH(4);
@@ -108,15 +94,15 @@ int main() {
 
 	while (1) {
 #if DEMO_GPIO_blink == 1
-		GPIO_digitalWrite(GPIO_port_D, 0, high);
+		GPIO_digitalWrite(GPIOv_from_PORT_PIN(GPIO_port_D, 0), high);
 		// P function suffix allows to specify port and pin in one parameter
-		GPIO_digitalWriteP(GPIO_pin_D4, high);
-		GPIO_digitalWrite(GPIO_port_C, 0, high);
+		GPIO_digitalWrite(GPIOv_from_PORT_PIN(GPIO_port_D, 4), high);
+		GPIO_digitalWrite(GPIOv_from_PORT_PIN(GPIO_port_C, 0), high);
 		Delay_Ms( 250 );
-		GPIO_digitalWrite(GPIO_port_D, 0, low);
+		GPIO_digitalWrite(GPIOv_from_PORT_PIN(GPIO_port_D, 0), low);
 		// P function suffix allows to specify port and pin in one parameter
-		GPIO_digitalWriteP(GPIO_pin_D4, low);
-		GPIO_digitalWrite(GPIO_port_C, 0, low);
+		GPIO_digitalWrite(GPIOv_from_PORT_PIN(GPIO_port_D, 4), low);
+		GPIO_digitalWrite(GPIOv_from_PORT_PIN(GPIO_port_C, 0), low);
 		Delay_Ms( 250 );
 #elif DEMO_GPIO_blink_port == 1
 		GPIO_port_digitalWrite(GPIO_port_C, 0b11111111);
@@ -128,20 +114,20 @@ int main() {
 		GPIO_port_digitalWrite(GPIO_port_C, 0b01010101);
 		Delay_Ms( 250 );
 #elif DEMO_GPIO_out == 1
-		GPIO_digitalWrite(GPIO_port_D, 4, low);
+		GPIO_digitalWrite(GPIOv_from_PORT_PIN(GPIO_port_D, 4), low);
 		Delay_Ms(1000);
-		GPIO_digitalWrite(GPIO_port_D, 4, high);
+		GPIO_digitalWrite(GPIOv_from_PORT_PIN(GPIO_port_D, 4), high);
 		Delay_Ms(250);
 		for (int i = 0; i <= 7; i++) {
-			GPIO_digitalWrite_hi(GPIO_port_C, i);
+			GPIO_digitalWrite_hi(GPIOv_from_PORT_PIN(GPIO_port_C, i));
 			Delay_Ms(50);
 		}
 		for (int i = 7; i >= 0; i--) {
-			GPIO_digitalWrite_lo(GPIO_port_C, i);
+			GPIO_digitalWrite_lo(GPIOv_from_PORT_PIN(GPIO_port_C, i));
 			Delay_Ms(50);
 		}
 #elif DEMO_GPIO_in_btn == 1
-		uint8_t button_is_pressed = !GPIO_digitalRead(GPIO_port_D, 3);
+		uint8_t button_is_pressed = !GPIO_digitalRead(GPIOv_from_PORT_PIN(GPIO_port_D, 3));
 		static uint8_t leds_to_turn_on;
 		if (button_is_pressed && leds_to_turn_on < 8) {
 			leds_to_turn_on++;
@@ -152,16 +138,16 @@ int main() {
 		uint8_t led_i = 0;
 		for (int i = 0; i<= 7; i++) {
 			if (led_i < leds_to_turn_on) {
-				GPIO_digitalWrite_hi(GPIO_port_C, i);
+				GPIO_digitalWrite_hi(GPIOv_from_PORT_PIN(GPIO_port_C, i));
 			}
 			else {
-				GPIO_digitalWrite_lo(GPIO_port_C, i);
+				GPIO_digitalWrite_lo(GPIOv_from_PORT_PIN(GPIO_port_C, i));
 			}
 			led_i++;
 		}
 		Delay_Ms(50);
-#elif DEMO_ADC_bragraph == 1
-		GPIO_digitalWrite(GPIO_port_D, 4, high);
+#elif DEMO_ADC_bargraph == 1
+		GPIO_digitalWrite(GPIOv_from_PORT_PIN(GPIO_port_D, 4), high);
 		uint16_t analog_result = GPIO_analogRead(GPIO_Ain6_D6);
 		analog_result = analog_result > 10 ?
 				(analog_result < ((1 << 10) - 42) ? analog_result + 42 : (1 << 10))
@@ -170,20 +156,20 @@ int main() {
 		uint8_t led_i = 0;
 		for (int i = 0; i<= 7; i++) {
 			if (led_i < leds_to_turn_on) {
-				GPIO_digitalWrite_hi(GPIO_port_C, i);
+				GPIO_digitalWrite_hi(GPIOv_from_PORT_PIN(GPIO_port_C, i));
 			}
 			else {
-				GPIO_digitalWrite_lo(GPIO_port_C, i);
+				GPIO_digitalWrite_lo(GPIOv_from_PORT_PIN(GPIO_port_C, i));
 			}
 			led_i++;
 		}
-		GPIO_digitalWrite(GPIO_port_D, 4, low);
+		GPIO_digitalWrite(GPIOv_from_PORT_PIN(GPIO_port_D, 4), low);
 		Delay_Ms(50);
 #elif DEMO_PWM_dayrider == 1
 		#define NUMLEDS		5
 		#define TICKS_NEXT	149			// lower = faster scanning
 		#define TICK_i		2143			// lower = faster fade-out
-		GPIO_digitalWrite(GPIO_port_D, 4, high);
+		GPIO_digitalWrite(GPIOv_from_PORT_PIN(GPIO_port_D, 4), high);
 		static uint8_t led_focus = 0;
 		static uint8_t direction = 0;
 
@@ -218,7 +204,7 @@ int main() {
 		GPIO_tim1_analogWrite(3, led_PW[2]);
 		GPIO_tim1_analogWrite(4, led_PW[3]);
 		GPIO_tim2_analogWrite(1, led_PW[4]);
-		GPIO_digitalWrite(GPIO_port_D, 4, low);
+		GPIO_digitalWrite(GPIOv_from_PORT_PIN(GPIO_port_D, 4), low);
 		tick++;
 		Delay_Us(TICK_i);
 #endif
diff --git a/examples/exti_pin_change_isr/exti_pin_change_isr.c b/examples/exti_pin_change_isr/exti_pin_change_isr.c
index d6f3b21..f6ab80d 100644
--- a/examples/exti_pin_change_isr/exti_pin_change_isr.c
+++ b/examples/exti_pin_change_isr/exti_pin_change_isr.c
@@ -57,7 +57,7 @@ int main()
 	// GPIO D3 for input pin change.
 	GPIOD->CFGLR =
 		(GPIO_CNF_IN_PUPD)<<(4*1) |  // Keep SWIO enabled.
-		(GPIO_SPEED_IN | GPIO_CNF_IN_PUPD)<<(4*3);  //PD4 = GPIOD IN
+		(GPIO_Speed_In | GPIO_CNF_IN_PUPD)<<(4*3);  //PD4 = GPIOD IN
 
 	// GPIO C0 Push-Pull (our output) 
 	GPIOC->CFGLR =
diff --git a/examples/input_capture/input_capture.c b/examples/input_capture/input_capture.c
index ed3b92b..8e7ad5f 100644
--- a/examples/input_capture/input_capture.c
+++ b/examples/input_capture/input_capture.c
@@ -70,8 +70,8 @@ int main()
 
 	// GPIO D0, D4 Push-Pull LEDs, D1/SWIO floating, D2 Capture Input(T1CH1), default analog input
 	GPIOD->CFGLR = ((GPIO_Speed_10MHz | GPIO_CNF_OUT_PP) << (4 * 0)) | 
-				   ((GPIO_SPEED_IN | GPIO_CNF_IN_FLOATING) << (4 * 1)) | 
-				   ((GPIO_SPEED_IN | GPIO_CNF_IN_FLOATING) << (4 * 2)) | 
+				   ((GPIO_Speed_In | GPIO_CNF_IN_FLOATING) << (4 * 1)) | 
+				   ((GPIO_Speed_In | GPIO_CNF_IN_FLOATING) << (4 * 2)) | 
 				   ((GPIO_Speed_10MHz | GPIO_CNF_OUT_PP) << (4 * 4));
 
 	TIM1->ATRLR = 0xffff;
@@ -106,4 +106,4 @@ int main()
 		GPIOD->BSHR = 1<<16 | 1<<4;
 		Delay_Ms(1);
 	}
-}
\ No newline at end of file
+}
diff --git a/extralibs/ch32v003_GPIO_branchless.h b/extralibs/ch32v003_GPIO_branchless.h
index 4dc4264..40aa376 100644
--- a/extralibs/ch32v003_GPIO_branchless.h
+++ b/extralibs/ch32v003_GPIO_branchless.h
@@ -1,4 +1,4 @@
-// 2023-06-07 recallmenot
+// 2023-06-26 recallmenot
 
 //######## necessities
 
@@ -32,16 +32,18 @@ digitalWrite_lo
 digitalWrite_hi
 digitalRead
 
-additionally, there are functions to operate on an entire port at once
+pins are referenced as a single byte, ST-style:
+the upper 4 bytes specify the port, where A is 0, C is 2 etc.
+the lower 4 bytes specify the pin
+both are used as uint4_t, not as 4 individual bits, allowing to address up to 16 pins on up to 16 ports.
+this style of referencing a pin is called "GPIOv" in this library.
+
+additionally, there are functions to operate an entire port at once
 this can be useful where setting all pins one by one would be too inefficient / unnecessary
-an example: https://www.youtube.com/watch?v=cy6o8TrDUFU
+an example where this may be useful: https://www.youtube.com/watch?v=cy6o8TrDUFU
 GPIO_port_digitalWrite
 GPIO_port_digitalRead
 
-function variants with the `P` suffix take a GPIO_pin_Pn instead of a combination of GPIO_port_P and pin number n
-example:
-`GPIO_port_D, 4` becomes `GPIO_pin_D4` when using the function with the `P` suffix
-
 
 
 analog-to-digital usage is almost Arduino-like:
@@ -100,34 +102,14 @@ Writing `TIMx->SWEVGR |= TIM_UG` will immediately update the shadow register and
 
 //######## ports, pins and states: use these for the functions below!
 
+#define GPIOv_from_PORT_PIN( GPIO_port_n, pin )
+
 enum GPIO_port_n {
 	GPIO_port_A = 0b00,
 	GPIO_port_C = 0b10,
 	GPIO_port_D = 0b11,
 };
 
-// pin synonyms, use is not mandatory, you can either use
-// 	these with the *P functions or
-// 	specify "GPIO_port_n, N" with the regular functions
-#define GPIO_pin_A1	GPIO_port_A, 1
-#define GPIO_pin_A2	GPIO_port_A, 2
-#define GPIO_pin_C0	GPIO_port_C, 0
-#define GPIO_pin_C1	GPIO_port_C, 1
-#define GPIO_pin_C2	GPIO_port_C, 2
-#define GPIO_pin_C3	GPIO_port_C, 3
-#define GPIO_pin_C4	GPIO_port_C, 4
-#define GPIO_pin_C5	GPIO_port_C, 5
-#define GPIO_pin_C6	GPIO_port_C, 6
-#define GPIO_pin_C7	GPIO_port_C, 7
-#define GPIO_pin_D0	GPIO_port_D, 0
-#define GPIO_pin_D1	GPIO_port_D, 1
-#define GPIO_pin_D2	GPIO_port_D, 2
-#define GPIO_pin_D3	GPIO_port_D, 3
-#define GPIO_pin_D4	GPIO_port_D, 4
-#define GPIO_pin_D5	GPIO_port_D, 5
-#define GPIO_pin_D6	GPIO_port_D, 6
-#define GPIO_pin_D7	GPIO_port_D, 7
-
 enum GPIO_pinModes {
 	GPIO_pinMode_I_floating,
 	GPIO_pinMode_I_pullUp,
@@ -192,19 +174,13 @@ enum GPIO_tim2_output_sets {
 // setup
 #define GPIO_port_enable(GPIO_port_n)
 #define GPIO_pinMode(GPIO_port_n, pin, pinMode, GPIO_Speed)
-#define GPIO_pinModeP(GPIO_pin_Pn, pinMode, GPIO_Speed)
 
 // digital
-#define GPIO_digitalWrite_hi(GPIO_port_n, pin)
-#define GPIO_digitalWrite_hiP(GPIO_pin_Pn)
-#define GPIO_digitalWrite_lo(GPIO_port_n, pin)
-#define GPIO_digitalWrite_loP(GPIO_pin_Pn)
-#define GPIO_digitalWrite(GPIO_port_n, pin, lowhigh)
-#define GPIO_digitalWriteP(GPIO_pin_Pn, lowhigh)
-#define GPIO_digitalWrite_branching(GPIO_port_n, pin, lowhigh)
-#define GPIO_digitalWrite_branchingP(GPIO_pin_Pn, lowhigh)
-#define GPIO_digitalRead(GPIO_port_n, pin)
-#define GPIO_digitalReadP(GPIO_pin_Pn)
+#define GPIO_digitalWrite_hi(GPIOv)
+#define GPIO_digitalWrite_lo(GPIOv)
+#define GPIO_digitalWrite(GPIOv, lowhigh)
+#define GPIO_digitalWrite_branching(GPIOv, lowhigh)
+#define GPIO_digitalRead(GPIOv)
 #define GPIO_port_digitalWrite(GPIO_port_n, byte)
 #define GPIO_port_digitalRead(GPIO_port_n)
 
@@ -241,6 +217,12 @@ static inline void GPIO_tim2_init();
 #define CONCAT(a, b) a ## b
 #define CONCAT_INDIRECT(a, b) CONCAT(a, b)
 
+#undef GPIOv_from_PORT_PIN
+#define GPIOv_from_PORT_PIN( GPIO_port_n, pin )		((GPIO_port_n << 4 ) | (pin))
+#define GPIOv_to_PORT( GPIOv )				(GPIOv >> 4 )
+#define GPIOv_to_PIN( GPIOv )				(GPIOv & 0b1111)
+#define GPIOv_to_GPIObase( GPIOv )			((GPIO_TypeDef*)(uintptr_t)((GPIOA_BASE + (0x400 * (GPIOv >> 4)))))
+
 #define GPIOx_to_port_n2(GPIOx)				GPIOx_to_port_n_##GPIOx
 #define GPIOx_to_port_n(GPIOx)				GPIOx_to_port_n2(GPIOx)
 #define GPIOx_to_port_n_GPIO_port_A			0b00
@@ -261,25 +243,25 @@ static inline void GPIO_tim2_init();
 
 #define GPIO_pinMode_to_CFG2(GPIO_pinMode, GPIO_Speed)				GPIO_pinMode_to_CFG_##GPIO_pinMode(GPIO_Speed)
 #define GPIO_pinMode_to_CFG(GPIO_pinMode, GPIO_Speed)				GPIO_pinMode_to_CFG2(GPIO_pinMode, GPIO_Speed)
-#define GPIO_pinMode_to_CFG_GPIO_pinMode_I_floating(GPIO_Speed)			(GPIO_SPEED_IN	| GPIO_CNF_IN_FLOATING)
-#define GPIO_pinMode_to_CFG_GPIO_pinMode_I_pullUp(GPIO_Speed)			(GPIO_SPEED_IN	| GPIO_CNF_IN_PUPD)
-#define GPIO_pinMode_to_CFG_GPIO_pinMode_I_pullDown(GPIO_Speed)			(GPIO_SPEED_IN	| GPIO_CNF_IN_PUPD)
-#define GPIO_pinMode_to_CFG_GPIO_pinMode_I_analog(GPIO_Speed)			(GPIO_SPEED_IN	| GPIO_CNF_IN_ANALOG)
+#define GPIO_pinMode_to_CFG_GPIO_pinMode_I_floating(GPIO_Speed)			(GPIO_Speed_In	| GPIO_CNF_IN_FLOATING)
+#define GPIO_pinMode_to_CFG_GPIO_pinMode_I_pullUp(GPIO_Speed)			(GPIO_Speed_In	| GPIO_CNF_IN_PUPD)
+#define GPIO_pinMode_to_CFG_GPIO_pinMode_I_pullDown(GPIO_Speed)			(GPIO_Speed_In	| GPIO_CNF_IN_PUPD)
+#define GPIO_pinMode_to_CFG_GPIO_pinMode_I_analog(GPIO_Speed)			(GPIO_Speed_In	| GPIO_CNF_IN_ANALOG)
 #define GPIO_pinMode_to_CFG_GPIO_pinMode_O_pushPull(GPIO_Speed)			(GPIO_Speed	| GPIO_CNF_OUT_PP)
 #define GPIO_pinMode_to_CFG_GPIO_pinMode_O_openDrain(GPIO_Speed)		(GPIO_Speed	| GPIO_CNF_OUT_OD)
 #define GPIO_pinMode_to_CFG_GPIO_pinMode_O_pushPullMux(GPIO_Speed)		(GPIO_Speed	| GPIO_CNF_OUT_PP_AF)
 #define GPIO_pinMode_to_CFG_GPIO_pinMode_O_openDrainMux(GPIO_Speed)		(GPIO_Speed	| GPIO_CNF_IN_ANALOG)
 
-#define GPIO_pinMode_set_PUPD2(GPIO_pinMode, GPIO_port_n, pin)			GPIO_pinMode_set_PUPD_##GPIO_pinMode(GPIO_port_n, pin)
-#define GPIO_pinMode_set_PUPD(GPIO_pinMode, GPIO_port_n, pin)			GPIO_pinMode_set_PUPD2(GPIO_pinMode, GPIO_port_n, pin)
-#define GPIO_pinMode_set_PUPD_GPIO_pinMode_I_floating(GPIO_port_n, pin)
-#define GPIO_pinMode_set_PUPD_GPIO_pinMode_I_pullUp(GPIO_port_n, pin)		GPIO_port_n_to_GPIOx(GPIO_port_n)->BSHR = (1 << pin)
-#define GPIO_pinMode_set_PUPD_GPIO_pinMode_I_pullDown(GPIO_port_n, pin)		GPIO_port_n_to_GPIOx(GPIO_port_n)->BSHR = (1 << (pin + 16))
-#define GPIO_pinMode_set_PUPD_GPIO_pinMode_I_analog(GPIO_port_n, pin)
-#define GPIO_pinMode_set_PUPD_GPIO_pinMode_O_pushPull(GPIO_port_n, pin)
-#define GPIO_pinMode_set_PUPD_GPIO_pinMode_O_openDrain(GPIO_port_n, pin)
-#define GPIO_pinMode_set_PUPD_GPIO_pinMode_O_pushPullMux(GPIO_port_n, pin)
-#define GPIO_pinMode_set_PUPD_GPIO_pinMode_O_openDrainMux(GPIO_port_n, pin)
+#define GPIO_pinMode_set_PUPD2(GPIO_pinMode, GPIOv)				GPIO_pinMode_set_PUPD_##GPIO_pinMode(GPIOv)
+#define GPIO_pinMode_set_PUPD(GPIO_pinMode, GPIOv)				GPIO_pinMode_set_PUPD2(GPIO_pinMode, GPIOv)
+#define GPIO_pinMode_set_PUPD_GPIO_pinMode_I_floating(GPIOv)
+#define GPIO_pinMode_set_PUPD_GPIO_pinMode_I_pullUp(GPIOv)			GPIOv_to_GPIObase(GPIOv)->BSHR = (1 << GPIOv_to_PIN(GPIOv))
+#define GPIO_pinMode_set_PUPD_GPIO_pinMode_I_pullDown(GPIOv)			GPIOv_to_GPIObase(GPIOv)->BSHR = (1 << (GPIOv_to_PIN(GPIOv) + 16))
+#define GPIO_pinMode_set_PUPD_GPIO_pinMode_I_analog(GPIOv)
+#define GPIO_pinMode_set_PUPD_GPIO_pinMode_O_pushPull(GPIOv)
+#define GPIO_pinMode_set_PUPD_GPIO_pinMode_O_openDrain(GPIOv)
+#define GPIO_pinMode_set_PUPD_GPIO_pinMode_O_pushPullMux(GPIOv)
+#define GPIO_pinMode_set_PUPD_GPIO_pinMode_O_openDrainMux(GPIOv)
 
 #define GPIO_port_pinMode_set_PUPD2(GPIO_pinMode, GPIO_port_n)			GPIO_port_pinMode_set_PUPD_##GPIO_pinMode(GPIO_port_n)
 #define GPIO_port_pinMode_set_PUPD(GPIO_pinMode, GPIO_port_n)			GPIO_port_pinMode_set_PUPD2(GPIO_pinMode, GPIO_port_n)
@@ -345,41 +327,29 @@ static inline void GPIO_tim2_init();
 #define GPIO_port_digitalRead(GPIO_port_n)		(GPIO_port_n_to_GPIOx(GPIO_port_n)->INDR & 0b11111111)
 
 #undef GPIO_pinMode
-#define GPIO_pinMode(GPIO_port_n, pin, pinMode, GPIO_Speed) ({							\
-	GPIO_port_n_to_GPIOx(GPIO_port_n)->CFGLR &= ~(0b1111 << (4 * pin));					\
-	GPIO_port_n_to_GPIOx(GPIO_port_n)->CFGLR |= (GPIO_pinMode_to_CFG(pinMode, GPIO_Speed) << (4 * pin));	\
-	GPIO_pinMode_set_PUPD(pinMode, GPIO_port_n, pin);							\
+#define GPIO_pinMode(GPIOv, pinMode, GPIO_Speed) ({									\
+	GPIOv_to_GPIObase(GPIOv)->CFGLR &= ~(0b1111 << (4 * GPIOv_to_PIN(GPIOv)));					\
+	GPIOv_to_GPIObase(GPIOv)->CFGLR |= (GPIO_pinMode_to_CFG(pinMode, GPIO_Speed) << (4 * GPIOv_to_PIN(GPIOv)));	\
+	GPIO_pinMode_set_PUPD(pinMode, GPIOv);										\
 })
-#undef GPIO_pinModeP
-#define GPIO_pinModeP(GPIO_pin_Pn, pinMode, GPIO_Speed)			GPIO_pinMode(GPIO_pin_Pn, pinMode, GPIO_Speed)
 
 #undef GPIO_digitalWrite_hi
-#define GPIO_digitalWrite_hi(GPIO_port_n, pin)				GPIO_port_n_to_GPIOx(GPIO_port_n)->BSHR = (1 << pin)
-#undef GPIO_digitalWrite_hiP
-#define GPIO_digitalWrite_hiP(GPIO_pin_Pn)				GPIO_digitalWrite_hi(GPIO_pin_Pn)
+#define GPIO_digitalWrite_hi(GPIOv)					GPIOv_to_GPIObase(GPIOv)->BSHR = (1 << GPIOv_to_PIN(GPIOv))
 #undef GPIO_digitalWrite_lo
-#define GPIO_digitalWrite_lo(GPIO_port_n, pin)				GPIO_port_n_to_GPIOx(GPIO_port_n)->BSHR = (1 << (pin + 16))
-#undef GPIO_digitalWrite_loP
-#define GPIO_digitalWrite_loP(GPIO_pin_Pn)				GPIO_digitalWrite_lo(GPIO_pin_Pn)
+#define GPIO_digitalWrite_lo(GPIOv)					GPIOv_to_GPIObase(GPIOv)->BSHR = (1 << (16 + GPIOv_to_PIN(GPIOv)))
 
 #undef GPIO_digitalWrite
-#define GPIO_digitalWrite(GPIO_port_n, pin, lowhigh)			GPIO_digitalWrite_##lowhigh(GPIO_port_n, pin)
-#undef GPIO_digitalWriteP
-#define GPIO_digitalWriteP(GPIO_pin_Pn, lowhigh)			GPIO_digitalWrite(GPIO_pin_Pn, lowhigh)
-#define GPIO_digitalWrite_low(GPIO_port_n, pin)				GPIO_digitalWrite_lo(GPIO_port_n, pin)
-#define GPIO_digitalWrite_0(GPIO_port_n, pin)				GPIO_digitalWrite_lo(GPIO_port_n, pin)
-#define GPIO_digitalWrite_high(GPIO_port_n, pin)			GPIO_digitalWrite_hi(GPIO_port_n, pin)
-#define GPIO_digitalWrite_1(GPIO_port_n, pin)				GPIO_digitalWrite_hi(GPIO_port_n, pin)
+#define GPIO_digitalWrite(GPIOv, lowhigh)				GPIO_digitalWrite_##lowhigh(GPIOv)
+#define GPIO_digitalWrite_low(GPIOv)					GPIO_digitalWrite_lo(GPIOv)
+#define GPIO_digitalWrite_0(GPIOv)					GPIO_digitalWrite_lo(GPIOv)
+#define GPIO_digitalWrite_high(GPIOv)					GPIO_digitalWrite_hi(GPIOv)
+#define GPIO_digitalWrite_1(GPIOv)					GPIO_digitalWrite_hi(GPIOv)
 
 #undef GPIO_digitalWrite_branching
-#define GPIO_digitalWrite_branching(GPIO_port_n, pin, lowhigh)		(lowhigh ? GPIO_digitalWrite_hi(GPIO_port_n, pin) : GPIO_digitalWrite_lo(GPIO_port_n, pin))
-#undef GPIO_digitalWrite_branchingP
-#define GPIO_digitalWrite_branchingP(GPIO_pin_Pn, lowhigh)		GPIO_digitalWrite_branching(GPIO_pin_Pn, lowhigh)
+#define GPIO_digitalWrite_branching(GPIOv, lowhigh)			(lowhigh ? GPIO_digitalWrite_hi(GPIOv) : GPIO_digitalWrite_lo(GPIOv))
 
 #undef GPIO_digitalRead
-#define GPIO_digitalRead(GPIO_port_n, pin)	 			((GPIO_port_n_to_GPIOx(GPIO_port_n)->INDR >> pin) & 0b1)
-#undef GPIO_digitalReadP
-#define GPIO_digitalReadP(GPIO_pin_Pn)			 		GPIO_digitalRead(GPIO_pin_Pn)
+#define GPIO_digitalRead(GPIOv)			 			((GPIOv_to_GPIObase(GPIOv)->INDR >> GPIOv_to_PIN(GPIOv)) & 0b1)
 
 #undef GPIO_ADC_set_sampletime
 // 0:7 => 3/9/15/30/43/57/73/241 cycles
-- 
GitLab