From a8b2cf3b0c81bc6346d0bbca3f67186fa444be75 Mon Sep 17 00:00:00 2001 From: klassents Date: Fri, 20 Dec 2024 11:43:19 +0700 Subject: [PATCH] =?UTF-8?q?=D0=B8=D0=B7=D0=BC=D0=B5=D0=BD=D0=B8=D0=BB?= =?UTF-8?q?=D0=B0=20=D0=BD=D0=B0=D0=B7=D0=B2=D0=B0=D0=BD=D0=B8=D0=B5=20?= =?UTF-8?q?=D0=B4=D0=B5=D1=84=D0=B0=D0=B9=D0=BD=D0=B0=20=D0=BF=D1=80=D0=BE?= =?UTF-8?q?=20=D0=BA=D0=BE=D0=BB-=D0=B2=D0=BE=20=D0=BF=D1=80=D0=B5=D1=80?= =?UTF-8?q?=D1=8B=D0=B2=D0=B0=D0=BD=D0=B8=D0=B9.=20=D0=92=20wiring=5Fpriva?= =?UTF-8?q?te.h=20=D0=BF=D0=BE=D0=B4=D1=82=D1=8F=D0=B3=D0=B8=D0=B2=D0=B0?= =?UTF-8?q?=D1=8E=20=D0=B4=D0=B5=D1=84=D0=B0=D0=B9=D0=BD=20=D0=B8=D0=B7=20?= =?UTF-8?q?pins=5Farduino?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- cores/arduino/WInterrupts.c | 24 +++++++++++----------- cores/arduino/wiring_private.h | 2 +- libraries/SPI/src/SPI.cpp | 8 ++++---- variants/elbear_ace_uno/pins_arduino.h | 3 ++- variants/elbear_ace_uno/variant.c | 10 ++++----- variants/start/pins_arduino.h | 3 ++- variants/start/variant.c | 28 +++++++++++++------------- 7 files changed, 40 insertions(+), 38 deletions(-) diff --git a/cores/arduino/WInterrupts.c b/cores/arduino/WInterrupts.c index 93a9353..6b4783f 100644 --- a/cores/arduino/WInterrupts.c +++ b/cores/arduino/WInterrupts.c @@ -27,24 +27,24 @@ void noInterrupts(void) } // we can provide no more than 8 interrupts on gpio at the same time -static volatile voidFuncPtr intFunc[EXTERNAL_NUM_INTERRUPTS] = +static volatile voidFuncPtr intFunc[EXTERNAL_INTERRUPTS_QTY] = { -#if EXTERNAL_NUM_INTERRUPTS > 7 +#if EXTERNAL_INTERRUPTS_QTY > 7 nothing, #endif -#if EXTERNAL_NUM_INTERRUPTS > 6 +#if EXTERNAL_INTERRUPTS_QTY > 6 nothing, #endif -#if EXTERNAL_NUM_INTERRUPTS > 5 +#if EXTERNAL_INTERRUPTS_QTY > 5 nothing, #endif -#if EXTERNAL_NUM_INTERRUPTS > 4 +#if EXTERNAL_INTERRUPTS_QTY > 4 nothing, #endif -#if EXTERNAL_NUM_INTERRUPTS > 3 +#if EXTERNAL_INTERRUPTS_QTY > 3 nothing, #endif -#if EXTERNAL_NUM_INTERRUPTS > 2 +#if EXTERNAL_INTERRUPTS_QTY > 2 nothing, #endif nothing, @@ -54,7 +54,7 @@ static volatile voidFuncPtr intFunc[EXTERNAL_NUM_INTERRUPTS] = void attachInterrupt(uint8_t interruptNum, void (*userFunc)(void), int mode) { // if the interrupt number does not exceed the total number - if(interruptNum < EXTERNAL_NUM_INTERRUPTS) + if(interruptNum < EXTERNAL_INTERRUPTS_QTY) { intFunc[interruptNum] = userFunc; // save pointer to irq handler @@ -85,7 +85,7 @@ void attachInterrupt(uint8_t interruptNum, void (*userFunc)(void), int mode) void detachInterrupt(uint8_t interruptNum) { - if(interruptNum < EXTERNAL_NUM_INTERRUPTS) + if(interruptNum < EXTERNAL_INTERRUPTS_QTY) { // disable the interrupt in line HAL_GPIO_DeInitInterruptLine(interruptToGpioIntLine(interruptNum)); @@ -98,7 +98,7 @@ void detachInterrupt(uint8_t interruptNum) // disable single interrupt void disableInterrupt(uint8_t interruptNum) { - if(interruptNum < EXTERNAL_NUM_INTERRUPTS) + if(interruptNum < EXTERNAL_INTERRUPTS_QTY) // disable gpio interrupt line GPIO_IRQ_LINE_DISABLE(interruptToGpioIntLine(interruptNum)); } @@ -106,7 +106,7 @@ void disableInterrupt(uint8_t interruptNum) // enable single interrupt void enableInterrupt(uint8_t interruptNum) { - if(interruptNum < EXTERNAL_NUM_INTERRUPTS) + if(interruptNum < EXTERNAL_INTERRUPTS_QTY) // enable gpio interrupt line GPIO_IRQ_LINE_ENABLE(interruptToGpioIntLine(interruptNum)); } @@ -115,7 +115,7 @@ void enableInterrupt(uint8_t interruptNum) void __attribute__((noinline, section(".ram_text"), optimize("O3"))) gpio_interrupt_handler(void) { // go through all the interrupts and call the handler for the triggered line - for (uint8_t i = 0; i < EXTERNAL_NUM_INTERRUPTS; i++) + for (uint8_t i = 0; i < EXTERNAL_INTERRUPTS_QTY; i++) { if (GPIO_IRQ_LINE_STATE(interruptToGpioIntLine(i))) intFunc[i](); diff --git a/cores/arduino/wiring_private.h b/cores/arduino/wiring_private.h index 970a7cc..d498ef3 100644 --- a/cores/arduino/wiring_private.h +++ b/cores/arduino/wiring_private.h @@ -11,7 +11,7 @@ extern "C"{ #endif // available interrupts number -#define EXTERNAL_NUM_INTERRUPTS 7 +#define EXTERNAL_NUM_INTERRUPTS EXTERNAL_INTERRUPTS_QTY typedef void (*voidFuncPtr)(void); diff --git a/libraries/SPI/src/SPI.cpp b/libraries/SPI/src/SPI.cpp index ad30a09..afa308e 100644 --- a/libraries/SPI/src/SPI.cpp +++ b/libraries/SPI/src/SPI.cpp @@ -95,7 +95,7 @@ void SPIClass::end() void SPIClass::usingInterrupt(uint8_t interruptNumber) { - if(interruptNumber < EXTERNAL_NUM_INTERRUPTS) + if(interruptNumber < EXTERNAL_INTERRUPTS_QTY) { noInterrupts(); // prevent transactionBegin interruptMask |= (1 << interruptNumber); // add new interrupt to mask @@ -107,7 +107,7 @@ void SPIClass::usingInterrupt(uint8_t interruptNumber) void SPIClass::notUsingInterrupt(uint8_t interruptNumber) { - if(interruptNumber < EXTERNAL_NUM_INTERRUPTS) + if(interruptNumber < EXTERNAL_INTERRUPTS_QTY) { noInterrupts(); // prevent transactionBegin interruptMask &= ~(1< 0)) { - for (uint8_t i = 0; i < EXTERNAL_NUM_INTERRUPTS; i++) + for (uint8_t i = 0; i < EXTERNAL_INTERRUPTS_QTY; i++) { if (interruptMask & (1 << i)) // disable every interrupt by it's number @@ -234,7 +234,7 @@ void SPIClass::endTransaction(void) // enable interrupts in use if (spiInUse && (interruptMode > 0)) { - for (uint8_t i = 0; i < EXTERNAL_NUM_INTERRUPTS; i++) + for (uint8_t i = 0; i < EXTERNAL_INTERRUPTS_QTY; i++) { if (interruptMask & (1 << i)) // enable every interrupt in use by it's number diff --git a/variants/elbear_ace_uno/pins_arduino.h b/variants/elbear_ace_uno/pins_arduino.h index b01aee9..9e02c16 100644 --- a/variants/elbear_ace_uno/pins_arduino.h +++ b/variants/elbear_ace_uno/pins_arduino.h @@ -111,7 +111,8 @@ static const uint8_t SCL = PIN_WIRE_SCL; #define WIRE_FREQ_1000K 1000000 // interrupts -extern uint8_t interruptInfo[EXTERNAL_NUM_INTERRUPTS][3]; +#define EXTERNAL_INTERRUPTS_QTY 7 +extern uint8_t interruptInfo[EXTERNAL_INTERRUPTS_QTY][3]; // determines the board pin number by interrupt number #define interruptToDigitalPin(interruptNum) (interruptInfo[interruptNum][0]) // determines gpio interrupt line by interrupt number diff --git a/variants/elbear_ace_uno/variant.c b/variants/elbear_ace_uno/variant.c index a928028..1d5e306 100644 --- a/variants/elbear_ace_uno/variant.c +++ b/variants/elbear_ace_uno/variant.c @@ -224,7 +224,7 @@ HAL_TIMER32_CHANNEL_IndexTypeDef pwmPinToTimerChannel(uint32_t digPinNumber) // ---------------------- interrupts ---------------------- // // interrupt table is stored in ram to improve performance // index = interrupt number. In each row {digitalPinNumber, IntLineValue, IntMuxValue} -uint8_t interruptInfo[EXTERNAL_NUM_INTERRUPTS][3] = +uint8_t interruptInfo[EXTERNAL_INTERRUPTS_QTY][3] = { { 2, GPIO_LINE_2, GPIO_MUX_LINE_2_PORT0_10}, // INT0 { 3, GPIO_LINE_0, GPIO_MUX_LINE_0_PORT0_0}, // INT1 @@ -237,7 +237,7 @@ uint8_t interruptInfo[EXTERNAL_NUM_INTERRUPTS][3] = int8_t digitalPinToGpioIntMux(uint8_t digPinNumber) { - for (uint8_t i = 0; i < EXTERNAL_NUM_INTERRUPTS; i++) + for (uint8_t i = 0; i < EXTERNAL_INTERRUPTS_QTY; i++) { if (interruptInfo[i][0] == digPinNumber) return interruptInfo[i][2]; @@ -246,7 +246,7 @@ int8_t digitalPinToGpioIntMux(uint8_t digPinNumber) } int8_t digitalPinToGpioIntLine(uint8_t digPinNumber) { - for (uint8_t i = 0; i < EXTERNAL_NUM_INTERRUPTS; i++) + for (uint8_t i = 0; i < EXTERNAL_INTERRUPTS_QTY; i++) { if (interruptInfo[i][0] == digPinNumber) return interruptInfo[i][1]; @@ -256,7 +256,7 @@ int8_t digitalPinToGpioIntLine(uint8_t digPinNumber) int8_t gpioIntLineToInterrupt(uint32_t gpioIntLine) { - for (uint8_t i = 0; i < EXTERNAL_NUM_INTERRUPTS; i++) + for (uint8_t i = 0; i < EXTERNAL_INTERRUPTS_QTY; i++) { if (interruptInfo[i][1] == gpioIntLine) return i; @@ -266,7 +266,7 @@ int8_t gpioIntLineToInterrupt(uint32_t gpioIntLine) int8_t digitalPinToInterrupt(uint32_t digPinNumber) { - for (uint8_t i = 0; i < EXTERNAL_NUM_INTERRUPTS; i++) + for (uint8_t i = 0; i < EXTERNAL_INTERRUPTS_QTY; i++) { if (interruptInfo[i][0] == digPinNumber) return i; diff --git a/variants/start/pins_arduino.h b/variants/start/pins_arduino.h index ada97f0..5eb768b 100644 --- a/variants/start/pins_arduino.h +++ b/variants/start/pins_arduino.h @@ -158,7 +158,8 @@ static const uint8_t SCL = PIN_WIRE_SCL; #define WIRE_FREQ_1000K 1000000 // interrupts -extern uint8_t interruptInfo[EXTERNAL_NUM_INTERRUPTS][3]; +#define EXTERNAL_INTERRUPTS_QTY 7 +extern uint8_t interruptInfo[EXTERNAL_INTERRUPTS_QTY][3]; // determines the board pin number by interrupt number #define interruptToDigitalPin(interruptNum) (interruptInfo[interruptNum][0]) // determines gpio interrupt line by interrupt number diff --git a/variants/start/variant.c b/variants/start/variant.c index 6df725a..805758b 100644 --- a/variants/start/variant.c +++ b/variants/start/variant.c @@ -164,27 +164,27 @@ HAL_TIMER32_CHANNEL_IndexTypeDef pwmPinToTimerChannel(uint32_t digPinNumber) case 3: return TIMER32_CHANNEL_3; default: - return 255; + return NULL; } } // ---------------------- interrupts ---------------------- // // interrupt table is stored in ram to improve performance // index = interrupt number. In each row {digitalPinNumber, IntLineValue, IntMuxValue} -uint8_t interruptInfo[EXTERNAL_NUM_INTERRUPTS][3] = - { - {2, GPIO_LINE_2, GPIO_MUX_LINE_2_PORT0_10}, // INT0 - {3, GPIO_LINE_0, GPIO_MUX_LINE_0_PORT0_0}, // INT1 - {4, GPIO_LINE_4, GPIO_MUX_LINE_4_PORT0_8}, // INT2 - {5, GPIO_LINE_1, GPIO_MUX_LINE_1_PORT0_1}, // INT3 - {8, GPIO_LINE_5, GPIO_MUX_LINE_5_PORT1_9}, // INT4 - {9, GPIO_LINE_3, GPIO_MUX_LINE_3_PORT0_3}, // INT5 - {BTN_BUILTIN, GPIO_LINE_6, GPIO_MUX_LINE_6_PORT2_6}, // INT6 (button) +uint8_t interruptInfo[EXTERNAL_INTERRUPTS_QTY][3] = +{ + {2, GPIO_LINE_2, GPIO_MUX_LINE_2_PORT0_10}, // INT0 + {3, GPIO_LINE_0, GPIO_MUX_LINE_0_PORT0_0}, // INT1 + {4, GPIO_LINE_4, GPIO_MUX_LINE_4_PORT0_8}, // INT2 + {5, GPIO_LINE_1, GPIO_MUX_LINE_1_PORT0_1}, // INT3 + {8, GPIO_LINE_5, GPIO_MUX_LINE_5_PORT1_9}, // INT4 + {9, GPIO_LINE_3, GPIO_MUX_LINE_3_PORT0_3}, // INT5 + {BTN_BUILTIN, GPIO_LINE_6, GPIO_MUX_LINE_6_PORT2_6}, // INT6 (button) // todo кнопка на этом пине?? }; int8_t digitalPinToGpioIntMux(uint8_t digPinNumber) { - for (uint8_t i = 0; i < EXTERNAL_NUM_INTERRUPTS; i++) + for (uint8_t i = 0; i < EXTERNAL_INTERRUPTS_QTY; i++) { if (interruptInfo[i][0] == digPinNumber) return interruptInfo[i][2]; @@ -193,7 +193,7 @@ int8_t digitalPinToGpioIntMux(uint8_t digPinNumber) } int8_t digitalPinToGpioIntLine(uint8_t digPinNumber) { - for (uint8_t i = 0; i < EXTERNAL_NUM_INTERRUPTS; i++) + for (uint8_t i = 0; i < EXTERNAL_INTERRUPTS_QTY; i++) { if (interruptInfo[i][0] == digPinNumber) return interruptInfo[i][1]; @@ -203,7 +203,7 @@ int8_t digitalPinToGpioIntLine(uint8_t digPinNumber) int8_t gpioIntLineToInterrupt(uint32_t gpioIntLine) { - for (uint8_t i = 0; i < EXTERNAL_NUM_INTERRUPTS; i++) + for (uint8_t i = 0; i < EXTERNAL_INTERRUPTS_QTY; i++) { if (interruptInfo[i][1] == gpioIntLine) return i; @@ -213,7 +213,7 @@ int8_t gpioIntLineToInterrupt(uint32_t gpioIntLine) int8_t digitalPinToInterrupt(uint32_t digPinNumber) { - for (uint8_t i = 0; i < EXTERNAL_NUM_INTERRUPTS; i++) + for (uint8_t i = 0; i < EXTERNAL_INTERRUPTS_QTY; i++) { if (interruptInfo[i][0] == digPinNumber) return i;