diff --git a/ch32v003fun/ch32v003fun.h b/ch32v003fun/ch32v003fun.h index b65a5a22dd82026709ae97d6f7247cfdd6c8de94..d0d04e24c1a85bf35508347b70efdc0c46537c29 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 e788f786a9b79ec84b7d197bb038d632ab33fc4e..1922e090298b8a977fa290dec3301abf5e6d1cac 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 d6f3b21bf797ded079c71d8ae654ff7fe768d8ba..f6ab80da03a23810c40044bf33fff2a7fa6de9d7 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 ed3b92bbd40450be5a41e4b23a0d9b04a3bfce2b..8e7ad5fc96443dd4ad1c15fa474c088763830df7 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 4dc4264b84ff373c844baab8b40833dc4333f5fd..40aa3765c4317eccd70ca7b72d263c37f0142565 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