From ac51d0cae10d0c6be164e0e8f2028b30ed2269c7 Mon Sep 17 00:00:00 2001 From: KLASSENTS Date: Fri, 14 Mar 2025 11:17:47 +0700 Subject: [PATCH] =?UTF-8?q?=D0=B2=D1=81=D0=BF=D0=BE=D0=BC=D0=BE=D0=B3?= =?UTF-8?q?=D0=B0=D1=82=D0=B5=D0=BB=D1=8C=D0=BD=D1=8B=D0=B5=20=D1=84=D1=83?= =?UTF-8?q?=D0=BD=D0=BA=D1=86=D0=B8=D0=B8=20=D0=B8=20=D1=84=D1=83=D0=BD?= =?UTF-8?q?=D0=BA=D1=86=D0=B8=D0=B8=20digital=20=D0=B2=D1=8B=D0=BD=D0=B5?= =?UTF-8?q?=D1=81=D0=B5=D0=BD=D1=8B=20=D0=B2=20ram=20=D0=B4=D0=BB=D1=8F=20?= =?UTF-8?q?=D1=83=D0=B2=D0=B5=D0=BB=D0=B8=D1=87=D0=B5=D0=BD=D0=B8=D1=8F=20?= =?UTF-8?q?=D0=B1=D1=8B=D1=81=D1=82=D1=80=D0=BE=D0=B4=D0=B5=D0=B9=D1=81?= =?UTF-8?q?=D1=82=D0=B2=D0=B8=D1=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- cores/arduino/wiring_digital.c | 24 +++++------ variants/elbear_ace_uno/pins_arduino.h | 58 ++------------------------ variants/elbear_ace_uno/variant.c | 55 ++++++++++++++++++++++++ 3 files changed, 69 insertions(+), 68 deletions(-) diff --git a/cores/arduino/wiring_digital.c b/cores/arduino/wiring_digital.c index a650607..7c678ef 100644 --- a/cores/arduino/wiring_digital.c +++ b/cores/arduino/wiring_digital.c @@ -95,7 +95,7 @@ void fastPinMode(uint32_t PinNumber, uint32_t PinMode) } // write pin -void digitalWrite(uint32_t PinNumber, uint32_t Val) +__attribute__((noinline, section(".ram_text"))) void digitalWrite(uint32_t PinNumber, uint32_t Val) { if ((PinNumber>=pinCommonQty())) { @@ -103,50 +103,46 @@ void digitalWrite(uint32_t PinNumber, uint32_t Val) return; } - GPIO_TypeDef* port = digitalPinToPort(PinNumber); - HAL_PinsTypeDef pin = digitalPinToBitMask(PinNumber); - if (digitalPinPwmIsOn(PinNumber)) // if the pin can use PWM, disable PWM analogWriteStop(PinNumber); if (Val == HIGH) - GPIO_SET_PIN(port, pin); + GPIO_SET_PIN(digitalPinToPort(PinNumber), digitalPinToBitMask(PinNumber)); else - GPIO_CLEAR_PIN(port, pin); + GPIO_CLEAR_PIN(digitalPinToPort(PinNumber), digitalPinToBitMask(PinNumber)); } // read pin -int digitalRead(uint32_t PinNumber) +__attribute__((noinline, section(".ram_text"))) int digitalRead(uint32_t PinNumber) { if ((PinNumber>=pinCommonQty())) { ErrorMsgHandler("digitalRead(): pin number exceeds the total number of pins"); return -1; } - GPIO_TypeDef* port = digitalPinToPort(PinNumber); - HAL_PinsTypeDef pin = digitalPinToBitMask(PinNumber); if (digitalPinPwmIsOn(PinNumber)) // if the pin can use PWM, disable PWM analogWriteStop(PinNumber); - return GPIO_READ_PIN(port, pin); + return GPIO_READ_PIN(digitalPinToPort(PinNumber), digitalPinToBitMask(PinNumber)); } // toggle pin -void digitalToggle(uint32_t PinNumber) +__attribute__((noinline, section(".ram_text"))) void digitalToggle(uint32_t PinNumber) { if ((PinNumber>=pinCommonQty())) { ErrorMsgHandler("digitalToggle(): pin number exceeds the total number of pins"); return; } - if (digitalPinHasPWM(PinNumber)) + + if (digitalPinPwmIsOn(PinNumber)) // if the pin can use PWM, disable PWM analogWriteStop(PinNumber); - - HAL_GPIO_TogglePin(digitalPinToPort(PinNumber), digitalPinToBitMask(PinNumber)); + + GPIO_TOGGLE_PIN(digitalPinToPort(PinNumber), digitalPinToBitMask(PinNumber)); } #ifdef __cplusplus diff --git a/variants/elbear_ace_uno/pins_arduino.h b/variants/elbear_ace_uno/pins_arduino.h index d49dda0..0c3ed48 100644 --- a/variants/elbear_ace_uno/pins_arduino.h +++ b/variants/elbear_ace_uno/pins_arduino.h @@ -70,43 +70,10 @@ static const uint8_t A5 = PIN_A5; #define LED_BUILTIN (22) #define BTN_BUILTIN (23) -// determines the address of the port by the board pin number to which this pin belongs on the MCU -static inline __attribute__((always_inline)) GPIO_TypeDef* digitalPinToPort(uint32_t digPinNumber) -{ - if (digPinNumber >= pinCommonQty()) - { - ErrorMsgHandler("digitalPinToPort(): pin number exceeds the total number of pins"); - return NULL; - } - - // port 2 - led and button - if (digPinNumber == LED_BUILTIN || digPinNumber == BTN_BUILTIN) - return GPIO_2; - // port 1 - board pins 7, 8, 10...13, 14(А0), 15(А1), 18,19 - else if (digPinNumber == 7 || digPinNumber == 8 || (digPinNumber >= 10 && digPinNumber <= 15) - || digPinNumber == 18 || digPinNumber == 19 || (digPinNumber == 9 && spi0NssPinIsBlocked)) // 10 pieces - return GPIO_1; - // port 0 - board pins 0...6, 9, 16(A2), 17(A3), 20(A4), 21(A5) - else - return GPIO_0; -} +// determines the port address by the board pin number to which this pin belongs on the MCU +GPIO_TypeDef* digitalPinToPort(uint32_t digPinNumber); // determines the pin address inside the port by the board pin number -static inline __attribute__((always_inline)) HAL_PinsTypeDef digitalPinToBitMask(uint32_t digPinNumber) -{ - if (digPinNumber >= pinCommonQty()) - { - ErrorMsgHandler("digitalPinToBitMask(): pin number exceeds the total number of pins"); - return NOT_A_PIN; - } - - // if spi is on default pin NSS_IN is needed for spi, board pin is replaced to pin NSS_OUT - if ((digPinNumber == 10) && spi1NssPinIsBlocked) - return SPI1_NSS_OUT_PIN; - else if ((digPinNumber == 9) && spi0NssPinIsBlocked) - return SPI0_NSS_OUT_PIN; - else - return digitalPinToGpioPinArray[digPinNumber]; -} +HAL_PinsTypeDef digitalPinToBitMask(uint32_t digPinNumber); // the function returns a reference to the OUTPUT address of the GPIO register volatile uint32_t* portOutputRegister(GPIO_TypeDef* GPIO_x); // the function returns a reference to the STATE address of the GPIO register @@ -136,25 +103,8 @@ static inline __attribute__((always_inline)) bool digitalPinHasPWM(uint8_t p) return true; return false; } - // return true if digitalPin configured as pwm -static inline __attribute__((always_inline)) bool digitalPinPwmIsOn(uint8_t digitalPin) -{ - if (digitalPinHasPWM(digitalPin)) - { - uint8_t config = 0; - uint8_t pinShift = PIN_MASK_TO_PIN_NUMBER(digitalPinToBitMask(digitalPin)); - - if (PWM_PIN_TO_PORT_NUMBER(digitalPin) == 0) - config = PIN_GET_PAD_CONFIG(PORT_0_CFG, pinShift); - else - config = PIN_GET_PAD_CONFIG(PORT_1_CFG, pinShift); - - if (config == 2) - return true; - } - return false; -} +bool digitalPinPwmIsOn(uint8_t digitalPin); // determines which timer the pin belongs to TIMER32_TypeDef* pwmPinToTimer(uint32_t digPinNumber); // determines which timer channel the pin belongs to diff --git a/variants/elbear_ace_uno/variant.c b/variants/elbear_ace_uno/variant.c index 9a02e3e..1c1424c 100644 --- a/variants/elbear_ace_uno/variant.c +++ b/variants/elbear_ace_uno/variant.c @@ -57,7 +57,44 @@ const HAL_PinsTypeDef digitalPinToGpioPinArray[PINS_COMMON_QTY] = GPIO_PIN_6 // BTN(pin 23) }; +// determines the address of the port by the board pin number to which this pin belongs on the MCU +__attribute__((noinline, section(".ram_text"))) GPIO_TypeDef* digitalPinToPort(uint32_t digPinNumber) +{ + if (digPinNumber >= pinCommonQty()) + { + ErrorMsgHandler("digitalPinToPort(): pin number exceeds the total number of pins"); + return NULL; + } + // port 2 - led and button + if (digPinNumber == LED_BUILTIN || digPinNumber == BTN_BUILTIN) + return GPIO_2; + // port 1 - board pins 7, 8, 10...13, 14(А0), 15(А1), 18,19 + else if (digPinNumber == 7 || digPinNumber == 8 || (digPinNumber >= 10 && digPinNumber <= 15) + || digPinNumber == 18 || digPinNumber == 19 || (digPinNumber == 9 && spi0NssPinIsBlocked)) // 10 pieces + return GPIO_1; + // port 0 - board pins 0...6, 9, 16(A2), 17(A3), 20(A4), 21(A5) + else + return GPIO_0; +} + +// determines the pin address inside the port by the board pin number +__attribute__((noinline, section(".ram_text"))) HAL_PinsTypeDef digitalPinToBitMask(uint32_t digPinNumber) +{ + if (digPinNumber >= pinCommonQty()) + { + ErrorMsgHandler("digitalPinToBitMask(): pin number exceeds the total number of pins"); + return NOT_A_PIN; + } + + // if spi is on default pin NSS_IN is needed for spi, board pin is replaced to pin NSS_OUT + if ((digPinNumber == 10) && spi1NssPinIsBlocked) + return SPI1_NSS_OUT_PIN; + else if ((digPinNumber == 9) && spi0NssPinIsBlocked) + return SPI0_NSS_OUT_PIN; + else + return digitalPinToGpioPinArray[digPinNumber]; +} // the function returns a reference to the OUTPUT address of the GPIO register volatile uint32_t* portOutputRegister(GPIO_TypeDef* GPIO_x) @@ -125,6 +162,24 @@ uint32_t analogInputToChannelNumber(uint32_t PinNumber) } // ---------------------- PWM ---------------------- // +// return true if digitalPin configured as pwm +__attribute__((noinline, section(".ram_text"))) bool digitalPinPwmIsOn(uint8_t digitalPin) +{ + if (digitalPinHasPWM(digitalPin)) + { + uint8_t config = 0; + uint8_t pinShift = PIN_MASK_TO_PIN_NUMBER(digitalPinToBitMask(digitalPin)); + + if (PWM_PIN_TO_PORT_NUMBER(digitalPin) == 0) + config = PIN_GET_PAD_CONFIG(PORT_0_CFG, pinShift); + else + config = PIN_GET_PAD_CONFIG(PORT_1_CFG, pinShift); + + if (config == 2) + return true; + } + return false; +} // function is used only if digitalPinHasPWM() is true TIMER32_TypeDef* pwmPinToTimer(uint32_t digPinNumber)