From 6ced7bdad197b3179d147cf99f55a56ecb5d12c5 Mon Sep 17 00:00:00 2001 From: KLASSENTS Date: Mon, 17 Mar 2025 10:39:20 +0700 Subject: [PATCH] =?UTF-8?q?=D1=83=D1=81=D0=BA=D0=BE=D1=80=D0=B5=D0=BD?= =?UTF-8?q?=D0=B8=D0=B5=20=D1=80=D0=B0=D0=B1=D0=BE=D1=82=D1=8B=20digital?= =?UTF-8?q?=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) {