From fbaa4b931a02d25adf90f3b1bae494b254031e61 Mon Sep 17 00:00:00 2001 From: KLASSENTS Date: Fri, 21 Feb 2025 15:43:13 +0700 Subject: [PATCH] =?UTF-8?q?=D0=B4=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5?= =?UTF-8?q?=D0=BD=D0=B0=20=D0=BF=D1=80=D0=BE=D0=B2=D0=B5=D1=80=D0=BA=D0=B0?= =?UTF-8?q?=20-=20=D0=BD=D0=B5=20=D0=BF=D1=80=D0=B5=D0=B2=D1=8B=D1=88?= =?UTF-8?q?=D0=B0=D0=B5=D1=82=20=D0=BB=D0=B8=20=D0=BD=D0=BE=D0=BC=D0=B5?= =?UTF-8?q?=D1=80=20=D0=B2=D1=8B=D0=B2=D0=BE=D0=B4=D0=B0=20=D0=B8=D0=B7=20?= =?UTF-8?q?=D0=B0=D1=80=D0=B3=D1=83=D0=BC=D0=B5=D0=BD=D1=82=D0=B0=20=D1=84?= =?UTF-8?q?=D1=83=D0=BD=D0=BA=D1=86=D0=B8=D0=B8=20=D0=BE=D0=B1=D1=89=D0=B5?= =?UTF-8?q?=D0=B5=20=D0=BA=D0=BE=D0=BB-=D0=B2=D0=BE=20=D0=B2=D1=8B=D0=B2?= =?UTF-8?q?=D0=BE=D0=B4=D0=BE=D0=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- cores/arduino/Tone.cpp | 12 ++ cores/arduino/wiring_analog.c | 2 +- cores/arduino/wiring_digital.c | 7 ++ libraries/NeoPixel/src/NeoPixel.cpp | 103 ++++++++++-------- .../SoftwareSerial/src/SoftwareSerial.cpp | 12 ++ variants/elbear_ace_nano/variant.c | 33 +++--- variants/elbear_ace_uno/variant.c | 33 +++--- variants/elsomik/pins_arduino.h | 8 +- variants/elsomik/variant.c | 21 ++++ variants/start/pins_arduino.h | 5 +- variants/start/variant.c | 31 ++++-- 11 files changed, 171 insertions(+), 96 deletions(-) diff --git a/cores/arduino/Tone.cpp b/cores/arduino/Tone.cpp index 6c9f04d..f463f66 100644 --- a/cores/arduino/Tone.cpp +++ b/cores/arduino/Tone.cpp @@ -79,6 +79,12 @@ static void calcFrequencyParams(FrequencyParams_t* params, unsigned int newFrequ // start tone with frequency (in hertz) and duration (in milliseconds) void tone(uint8_t pin, unsigned int frequency, unsigned long duration) { + if ((pin>=pinCommonQty())) + { + ErrorMsgHandler("tone(): pin number exceeds the total number of pins"); + return; + } + if (!timerIsOn) // if tone is not generated at the moment { // calculate the parameters necessary to ensure a given frequency if the frequency has changed @@ -123,6 +129,12 @@ void tone(uint8_t pin, unsigned int frequency, unsigned long duration) // stop tone void noTone(uint8_t pin) { + if ((pin>=pinCommonQty())) + { + ErrorMsgHandler("noTone(): pin number exceeds the total number of pins"); + return; + } + if (timerIsOn) { // pin to 0 diff --git a/cores/arduino/wiring_analog.c b/cores/arduino/wiring_analog.c index f33a733..1dc6775 100644 --- a/cores/arduino/wiring_analog.c +++ b/cores/arduino/wiring_analog.c @@ -170,7 +170,7 @@ It is recommended to turn off the timer in the following order: */ void analogWriteStop(uint32_t PinNumber) { - if ((pwmIsInited > 0) && (digitalPinPwmIsOn(PinNumber))) + if (digitalPinHasPWM(PinNumber) && (pwmIsInited > 0) && digitalPinPwmIsOn(PinNumber)) { // load the timer address and channel number corresponding to the specified pin htimer32.Instance = pwmPinToTimer(PinNumber); diff --git a/cores/arduino/wiring_digital.c b/cores/arduino/wiring_digital.c index 0f199f1..47d358d 100644 --- a/cores/arduino/wiring_digital.c +++ b/cores/arduino/wiring_digital.c @@ -69,8 +69,15 @@ void pinMode(uint32_t PinNumber, uint32_t PinMode) void fastPinMode(uint32_t PinNumber, uint32_t PinMode) { + if ((PinNumber>=pinCommonQty())) + { + ErrorMsgHandler("fastPinMode(): pin number exceeds the total number of pins"); + return; + } + GPIO_TypeDef* port = digitalPinToPort(PinNumber); HAL_PinsTypeDef pinMask = digitalPinToBitMask(PinNumber); + // set direction if (PinMode == OUTPUT) GPIO_OUTPUT_MODE_PIN(port, pinMask); diff --git a/libraries/NeoPixel/src/NeoPixel.cpp b/libraries/NeoPixel/src/NeoPixel.cpp index c753860..11d00de 100644 --- a/libraries/NeoPixel/src/NeoPixel.cpp +++ b/libraries/NeoPixel/src/NeoPixel.cpp @@ -19,7 +19,13 @@ NeoPixel::~NeoPixel() { } void NeoPixel::begin(void) { - if (pin >= 0) { + if (pin >= 0) + { + if (pin >= pinCommonQty()) + { + ErrorMsgHandler("NeoPixel.begin(): pin number exceeds the total number of pins"); + return; + } pinMode(pin, OUTPUT); digitalWrite(pin, LOW); } @@ -58,59 +64,62 @@ void NeoPixel::updateType(neoPixelType t) { static void __attribute__((noinline, section(".ram_text"))) mik32Show(GPIO_TypeDef* m_port, uint32_t m_pin, uint8_t* pixels, uint32_t numBytes, bool is800KHz) { // not support 400khz if (!is800KHz) return; - - volatile uint32_t* set = &m_port->SET; - volatile uint32_t* clr = &m_port->CLEAR; - - uint8_t* ptr = pixels; - uint8_t* end = ptr + numBytes; - uint8_t p = *ptr++; - uint8_t bitMask = 0x80; - - noInterrupts(); - while (1) { - if (p & bitMask) { // ONE - // High 800ns - 25,6 tick - *set = m_pin; - __asm volatile ( - "nop; nop; nop; nop; nop; nop; nop; nop;" - "nop; nop; nop; nop; nop; nop; nop; nop;" - "nop; nop; nop; nop;" - ); + if ((m_port != NULL) && (m_pin != NC)) + { + volatile uint32_t* set = &m_port->SET; + volatile uint32_t* clr = &m_port->CLEAR; - // Low 450ns - 14,4 tick - *clr = m_pin; - __asm volatile ( - "nop; nop; nop; nop; nop;" - ); - } else { // ZERO - // High 400ns - 12,8 tick - *set = m_pin; - __asm volatile ( - "nop; nop; nop; nop; nop; nop;" - ); + uint8_t* ptr = pixels; + uint8_t* end = ptr + numBytes; + uint8_t p = *ptr++; + uint8_t bitMask = 0x80; + + noInterrupts(); + + while (1) { + if (p & bitMask) { // ONE + // High 800ns - 25,6 tick + *set = m_pin; + __asm volatile ( + "nop; nop; nop; nop; nop; nop; nop; nop;" + "nop; nop; nop; nop; nop; nop; nop; nop;" + "nop; nop; nop; nop;" + ); - // Low 850ns - 27,2 tick - *clr = m_pin; - __asm volatile ( - "nop; nop; nop; nop; nop; nop; nop; nop;" - "nop; nop; nop;" - ); - } + // Low 450ns - 14,4 tick + *clr = m_pin; + __asm volatile ( + "nop; nop; nop; nop; nop;" + ); + } else { // ZERO + // High 400ns - 12,8 tick + *set = m_pin; + __asm volatile ( + "nop; nop; nop; nop; nop; nop;" + ); - if (bitMask >>= 1) { - // Move on to the next pixel - } - else { - if (ptr >= end) { - break; + // Low 850ns - 27,2 tick + *clr = m_pin; + __asm volatile ( + "nop; nop; nop; nop; nop; nop; nop; nop;" + "nop; nop; nop;" + ); + } + + if (bitMask >>= 1) { + // Move on to the next pixel + } + else { + if (ptr >= end) { + break; + } + p = *ptr++; + bitMask = 0x80; } - p = *ptr++; - bitMask = 0x80; } + interrupts(); } - interrupts(); } void NeoPixel::show(void) { diff --git a/libraries/SoftwareSerial/src/SoftwareSerial.cpp b/libraries/SoftwareSerial/src/SoftwareSerial.cpp index bf7dacf..6ebd158 100644 --- a/libraries/SoftwareSerial/src/SoftwareSerial.cpp +++ b/libraries/SoftwareSerial/src/SoftwareSerial.cpp @@ -228,6 +228,18 @@ void SoftwareSerial::begin(long speed) // delays are empirical values here _rx_delay_centering = _rx_delay_intrabit = _rx_delay_stopbit = _tx_delay = 0; + // if pins exceeds the total number of pins, return with zero delays - it blocks further library work + if ((_transmitPin >= pinCommonQty())) + { + ErrorMsgHandler("SoftwareSerial.begin(): Tx pin number exceeds the total number of pins"); + return; + } + if ((_receivePin >= pinCommonQty())) + { + ErrorMsgHandler("SoftwareSerial.begin(): Rx pin number exceeds the total number of pins"); + return; + } + // limit speed if (speed > MAX_SOFT_SERIAL_SPEED) speed = MAX_SOFT_SERIAL_SPEED; if (speed < MIN_SOFT_SERIAL_SPEED) speed = MIN_SOFT_SERIAL_SPEED; diff --git a/variants/elbear_ace_nano/variant.c b/variants/elbear_ace_nano/variant.c index 907e301..7f1d016 100644 --- a/variants/elbear_ace_nano/variant.c +++ b/variants/elbear_ace_nano/variant.c @@ -67,7 +67,13 @@ 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) { - GPIO_TypeDef* gpioNum = 0; + GPIO_TypeDef* gpioNum = NULL; + if (digPinNumber >= pinCommonQty()) + { + ErrorMsgHandler("digitalPinToPort(): pin number exceeds the total number of pins"); + return NULL; + } + // port 2 - led (22) if (digPinNumber == LED_BUILTIN) gpioNum = GPIO_2; @@ -85,20 +91,21 @@ GPIO_TypeDef* digitalPinToPort(uint32_t digPinNumber) // determines the pin address inside the port by the board pin number HAL_PinsTypeDef digitalPinToBitMask(uint32_t digPinNumber) { - if (digPinNumber < pinCommonQty()) + if (digPinNumber >= pinCommonQty()) { - 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; + ErrorMsgHandler("digitalPinToBitMask(): pin number exceeds the total number of pins"); + return NC; } - else - 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) diff --git a/variants/elbear_ace_uno/variant.c b/variants/elbear_ace_uno/variant.c index ef112c0..7cab048 100644 --- a/variants/elbear_ace_uno/variant.c +++ b/variants/elbear_ace_uno/variant.c @@ -65,7 +65,13 @@ const HAL_PinsTypeDef digitalPinToGpioPinArray[] = // 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 = 0; + 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; @@ -83,20 +89,21 @@ GPIO_TypeDef* digitalPinToPort(uint32_t digPinNumber) // determines the pin address inside the port by the board pin number HAL_PinsTypeDef digitalPinToBitMask(uint32_t digPinNumber) { - if (digPinNumber < pinCommonQty()) + if (digPinNumber >= pinCommonQty()) { - 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; + ErrorMsgHandler("digitalPinToBitMask(): pin number exceeds the total number of pins"); + return NC; } - else - 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) diff --git a/variants/elsomik/pins_arduino.h b/variants/elsomik/pins_arduino.h index f0ff4df..adebe90 100644 --- a/variants/elsomik/pins_arduino.h +++ b/variants/elsomik/pins_arduino.h @@ -95,13 +95,7 @@ static const uint8_t A7 = PIN_A7; // 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); // determines the pin address inside the port by the board pin number -static inline HAL_PinsTypeDef digitalPinToBitMask(uint32_t digitalPinNumber) -{ - if (digitalPinNumber >= P2_6) - return (HAL_PinsTypeDef)(1 << ((digitalPinNumber+6) & 0xF)); - else - return (HAL_PinsTypeDef)(1 << (digitalPinNumber & 0xF)); -} +HAL_PinsTypeDef digitalPinToBitMask(uint32_t digitalPinNumber); // total number of pins available for initialization static inline uint16_t pinCommonQty(void) { diff --git a/variants/elsomik/variant.c b/variants/elsomik/variant.c index 3480f52..5f51a41 100644 --- a/variants/elsomik/variant.c +++ b/variants/elsomik/variant.c @@ -23,6 +23,12 @@ GPIO_TypeDef *digitalPinToPort(uint32_t digitalPinNumber) { + if (digitalPinNumber >= pinCommonQty()) + { + ErrorMsgHandler("digitalPinToPort(): pin number exceeds the total number of pins"); + return NULL; + } + if (digitalPinNumber <= P0_15) return GPIO_0; else if ((digitalPinNumber >= P1_0) && (digitalPinNumber <= P1_15)) @@ -33,6 +39,21 @@ GPIO_TypeDef *digitalPinToPort(uint32_t digitalPinNumber) return NULL; } +// determines the pin address inside the port by the board pin number +HAL_PinsTypeDef digitalPinToBitMask(uint32_t digitalPinNumber) +{ + if (digitalPinNumber >= PINS_COMMON_QTY) + { + ErrorMsgHandler("digitalPinToBitMask(): pin number exceeds the total number of pins"); + return NC; + } + + if (digitalPinNumber >= P2_6) + return (HAL_PinsTypeDef)(1 << ((digitalPinNumber+6) & 0xF)); + else + return (HAL_PinsTypeDef)(1 << (digitalPinNumber & 0xF)); +} + // the function returns a reference to the OUTPUT address of the GPIO register volatile uint32_t *portOutputRegister(GPIO_TypeDef *GPIO_x) { diff --git a/variants/start/pins_arduino.h b/variants/start/pins_arduino.h index 1c0907c..cbca102 100644 --- a/variants/start/pins_arduino.h +++ b/variants/start/pins_arduino.h @@ -107,10 +107,7 @@ static const uint8_t A7 = PIN_A7; // 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); // determines the pin address inside the port by the board pin number -static inline HAL_PinsTypeDef digitalPinToBitMask(uint32_t digitalPinNumber) -{ - return (HAL_PinsTypeDef)(1 << (digitalPinNumber & 0xF)); -} +HAL_PinsTypeDef digitalPinToBitMask(uint32_t digitalPinNumber); // total number of pins available for initialization static inline uint16_t pinCommonQty(void) { diff --git a/variants/start/variant.c b/variants/start/variant.c index c19e64f..dbd66cb 100644 --- a/variants/start/variant.c +++ b/variants/start/variant.c @@ -23,22 +23,31 @@ GPIO_TypeDef *digitalPinToPort(uint32_t digitalPinNumber) { - if (digitalPinNumber < 16u) + GPIO_TypeDef* port = NULL; + if (digitalPinNumber < pinCommonQty()) { - return GPIO_0; - } - else if ((digitalPinNumber >= 16u) && (digitalPinNumber < 32u)) - { - return GPIO_1; - } - else if ((digitalPinNumber >= 32u) && (digitalPinNumber < 40u)) - { - return GPIO_2; + if (digitalPinNumber < 16u) + port = GPIO_0; + else if ((digitalPinNumber >= 16u) && (digitalPinNumber < 32u)) + port = GPIO_1; + else if ((digitalPinNumber >= 32u) && (digitalPinNumber < 40u)) + port = GPIO_2; } else + ErrorMsgHandler("digitalPinToPort(): pin number exceeds the total number of pins"); + return port; +} + +// determines the pin address inside the port by the board pin number +HAL_PinsTypeDef digitalPinToBitMask(uint32_t digitalPinNumber) +{ + if (digitalPinNumber >= pinCommonQty()) { - return NULL; + ErrorMsgHandler("digitalPinToBitMask(): pin number exceeds the total number of pins"); + return NC; } + + return (HAL_PinsTypeDef)(1 << (digitalPinNumber & 0xF)); } // the function returns a reference to the OUTPUT address of the GPIO register