diff --git a/ch32v003fun/ch32v003fun.h b/ch32v003fun/ch32v003fun.h index 6a2d6ef4ba84ee12b9e51a492d06d8206db63e74..dfd5e4efb75f67f3e2d4fe9fb62a0bca8e3d5403 100644 --- a/ch32v003fun/ch32v003fun.h +++ b/ch32v003fun/ch32v003fun.h @@ -3384,15 +3384,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 d8313bb59dcda5096a65c01197e40fb1a3cf3e12..0596daa33d3ac3e62405886916eb7e3e19281ebb 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 @@ -27,12 +27,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); @@ -40,55 +40,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); @@ -104,15 +90,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); @@ -124,20 +110,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++; @@ -148,16 +134,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)) @@ -166,20 +152,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; @@ -214,7 +200,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/GPIO/funconfig.h b/examples/GPIO/funconfig.h index 16f4a824105f00c458bd8bf390a3e4ca79dfb7e8..820e1f0cb7f25f390febfc96ec5cb77fc281e984 100644 --- a/examples/GPIO/funconfig.h +++ b/examples/GPIO/funconfig.h @@ -5,4 +5,3 @@ #define CH32V003 1 #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 c5efa07bc714300782d11a13e521e52875f77460..6e391475b98e099a684cdaf87ff78024b6ea5ed6 100644 --- a/examples/exti_pin_change_isr/exti_pin_change_isr.c +++ b/examples/exti_pin_change_isr/exti_pin_change_isr.c @@ -52,7 +52,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 f36522ee895d1a4da2402634eed35261c094aea7..8d4048c8773723a0d1540d63cc1e8b73cd0c33aa 100644 --- a/examples/input_capture/input_capture.c +++ b/examples/input_capture/input_capture.c @@ -65,8 +65,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; 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