From d3b93e55bd538d588c03e3712f47b2468c021fcb Mon Sep 17 00:00:00 2001 From: KLASSENTS Date: Wed, 12 Mar 2025 15:47:15 +0700 Subject: [PATCH 01/10] =?UTF-8?q?=D1=84=D1=83=D0=BD=D0=BA=D1=86=D0=B8?= =?UTF-8?q?=D0=B8=20=D0=B7=D0=B0=D0=BC=D0=B5=D0=BD=D0=B8=D0=BB=D0=B0=20?= =?UTF-8?q?=D0=BD=D0=B0=20=D0=BC=D0=B0=D0=BA=D1=80=D0=BE=D1=81=D1=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- cores/arduino/wiring_digital.c | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/cores/arduino/wiring_digital.c b/cores/arduino/wiring_digital.c index 47d358d..8ccffab 100644 --- a/cores/arduino/wiring_digital.c +++ b/cores/arduino/wiring_digital.c @@ -102,12 +102,18 @@ void digitalWrite(uint32_t PinNumber, uint32_t Val) ErrorMsgHandler("digitalWrite(): pin number exceeds the total number of pins"); return; } + + GPIO_TypeDef* port = digitalPinToPort(PinNumber); + HAL_PinsTypeDef pin = digitalPinToBitMask(PinNumber); if (digitalPinHasPWM(PinNumber)) // if the pin can use PWM, disable PWM analogWriteStop(PinNumber); - HAL_GPIO_WritePin(digitalPinToPort(PinNumber), digitalPinToBitMask(PinNumber), (Val == HIGH) ? GPIO_PIN_HIGH : GPIO_PIN_LOW); + if (Val == HIGH) + GPIO_SET_PIN(port, pin); + else + GPIO_CLEAR_PIN(port, pin); } // read pin @@ -118,12 +124,14 @@ int digitalRead(uint32_t PinNumber) ErrorMsgHandler("digitalRead(): pin number exceeds the total number of pins"); return -1; } + GPIO_TypeDef* port = digitalPinToPort(PinNumber); + HAL_PinsTypeDef pin = digitalPinToBitMask(PinNumber); + if (digitalPinHasPWM(PinNumber)) // if the pin can use PWM, disable PWM analogWriteStop(PinNumber); - GPIO_PinState pinState = HAL_GPIO_ReadPin(digitalPinToPort(PinNumber), digitalPinToBitMask(PinNumber)); - return (pinState == GPIO_PIN_LOW) ? LOW : HIGH; + return GPIO_READ_PIN(port, pin); } // toggle pin -- 2.43.0 From 348d9b2f694fe58daaba5990bd97601865ca6a92 Mon Sep 17 00:00:00 2001 From: KLASSENTS Date: Wed, 12 Mar 2025 15:47:34 +0700 Subject: [PATCH 02/10] =?UTF-8?q?=D0=B4=D0=BE=D0=B1=D0=B0=D0=B2=D0=B8?= =?UTF-8?q?=D0=BB=D0=B0=20=D0=B7=D0=BD=D0=B0=D1=87=D0=B5=D0=BD=D0=B8=D0=B5?= =?UTF-8?q?=20=D0=9D=D0=95=D0=9F=D0=98=D0=9D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- cores/arduino/mik32/hal/peripherals/Include/mik32_hal_gpio.h | 1 + libraries/NeoPixel/src/NeoPixel.cpp | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/cores/arduino/mik32/hal/peripherals/Include/mik32_hal_gpio.h b/cores/arduino/mik32/hal/peripherals/Include/mik32_hal_gpio.h index bc3237d..4d90b46 100644 --- a/cores/arduino/mik32/hal/peripherals/Include/mik32_hal_gpio.h +++ b/cores/arduino/mik32/hal/peripherals/Include/mik32_hal_gpio.h @@ -36,6 +36,7 @@ extern "C" { */ typedef enum __HAL_PinsTypeDef { + NOT_A_PIN = (0 << 0), /**< Не выбран пин. */ GPIO_PIN_0 = (1 << 0), /**< Выбран пин 0. */ GPIO_PIN_1 = (1 << 1), /**< Выбран пин 1. */ GPIO_PIN_2 = (1 << 2), /**< Выбран пин 2. */ diff --git a/libraries/NeoPixel/src/NeoPixel.cpp b/libraries/NeoPixel/src/NeoPixel.cpp index 11d00de..e2aabcc 100644 --- a/libraries/NeoPixel/src/NeoPixel.cpp +++ b/libraries/NeoPixel/src/NeoPixel.cpp @@ -65,7 +65,7 @@ static void __attribute__((noinline, section(".ram_text"))) mik32Show(GPIO_TypeD // not support 400khz if (!is800KHz) return; - if ((m_port != NULL) && (m_pin != NC)) + if ((m_port != NULL) && (m_pin != NOT_A_PIN)) { volatile uint32_t* set = &m_port->SET; volatile uint32_t* clr = &m_port->CLEAR; -- 2.43.0 From c6f657d189e730abf6cd6da08e646ac8c3b9cc35 Mon Sep 17 00:00:00 2001 From: KLASSENTS Date: Wed, 12 Mar 2025 15:59:04 +0700 Subject: [PATCH 03/10] =?UTF-8?q?=D0=9F=D0=B5=D1=80=D0=B5=D0=BD=D0=B5?= =?UTF-8?q?=D1=81=D0=BB=D0=B0=20=D0=BF=D0=BE=D0=BB=D1=83=D1=87=D0=B5=D0=BD?= =?UTF-8?q?=D0=B8=D0=B5=20=D0=BF=D0=BE=D1=80=D1=82=D0=B0=20=D0=B8=20=D0=BC?= =?UTF-8?q?=D0=B0=D1=81=D0=BA=D0=B8=20=D0=BF=D0=B8=D0=BD=D0=B0=20=D0=B2=20?= =?UTF-8?q?=D1=85=D1=8D=D0=B4=D0=B5=D1=80=20=D0=BA=D0=B0=D0=BA=20=D0=B2?= =?UTF-8?q?=D1=81=D0=B5=D0=B3=D0=B4=D0=B0=20=D0=B8=D0=BD=D0=BB=D0=B0=D0=B9?= =?UTF-8?q?=D0=BD.=20=D0=94=D0=BB=D1=8F=20=D0=BD=D0=BE=D0=B3=20=D0=BD?= =?UTF-8?q?=D0=B5=20=D0=A8=D0=98=D0=9C=D0=BE=D0=B2=D1=81=D0=BA=D0=B8=D1=85?= =?UTF-8?q?=20=D0=BF=D0=BE=202=20=D0=BC=D0=BA=D1=81=20=D0=B4=D0=BB=D0=B8?= =?UTF-8?q?=D1=82=D0=B5=D0=BB=D1=8C=D0=BD=D0=BE=D1=81=D1=82=D1=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- variants/elbear_ace_uno/pins_arduino.h | 53 ++++++++++++++++++++-- variants/elbear_ace_uno/variant.c | 62 ++------------------------ 2 files changed, 53 insertions(+), 62 deletions(-) diff --git a/variants/elbear_ace_uno/pins_arduino.h b/variants/elbear_ace_uno/pins_arduino.h index 3095d54..0b71976 100644 --- a/variants/elbear_ace_uno/pins_arduino.h +++ b/variants/elbear_ace_uno/pins_arduino.h @@ -32,6 +32,20 @@ extern "C" { #include "mik32_hal_gpio.h" #include "mik32_hal_timer32.h" +void ErrorMsgHandler(const char * msg); + +// total number of pins available for initialization +#define PINS_COMMON_QTY 24 +#define pinCommonQty() (PINS_COMMON_QTY) + +#define SPI0_NSS_OUT_PORT GPIO_1 +#define SPI0_NSS_OUT_PIN GPIO_PIN_14 +#define SPI1_NSS_OUT_PORT GPIO_1 +#define SPI1_NSS_OUT_PIN GPIO_PIN_4 +extern bool spi0NssPinIsBlocked; +extern bool spi1NssPinIsBlocked; +extern const HAL_PinsTypeDef digitalPinToGpioPinArray[]; + // analog pins #define PIN_A0 (14) #define PIN_A1 (15) @@ -56,11 +70,42 @@ static const uint8_t A5 = PIN_A5; #define BTN_BUILTIN (23) // determines the address of the port by the board pin number to which this pin belongs on the MCU -GPIO_TypeDef* digitalPinToPort(uint32_t digPinNumber); +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 pin address inside the port by the board pin number -HAL_PinsTypeDef digitalPinToBitMask(uint32_t digPinNumber); -// total number of pins available for initialization -uint16_t pinCommonQty(void); +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]; +} // 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 diff --git a/variants/elbear_ace_uno/variant.c b/variants/elbear_ace_uno/variant.c index 7cab048..5c84cfd 100644 --- a/variants/elbear_ace_uno/variant.c +++ b/variants/elbear_ace_uno/variant.c @@ -20,21 +20,17 @@ #define SPI0_SWITCH_PIN GPIO_PIN_10 #define SPI0_NSS_IN_PORT GPIO_0 #define SPI0_NSS_IN_PIN GPIO_PIN_3 -#define SPI0_NSS_OUT_PORT GPIO_1 -#define SPI0_NSS_OUT_PIN GPIO_PIN_14 #define SPI1_SWITCH_PORT GPIO_1 #define SPI1_SWITCH_PIN GPIO_PIN_6 #define SPI1_NSS_IN_PORT GPIO_1 #define SPI1_NSS_IN_PIN GPIO_PIN_3 -#define SPI1_NSS_OUT_PORT GPIO_1 -#define SPI1_NSS_OUT_PIN GPIO_PIN_4 bool spi0NssPinIsBlocked = false; bool spi1NssPinIsBlocked = false; // list of pin numbers from both ports with pins inside the port -const HAL_PinsTypeDef digitalPinToGpioPinArray[] = +const HAL_PinsTypeDef digitalPinToGpioPinArray[PINS_COMMON_QTY] = { GPIO_PIN_5, // D0 GPIO_PIN_6, // D1 @@ -62,54 +58,7 @@ const HAL_PinsTypeDef digitalPinToGpioPinArray[] = GPIO_PIN_6 // BTN(pin 23) }; -// etermines the address of the port by the board pin number to which this pin belongs on the MCU -GPIO_TypeDef* digitalPinToPort(uint32_t digPinNumber) -{ - GPIO_TypeDef* gpioNum = NULL; - 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) - gpioNum = 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 - gpioNum = GPIO_1; - // port 0 - board pins 0...6, 9, 16(A2), 17(A3), 20(A4), 21(A5) - else - gpioNum = GPIO_0; - - return gpioNum; -} - -// determines the pin address inside the port by the board pin number -HAL_PinsTypeDef digitalPinToBitMask(uint32_t digPinNumber) -{ - if (digPinNumber >= pinCommonQty()) - { - ErrorMsgHandler("digitalPinToBitMask(): pin number exceeds the total number of pins"); - return NC; - } - - HAL_PinsTypeDef mask; - // if spi is on default pin NSS_IN is needed for spi, board pin is replaced to pin NSS_OUT - if ((digPinNumber == 10) && spi1NssPinIsBlocked) - mask = SPI1_NSS_OUT_PIN; - else if ((digPinNumber == 9) && spi0NssPinIsBlocked) - mask = SPI0_NSS_OUT_PIN; - else - mask = digitalPinToGpioPinArray[digPinNumber]; - return mask; -} - -uint16_t pinCommonQty(void) -{ - return (uint16_t)(sizeof(digitalPinToGpioPinArray)/sizeof(digitalPinToGpioPinArray[0])); -} // the function returns a reference to the OUTPUT address of the GPIO register volatile uint32_t* portOutputRegister(GPIO_TypeDef* GPIO_x) @@ -200,13 +149,10 @@ bool digitalPinPwmIsOn(uint8_t digitalPin) bool digitalPinHasPWM(uint8_t p) { - bool ret = false; // if spi is in use D9 or D10 cannot work as pwm - if (((p == 9) && spi0NssPinIsBlocked) || ((p == 10) && spi1NssPinIsBlocked)) - ret = false; - else if (p == 3 || p == 5 || p == 6 || (p >= 9 && p <= 13)) - ret = true; - return ret; + if (p == 3 || p == 5 || p == 6 || (p >= 11 && p <= 13) || ((p == 9) && !spi0NssPinIsBlocked) || ((p == 10) && !spi1NssPinIsBlocked)) + return true; + return false; } // function is used only if digitalPinHasPWM() is true -- 2.43.0 From a417b70bde45ad409131276247c3099013617e29 Mon Sep 17 00:00:00 2001 From: KLASSENTS Date: Wed, 12 Mar 2025 16:16:37 +0700 Subject: [PATCH 04/10] =?UTF-8?q?=D1=81=20=D1=82=D0=B0=D0=BA=D0=BE=D0=B9?= =?UTF-8?q?=20=D0=BA=D0=BE=D0=BD=D1=84=D0=B8=D0=B3=D1=83=D1=80=D0=B0=D1=86?= =?UTF-8?q?=D0=B8=D0=B5=D0=B9=20=D0=B2=D1=80=D0=B5=D0=BC=D0=B5=D0=BD=D0=B0?= =?UTF-8?q?=202=20=D0=B8=203=20=D0=BC=D0=BA=D1=81=20=D0=B4=D0=BB=D1=8F=20?= =?UTF-8?q?=D0=BD=D0=BE=D0=B6=D0=B5=D0=BA=20=D0=B1=D0=B5=D0=B7=20=D0=A8?= =?UTF-8?q?=D0=98=D0=9C=20=D0=B8=20=D1=81=20=D0=A8=D0=98=D0=9C,=20=D0=BD?= =?UTF-8?q?=D0=BE=20=D1=84=D1=83=D0=BD=D0=BA=D1=86=D0=B8=D0=B8=20=D0=B2?= =?UTF-8?q?=D0=B5=D1=81=D1=8F=D1=82=20=D0=BF=D0=BE=20450=20=D0=B1=D0=B0?= =?UTF-8?q?=D0=B9=D1=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- cores/arduino/wiring_digital.c | 4 ++-- variants/elbear_ace_uno/pins_arduino.h | 32 ++++++++++++++++++++++++-- variants/elbear_ace_uno/variant.c | 29 ----------------------- 3 files changed, 32 insertions(+), 33 deletions(-) diff --git a/cores/arduino/wiring_digital.c b/cores/arduino/wiring_digital.c index 8ccffab..a650607 100644 --- a/cores/arduino/wiring_digital.c +++ b/cores/arduino/wiring_digital.c @@ -106,7 +106,7 @@ void digitalWrite(uint32_t PinNumber, uint32_t Val) GPIO_TypeDef* port = digitalPinToPort(PinNumber); HAL_PinsTypeDef pin = digitalPinToBitMask(PinNumber); - if (digitalPinHasPWM(PinNumber)) + if (digitalPinPwmIsOn(PinNumber)) // if the pin can use PWM, disable PWM analogWriteStop(PinNumber); @@ -127,7 +127,7 @@ int digitalRead(uint32_t PinNumber) GPIO_TypeDef* port = digitalPinToPort(PinNumber); HAL_PinsTypeDef pin = digitalPinToBitMask(PinNumber); - if (digitalPinHasPWM(PinNumber)) + if (digitalPinPwmIsOn(PinNumber)) // if the pin can use PWM, disable PWM analogWriteStop(PinNumber); diff --git a/variants/elbear_ace_uno/pins_arduino.h b/variants/elbear_ace_uno/pins_arduino.h index 0b71976..d49dda0 100644 --- a/variants/elbear_ace_uno/pins_arduino.h +++ b/variants/elbear_ace_uno/pins_arduino.h @@ -31,6 +31,7 @@ extern "C" { #include "mik32_hal_gpio.h" #include "mik32_hal_timer32.h" +#include "wiring_LL.h" void ErrorMsgHandler(const char * msg); @@ -125,8 +126,35 @@ uint32_t analogInputToChannelNumber(uint32_t PinNumber); // PWM #define PWM_FREQUENCY_MAX 1000000 // Hz -bool digitalPinHasPWM(uint8_t p); -bool digitalPinPwmIsOn(uint8_t digitalPin); // use only if digitalPinHasPWM() == true +// use only if digitalPinHasPWM() == true +#define PWM_PIN_TO_PORT_NUMBER(pin) (((pin==10)||(pin==11)||(pin==12)||(pin==13)) ? 1:0) + +static inline __attribute__((always_inline)) bool digitalPinHasPWM(uint8_t p) +{ + // if spi is in use D9 or D10 cannot work as pwm + if (p == 3 || p == 5 || p == 6 || (p >= 11 && p <= 13) || ((p == 9) && !spi0NssPinIsBlocked) || ((p == 10) && !spi1NssPinIsBlocked)) + 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; +} // 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 5c84cfd..9a02e3e 100644 --- a/variants/elbear_ace_uno/variant.c +++ b/variants/elbear_ace_uno/variant.c @@ -14,7 +14,6 @@ #include "pins_arduino.h" #include "mik32_hal_adc.h" #include "wiring_analog.h" -#include "wiring_LL.h" #define SPI0_SWITCH_PORT GPIO_1 #define SPI0_SWITCH_PIN GPIO_PIN_10 @@ -126,34 +125,6 @@ uint32_t analogInputToChannelNumber(uint32_t PinNumber) } // ---------------------- PWM ---------------------- // -// use only if digitalPinHasPWM() == true -#define PWM_PIN_TO_PORT_NUMBER(pin) (((pin==10)||(pin==11)||(pin==12)||(pin==13)) ? 1:0) - -// use only if digitalPinHasPWM() == true -// return true if digitalPin configured as pwm -bool digitalPinPwmIsOn(uint8_t 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; - else - return false; -} - -bool digitalPinHasPWM(uint8_t p) -{ - // if spi is in use D9 or D10 cannot work as pwm - if (p == 3 || p == 5 || p == 6 || (p >= 11 && p <= 13) || ((p == 9) && !spi0NssPinIsBlocked) || ((p == 10) && !spi1NssPinIsBlocked)) - return true; - return false; -} // function is used only if digitalPinHasPWM() is true TIMER32_TypeDef* pwmPinToTimer(uint32_t digPinNumber) -- 2.43.0 From ac51d0cae10d0c6be164e0e8f2028b30ed2269c7 Mon Sep 17 00:00:00 2001 From: KLASSENTS Date: Fri, 14 Mar 2025 11:17:47 +0700 Subject: [PATCH 05/10] =?UTF-8?q?=D0=B2=D1=81=D0=BF=D0=BE=D0=BC=D0=BE?= =?UTF-8?q?=D0=B3=D0=B0=D1=82=D0=B5=D0=BB=D1=8C=D0=BD=D1=8B=D0=B5=20=D1=84?= =?UTF-8?q?=D1=83=D0=BD=D0=BA=D1=86=D0=B8=D0=B8=20=D0=B8=20=D1=84=D1=83?= =?UTF-8?q?=D0=BD=D0=BA=D1=86=D0=B8=D0=B8=20digital=20=D0=B2=D1=8B=D0=BD?= =?UTF-8?q?=D0=B5=D1=81=D0=B5=D0=BD=D1=8B=20=D0=B2=20ram=20=D0=B4=D0=BB?= =?UTF-8?q?=D1=8F=20=D1=83=D0=B2=D0=B5=D0=BB=D0=B8=D1=87=D0=B5=D0=BD=D0=B8?= =?UTF-8?q?=D1=8F=20=D0=B1=D1=8B=D1=81=D1=82=D1=80=D0=BE=D0=B4=D0=B5=D0=B9?= =?UTF-8?q?=D1=81=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) -- 2.43.0 From 8093d3a157a673042dbea78513cb34e37ede800f Mon Sep 17 00:00:00 2001 From: KLASSENTS Date: Fri, 14 Mar 2025 12:18:33 +0700 Subject: [PATCH 06/10] =?UTF-8?q?=D0=BF=D0=B5=D1=80=D0=B5=D0=BD=D0=B5?= =?UTF-8?q?=D1=81=D0=BB=D0=B0=20=D0=BB=D0=B8=D1=88=D0=BD=D0=B5=D0=B5=20?= =?UTF-8?q?=D0=BE=D0=B1=D1=80=D0=B0=D1=82=D0=BD=D0=BE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- variants/elbear_ace_uno/pins_arduino.h | 12 ------------ variants/elbear_ace_uno/variant.c | 8 ++++++++ 2 files changed, 8 insertions(+), 12 deletions(-) diff --git a/variants/elbear_ace_uno/pins_arduino.h b/variants/elbear_ace_uno/pins_arduino.h index 0c3ed48..553ed21 100644 --- a/variants/elbear_ace_uno/pins_arduino.h +++ b/variants/elbear_ace_uno/pins_arduino.h @@ -31,21 +31,13 @@ extern "C" { #include "mik32_hal_gpio.h" #include "mik32_hal_timer32.h" -#include "wiring_LL.h" - -void ErrorMsgHandler(const char * msg); // total number of pins available for initialization #define PINS_COMMON_QTY 24 #define pinCommonQty() (PINS_COMMON_QTY) -#define SPI0_NSS_OUT_PORT GPIO_1 -#define SPI0_NSS_OUT_PIN GPIO_PIN_14 -#define SPI1_NSS_OUT_PORT GPIO_1 -#define SPI1_NSS_OUT_PIN GPIO_PIN_4 extern bool spi0NssPinIsBlocked; extern bool spi1NssPinIsBlocked; -extern const HAL_PinsTypeDef digitalPinToGpioPinArray[]; // analog pins #define PIN_A0 (14) @@ -62,7 +54,6 @@ static const uint8_t A3 = PIN_A3; static const uint8_t A4 = PIN_A4; static const uint8_t A5 = PIN_A5; - // digital pins // D0...D13, D18, D19 @@ -93,9 +84,6 @@ uint32_t analogInputToChannelNumber(uint32_t PinNumber); // PWM #define PWM_FREQUENCY_MAX 1000000 // Hz -// use only if digitalPinHasPWM() == true -#define PWM_PIN_TO_PORT_NUMBER(pin) (((pin==10)||(pin==11)||(pin==12)||(pin==13)) ? 1:0) - static inline __attribute__((always_inline)) bool digitalPinHasPWM(uint8_t p) { // if spi is in use D9 or D10 cannot work as pwm diff --git a/variants/elbear_ace_uno/variant.c b/variants/elbear_ace_uno/variant.c index 1c1424c..9842331 100644 --- a/variants/elbear_ace_uno/variant.c +++ b/variants/elbear_ace_uno/variant.c @@ -14,16 +14,21 @@ #include "pins_arduino.h" #include "mik32_hal_adc.h" #include "wiring_analog.h" +#include "wiring_LL.h" #define SPI0_SWITCH_PORT GPIO_1 #define SPI0_SWITCH_PIN GPIO_PIN_10 #define SPI0_NSS_IN_PORT GPIO_0 #define SPI0_NSS_IN_PIN GPIO_PIN_3 +#define SPI0_NSS_OUT_PORT GPIO_1 +#define SPI0_NSS_OUT_PIN GPIO_PIN_14 #define SPI1_SWITCH_PORT GPIO_1 #define SPI1_SWITCH_PIN GPIO_PIN_6 #define SPI1_NSS_IN_PORT GPIO_1 #define SPI1_NSS_IN_PIN GPIO_PIN_3 +#define SPI1_NSS_OUT_PORT GPIO_1 +#define SPI1_NSS_OUT_PIN GPIO_PIN_4 bool spi0NssPinIsBlocked = false; bool spi1NssPinIsBlocked = false; @@ -162,6 +167,9 @@ uint32_t analogInputToChannelNumber(uint32_t PinNumber) } // ---------------------- PWM ---------------------- // +// use only if digitalPinHasPWM() == true +#define PWM_PIN_TO_PORT_NUMBER(pin) (((pin==10)||(pin==11)||(pin==12)||(pin==13)) ? 1:0) + // return true if digitalPin configured as pwm __attribute__((noinline, section(".ram_text"))) bool digitalPinPwmIsOn(uint8_t digitalPin) { -- 2.43.0 From ca11ae5dbd53aaa9c154c219db26fc66167e08c2 Mon Sep 17 00:00:00 2001 From: KLASSENTS Date: Fri, 14 Mar 2025 12:19:20 +0700 Subject: [PATCH 07/10] =?UTF-8?q?=D0=B8=D0=B7=D0=BC=D0=B5=D0=BD=D0=B5?= =?UTF-8?q?=D0=BD=D0=B8=D1=8F=20=D0=B4=D0=BB=D1=8F=20=D1=83=D1=81=D0=BA?= =?UTF-8?q?=D0=BE=D1=80=D0=B5=D0=BD=D0=B8=D1=8F=20=D1=84=D1=83=D0=BD=D0=BA?= =?UTF-8?q?=D1=86=D0=B8=D0=B9=20digital?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- variants/elbear_ace_nano/pins_arduino.h | 20 ++++++-- variants/elbear_ace_nano/variant.c | 61 +++++++++---------------- 2 files changed, 37 insertions(+), 44 deletions(-) diff --git a/variants/elbear_ace_nano/pins_arduino.h b/variants/elbear_ace_nano/pins_arduino.h index 54cbc1e..c1e19df 100644 --- a/variants/elbear_ace_nano/pins_arduino.h +++ b/variants/elbear_ace_nano/pins_arduino.h @@ -32,6 +32,13 @@ extern "C" { #include "mik32_hal_gpio.h" #include "mik32_hal_timer32.h" +// total number of pins available for initialization +#define PINS_COMMON_QTY 26 +#define pinCommonQty() (PINS_COMMON_QTY) + +extern bool spi0NssPinIsBlocked; +extern bool spi1NssPinIsBlocked; + // analog pins #define PIN_A0 (14) #define PIN_A1 (15) @@ -63,8 +70,6 @@ static const uint8_t A7 = PIN_A7; GPIO_TypeDef* digitalPinToPort(uint32_t digPinNumber); // determines the pin address inside the port by the board pin number HAL_PinsTypeDef digitalPinToBitMask(uint32_t digPinNumber); -// total number of pins available for initialization -uint16_t pinCommonQty(void); // 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 @@ -84,8 +89,15 @@ uint32_t analogInputToChannelNumber(uint32_t PinNumber); // PWM #define PWM_FREQUENCY_MAX 1000000 // Hz -bool digitalPinHasPWM(uint8_t p); -bool digitalPinPwmIsOn(uint8_t digitalPin); // use only if digitalPinHasPWM() == true +static inline __attribute__((always_inline)) bool digitalPinHasPWM(uint8_t p) +{ + // if spi is in use D9 or D10 cannot work as pwm + if (p == 3 || p == 5 || p == 6 || (p >= 11 && p <= 13) || ((p == 9) && !spi0NssPinIsBlocked) || ((p == 10) && !spi1NssPinIsBlocked)) + return true; + return false; +} +// return true if digitalPin configured as pwm +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_nano/variant.c b/variants/elbear_ace_nano/variant.c index 7f1d016..cb70338 100644 --- a/variants/elbear_ace_nano/variant.c +++ b/variants/elbear_ace_nano/variant.c @@ -65,9 +65,8 @@ const HAL_PinsTypeDef digitalPinToGpioPinArray[] = }; // determines the address of the port by the board pin number to which this pin belongs on the MCU -GPIO_TypeDef* digitalPinToPort(uint32_t digPinNumber) +__attribute__((noinline, section(".ram_text"))) GPIO_TypeDef* digitalPinToPort(uint32_t digPinNumber) { - GPIO_TypeDef* gpioNum = NULL; if (digPinNumber >= pinCommonQty()) { ErrorMsgHandler("digitalPinToPort(): pin number exceeds the total number of pins"); @@ -76,41 +75,32 @@ GPIO_TypeDef* digitalPinToPort(uint32_t digPinNumber) // port 2 - led (22) if (digPinNumber == LED_BUILTIN) - gpioNum = GPIO_2; + 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)) - gpioNum = GPIO_1; + return GPIO_1; // port 0 - board pins 0...6, 9, 16(A2), 17(A3), 20(A4), 21(A5), 24(A6), 25(A7) else - gpioNum = GPIO_0; - - return gpioNum; + return GPIO_0; } // determines the pin address inside the port by the board pin number -HAL_PinsTypeDef digitalPinToBitMask(uint32_t digPinNumber) +__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 NC; + return NOT_A_PIN; } - HAL_PinsTypeDef mask; // if spi is on default pin NSS_IN is needed for spi, board pin is replaced to pin NSS_OUT if ((digPinNumber == 10) && spi1NssPinIsBlocked) - mask = SPI1_NSS_OUT_PIN; + return SPI1_NSS_OUT_PIN; else if ((digPinNumber == 9) && spi0NssPinIsBlocked) - mask = SPI0_NSS_OUT_PIN; + return SPI0_NSS_OUT_PIN; else - mask = digitalPinToGpioPinArray[digPinNumber]; - return mask; -} - -uint16_t pinCommonQty(void) -{ - return (uint16_t)(sizeof(digitalPinToGpioPinArray)/sizeof(digitalPinToGpioPinArray[0])); + return digitalPinToGpioPinArray[digPinNumber]; } // the function returns a reference to the OUTPUT address of the GPIO register @@ -221,29 +211,20 @@ uint32_t analogInputToChannelNumber(uint32_t PinNumber) // return true if digitalPin configured as pwm bool digitalPinPwmIsOn(uint8_t digitalPin) { - uint8_t config = 0; - uint8_t pinShift = PIN_MASK_TO_PIN_NUMBER(digitalPinToBitMask(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 (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; - else - return false; -} - -bool digitalPinHasPWM(uint8_t p) -{ - bool ret = false; - // if spi is in use D10 cannot work as pwm - if (((p == 9) && spi0NssPinIsBlocked) || ((p == 10) && spi1NssPinIsBlocked)) - ret = false; - else if (p == 3 || p == 5 || p == 6 || (p >= 9 && p <= 13)) - ret = true; - return ret; + if (config == 2) + return true; + } + return false; } // function is used only if digitalPinHasPWM() is true -- 2.43.0 From 663ce5bf554c3ee92ef72304b775a794ce3cacd0 Mon Sep 17 00:00:00 2001 From: KLASSENTS Date: Mon, 17 Mar 2025 10:06:57 +0700 Subject: [PATCH 08/10] =?UTF-8?q?=D1=83=D1=81=D0=BA=D0=BE=D1=80=D0=B5?= =?UTF-8?q?=D0=BD=D0=B8=D0=B5=20=D1=80=D0=B0=D0=B1=D0=BE=D1=82=D1=8B=20?= =?UTF-8?q?=D1=84=D1=83=D0=BD=D0=BA=D1=86=D0=B8=D0=B9=20digital?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- variants/elsomik/pins_arduino.h | 15 ++++++++------- variants/elsomik/variant.c | 29 +++++++++++++---------------- 2 files changed, 21 insertions(+), 23 deletions(-) diff --git a/variants/elsomik/pins_arduino.h b/variants/elsomik/pins_arduino.h index adebe90..282f608 100644 --- a/variants/elsomik/pins_arduino.h +++ b/variants/elsomik/pins_arduino.h @@ -71,6 +71,8 @@ typedef enum P2_7, // 33 PINS_COMMON_QTY, // 34 } DigitalPinsTypeDef; +// total number of pins available for initialization +#define pinCommonQty() (PINS_COMMON_QTY) // analog pins #define PIN_A0 (P1_5) @@ -96,11 +98,6 @@ static const uint8_t A7 = PIN_A7; GPIO_TypeDef* digitalPinToPort(uint32_t digPinNumber); // determines the pin address inside the port by the board pin number HAL_PinsTypeDef digitalPinToBitMask(uint32_t digitalPinNumber); -// total number of pins available for initialization -static inline uint16_t pinCommonQty(void) -{ - return (uint16_t)PINS_COMMON_QTY; -} // 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 @@ -120,8 +117,12 @@ uint32_t analogInputToChannelNumber(uint32_t PinNumber); // PWM #define PWM_FREQUENCY_MAX 1000000 // Hz -bool digitalPinHasPWM(uint8_t p); -bool digitalPinPwmIsOn(uint8_t digitalPin); // use only if digitalPinHasPWM() == true +static inline __attribute__((always_inline)) bool digitalPinHasPWM(uint8_t p) +{ + return (p <= P1_15) && ((p & 0xF) < 4); +} +// return true if digitalPin configured as pwm +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/elsomik/variant.c b/variants/elsomik/variant.c index 5f51a41..cff665c 100644 --- a/variants/elsomik/variant.c +++ b/variants/elsomik/variant.c @@ -21,7 +21,7 @@ * @return The address of the port corresponding to the board pin number. Can return 0 if the pin not exists */ -GPIO_TypeDef *digitalPinToPort(uint32_t digitalPinNumber) + __attribute__((noinline, section(".ram_text"))) GPIO_TypeDef *digitalPinToPort(uint32_t digitalPinNumber) { if (digitalPinNumber >= pinCommonQty()) { @@ -40,7 +40,7 @@ GPIO_TypeDef *digitalPinToPort(uint32_t digitalPinNumber) } // determines the pin address inside the port by the board pin number -HAL_PinsTypeDef digitalPinToBitMask(uint32_t digitalPinNumber) +__attribute__((noinline, section(".ram_text"))) HAL_PinsTypeDef digitalPinToBitMask(uint32_t digitalPinNumber) { if (digitalPinNumber >= PINS_COMMON_QTY) { @@ -112,25 +112,22 @@ uint32_t analogInputToChannelNumber(uint32_t PinNumber) // return true if digitalPin configured as pwm bool digitalPinPwmIsOn(uint8_t digitalPin) { - uint8_t config = 0; - uint8_t pinShift = digitalPin & 0x3; + if (digitalPinHasPWM(digitalPin)) + { + uint8_t config = 0; + uint8_t pinShift = digitalPin & 0x3; - 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 (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; - else + if (config == 2) + return true; + } return false; } -bool digitalPinHasPWM(uint8_t digitalPin) -{ - return (digitalPin <= P1_15) && ((digitalPin & 0xF) < 4); -} - // function is used only if digitalPinHasPWM() is true TIMER32_TypeDef *pwmPinToTimer(uint32_t digPinNumber) { -- 2.43.0 From 6ced7bdad197b3179d147cf99f55a56ecb5d12c5 Mon Sep 17 00:00:00 2001 From: KLASSENTS Date: Mon, 17 Mar 2025 10:39:20 +0700 Subject: [PATCH 09/10] =?UTF-8?q?=D1=83=D1=81=D0=BA=D0=BE=D1=80=D0=B5?= =?UTF-8?q?=D0=BD=D0=B8=D0=B5=20=D1=80=D0=B0=D0=B1=D0=BE=D1=82=D1=8B=20dig?= =?UTF-8?q?ital=20=D1=84=D1=83=D0=BD=D0=BA=D1=86=D0=B8=D0=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- variants/elsomik/variant.c | 2 +- variants/start/pins_arduino.h | 16 +++++++++------- variants/start/variant.c | 31 ++++++++++++++----------------- 3 files changed, 24 insertions(+), 25 deletions(-) diff --git a/variants/elsomik/variant.c b/variants/elsomik/variant.c index cff665c..a80a567 100644 --- a/variants/elsomik/variant.c +++ b/variants/elsomik/variant.c @@ -45,7 +45,7 @@ __attribute__((noinline, section(".ram_text"))) HAL_PinsTypeDef digitalPinToBitM if (digitalPinNumber >= PINS_COMMON_QTY) { ErrorMsgHandler("digitalPinToBitMask(): pin number exceeds the total number of pins"); - return NC; + return NOT_A_PIN; } if (digitalPinNumber >= P2_6) diff --git a/variants/start/pins_arduino.h b/variants/start/pins_arduino.h index cbca102..f785196 100644 --- a/variants/start/pins_arduino.h +++ b/variants/start/pins_arduino.h @@ -78,6 +78,9 @@ typedef enum PINS_COMMON_QTY, // 40 } DigitalPinsTypeDef; +// total number of pins available for initialization +#define pinCommonQty() (PINS_COMMON_QTY) + // analog pins #define PIN_A0 (P1_5) #define PIN_A1 (P1_7) @@ -108,11 +111,6 @@ static const uint8_t A7 = PIN_A7; GPIO_TypeDef* digitalPinToPort(uint32_t digPinNumber); // determines the pin address inside the port by the board pin number HAL_PinsTypeDef digitalPinToBitMask(uint32_t digitalPinNumber); -// total number of pins available for initialization -static inline uint16_t pinCommonQty(void) -{ - return (uint16_t)PINS_COMMON_QTY; -} // 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 @@ -132,8 +130,12 @@ uint32_t analogInputToChannelNumber(uint32_t PinNumber); // PWM #define PWM_FREQUENCY_MAX 1000000 // Hz -bool digitalPinHasPWM(uint8_t p); -bool digitalPinPwmIsOn(uint8_t digitalPin); // use only if digitalPinHasPWM() == true +static inline __attribute__((always_inline)) bool digitalPinHasPWM(uint8_t p) +{ + return (p < 32) && ((p & 0xF) < 4); +} +// return true if digitalPin configured as pwm +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/start/variant.c b/variants/start/variant.c index dbd66cb..0179517 100644 --- a/variants/start/variant.c +++ b/variants/start/variant.c @@ -21,7 +21,7 @@ * @return The address of the port corresponding to the board pin number. Can return 0 if the pin not exists */ -GPIO_TypeDef *digitalPinToPort(uint32_t digitalPinNumber) + __attribute__((noinline, section(".ram_text"))) GPIO_TypeDef *digitalPinToPort(uint32_t digitalPinNumber) { GPIO_TypeDef* port = NULL; if (digitalPinNumber < pinCommonQty()) @@ -39,12 +39,12 @@ GPIO_TypeDef *digitalPinToPort(uint32_t digitalPinNumber) } // determines the pin address inside the port by the board pin number -HAL_PinsTypeDef digitalPinToBitMask(uint32_t digitalPinNumber) +__attribute__((noinline, section(".ram_text"))) HAL_PinsTypeDef digitalPinToBitMask(uint32_t digitalPinNumber) { if (digitalPinNumber >= pinCommonQty()) { ErrorMsgHandler("digitalPinToBitMask(): pin number exceeds the total number of pins"); - return NC; + return NOT_A_PIN; } return (HAL_PinsTypeDef)(1 << (digitalPinNumber & 0xF)); @@ -108,25 +108,22 @@ uint32_t analogInputToChannelNumber(uint32_t PinNumber) // return true if digitalPin configured as pwm bool digitalPinPwmIsOn(uint8_t digitalPin) { - uint8_t config = 0; - uint8_t pinShift = digitalPin & 3; + if (digitalPinHasPWM(digitalPin)) + { + uint8_t config = 0; + uint8_t pinShift = digitalPin & 3; - 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 (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; - else + if (config == 2) + return true; + } return false; } -bool digitalPinHasPWM(uint8_t p) -{ - return (p < 32) && ((p & 0xF) < 4); -} - // function is used only if digitalPinHasPWM() is true TIMER32_TypeDef *pwmPinToTimer(uint32_t digPinNumber) { -- 2.43.0 From b1fff017f43e4113bd58c9e8d462e02e80b73da1 Mon Sep 17 00:00:00 2001 From: KLASSENTS Date: Mon, 17 Mar 2025 11:35:41 +0700 Subject: [PATCH 10/10] =?UTF-8?q?=D0=B5=D1=89=D0=B5=20=D0=BE=D0=B4=D0=BD?= =?UTF-8?q?=D0=B0=20=D1=84=D1=83=D0=BD=D0=BA=D1=86=D0=B8=D1=8F=20=D0=B2=20?= =?UTF-8?q?=D1=80=D0=B0=D0=BC=D0=BA=D1=83?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- variants/elbear_ace_nano/variant.c | 2 +- variants/elsomik/variant.c | 2 +- variants/start/variant.c | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/variants/elbear_ace_nano/variant.c b/variants/elbear_ace_nano/variant.c index cb70338..d5f6a31 100644 --- a/variants/elbear_ace_nano/variant.c +++ b/variants/elbear_ace_nano/variant.c @@ -209,7 +209,7 @@ uint32_t analogInputToChannelNumber(uint32_t PinNumber) // use only if digitalPinHasPWM() == true // return true if digitalPin configured as pwm -bool digitalPinPwmIsOn(uint8_t digitalPin) +__attribute__((noinline, section(".ram_text"))) bool digitalPinPwmIsOn(uint8_t digitalPin) { if (digitalPinHasPWM(digitalPin)) { diff --git a/variants/elsomik/variant.c b/variants/elsomik/variant.c index a80a567..c5eab70 100644 --- a/variants/elsomik/variant.c +++ b/variants/elsomik/variant.c @@ -110,7 +110,7 @@ uint32_t analogInputToChannelNumber(uint32_t PinNumber) // use only if digitalPinHasPWM() == true // return true if digitalPin configured as pwm -bool digitalPinPwmIsOn(uint8_t digitalPin) +__attribute__((noinline, section(".ram_text"))) bool digitalPinPwmIsOn(uint8_t digitalPin) { if (digitalPinHasPWM(digitalPin)) { diff --git a/variants/start/variant.c b/variants/start/variant.c index 0179517..2e83da8 100644 --- a/variants/start/variant.c +++ b/variants/start/variant.c @@ -106,7 +106,7 @@ uint32_t analogInputToChannelNumber(uint32_t PinNumber) // use only if digitalPinHasPWM() == true // return true if digitalPin configured as pwm -bool digitalPinPwmIsOn(uint8_t digitalPin) +__attribute__((noinline, section(".ram_text"))) bool digitalPinPwmIsOn(uint8_t digitalPin) { if (digitalPinHasPWM(digitalPin)) { -- 2.43.0