изменила название дефайна про кол-во прерываний. В wiring_private.h подтягиваю дефайн из pins_arduino

This commit is contained in:
klassents 2024-12-20 11:43:19 +07:00
parent 65d07edece
commit a8b2cf3b0c
7 changed files with 40 additions and 38 deletions

View File

@ -27,24 +27,24 @@ void noInterrupts(void)
} }
// we can provide no more than 8 interrupts on gpio at the same time // 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, nothing,
#endif #endif
#if EXTERNAL_NUM_INTERRUPTS > 6 #if EXTERNAL_INTERRUPTS_QTY > 6
nothing, nothing,
#endif #endif
#if EXTERNAL_NUM_INTERRUPTS > 5 #if EXTERNAL_INTERRUPTS_QTY > 5
nothing, nothing,
#endif #endif
#if EXTERNAL_NUM_INTERRUPTS > 4 #if EXTERNAL_INTERRUPTS_QTY > 4
nothing, nothing,
#endif #endif
#if EXTERNAL_NUM_INTERRUPTS > 3 #if EXTERNAL_INTERRUPTS_QTY > 3
nothing, nothing,
#endif #endif
#if EXTERNAL_NUM_INTERRUPTS > 2 #if EXTERNAL_INTERRUPTS_QTY > 2
nothing, nothing,
#endif #endif
nothing, nothing,
@ -54,7 +54,7 @@ static volatile voidFuncPtr intFunc[EXTERNAL_NUM_INTERRUPTS] =
void attachInterrupt(uint8_t interruptNum, void (*userFunc)(void), int mode) void attachInterrupt(uint8_t interruptNum, void (*userFunc)(void), int mode)
{ {
// if the interrupt number does not exceed the total number // 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 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) void detachInterrupt(uint8_t interruptNum)
{ {
if(interruptNum < EXTERNAL_NUM_INTERRUPTS) if(interruptNum < EXTERNAL_INTERRUPTS_QTY)
{ {
// disable the interrupt in line // disable the interrupt in line
HAL_GPIO_DeInitInterruptLine(interruptToGpioIntLine(interruptNum)); HAL_GPIO_DeInitInterruptLine(interruptToGpioIntLine(interruptNum));
@ -98,7 +98,7 @@ void detachInterrupt(uint8_t interruptNum)
// disable single interrupt // disable single interrupt
void disableInterrupt(uint8_t interruptNum) void disableInterrupt(uint8_t interruptNum)
{ {
if(interruptNum < EXTERNAL_NUM_INTERRUPTS) if(interruptNum < EXTERNAL_INTERRUPTS_QTY)
// disable gpio interrupt line // disable gpio interrupt line
GPIO_IRQ_LINE_DISABLE(interruptToGpioIntLine(interruptNum)); GPIO_IRQ_LINE_DISABLE(interruptToGpioIntLine(interruptNum));
} }
@ -106,7 +106,7 @@ void disableInterrupt(uint8_t interruptNum)
// enable single interrupt // enable single interrupt
void enableInterrupt(uint8_t interruptNum) void enableInterrupt(uint8_t interruptNum)
{ {
if(interruptNum < EXTERNAL_NUM_INTERRUPTS) if(interruptNum < EXTERNAL_INTERRUPTS_QTY)
// enable gpio interrupt line // enable gpio interrupt line
GPIO_IRQ_LINE_ENABLE(interruptToGpioIntLine(interruptNum)); 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) 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 // 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))) if (GPIO_IRQ_LINE_STATE(interruptToGpioIntLine(i)))
intFunc[i](); intFunc[i]();

View File

@ -11,7 +11,7 @@ extern "C"{
#endif #endif
// available interrupts number // available interrupts number
#define EXTERNAL_NUM_INTERRUPTS 7 #define EXTERNAL_NUM_INTERRUPTS EXTERNAL_INTERRUPTS_QTY
typedef void (*voidFuncPtr)(void); typedef void (*voidFuncPtr)(void);

View File

@ -95,7 +95,7 @@ void SPIClass::end()
void SPIClass::usingInterrupt(uint8_t interruptNumber) void SPIClass::usingInterrupt(uint8_t interruptNumber)
{ {
if(interruptNumber < EXTERNAL_NUM_INTERRUPTS) if(interruptNumber < EXTERNAL_INTERRUPTS_QTY)
{ {
noInterrupts(); // prevent transactionBegin noInterrupts(); // prevent transactionBegin
interruptMask |= (1 << interruptNumber); // add new interrupt to mask interruptMask |= (1 << interruptNumber); // add new interrupt to mask
@ -107,7 +107,7 @@ void SPIClass::usingInterrupt(uint8_t interruptNumber)
void SPIClass::notUsingInterrupt(uint8_t interruptNumber) void SPIClass::notUsingInterrupt(uint8_t interruptNumber)
{ {
if(interruptNumber < EXTERNAL_NUM_INTERRUPTS) if(interruptNumber < EXTERNAL_INTERRUPTS_QTY)
{ {
noInterrupts(); // prevent transactionBegin noInterrupts(); // prevent transactionBegin
interruptMask &= ~(1<<interruptNumber); // delete interrupt from mask interruptMask &= ~(1<<interruptNumber); // delete interrupt from mask
@ -122,7 +122,7 @@ void SPIClass::beginTransaction(SPISettings settings)
// disable interrupts in use if necessary // disable interrupts in use if necessary
if (spiInUse && (interruptMode > 0)) 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)) if (interruptMask & (1 << i))
// disable every interrupt by it's number // disable every interrupt by it's number
@ -234,7 +234,7 @@ void SPIClass::endTransaction(void)
// enable interrupts in use // enable interrupts in use
if (spiInUse && (interruptMode > 0)) 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)) if (interruptMask & (1 << i))
// enable every interrupt in use by it's number // enable every interrupt in use by it's number

View File

@ -111,7 +111,8 @@ static const uint8_t SCL = PIN_WIRE_SCL;
#define WIRE_FREQ_1000K 1000000 #define WIRE_FREQ_1000K 1000000
// interrupts // 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 // determines the board pin number by interrupt number
#define interruptToDigitalPin(interruptNum) (interruptInfo[interruptNum][0]) #define interruptToDigitalPin(interruptNum) (interruptInfo[interruptNum][0])
// determines gpio interrupt line by interrupt number // determines gpio interrupt line by interrupt number

View File

@ -224,7 +224,7 @@ HAL_TIMER32_CHANNEL_IndexTypeDef pwmPinToTimerChannel(uint32_t digPinNumber)
// ---------------------- interrupts ---------------------- // // ---------------------- interrupts ---------------------- //
// interrupt table is stored in ram to improve performance // interrupt table is stored in ram to improve performance
// index = interrupt number. In each row {digitalPinNumber, IntLineValue, IntMuxValue} // 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 { 2, GPIO_LINE_2, GPIO_MUX_LINE_2_PORT0_10}, // INT0
{ 3, GPIO_LINE_0, GPIO_MUX_LINE_0_PORT0_0}, // INT1 { 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) 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) if (interruptInfo[i][0] == digPinNumber)
return interruptInfo[i][2]; return interruptInfo[i][2];
@ -246,7 +246,7 @@ int8_t digitalPinToGpioIntMux(uint8_t digPinNumber)
} }
int8_t digitalPinToGpioIntLine(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) if (interruptInfo[i][0] == digPinNumber)
return interruptInfo[i][1]; return interruptInfo[i][1];
@ -256,7 +256,7 @@ int8_t digitalPinToGpioIntLine(uint8_t digPinNumber)
int8_t gpioIntLineToInterrupt(uint32_t gpioIntLine) 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) if (interruptInfo[i][1] == gpioIntLine)
return i; return i;
@ -266,7 +266,7 @@ int8_t gpioIntLineToInterrupt(uint32_t gpioIntLine)
int8_t digitalPinToInterrupt(uint32_t digPinNumber) 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) if (interruptInfo[i][0] == digPinNumber)
return i; return i;

View File

@ -158,7 +158,8 @@ static const uint8_t SCL = PIN_WIRE_SCL;
#define WIRE_FREQ_1000K 1000000 #define WIRE_FREQ_1000K 1000000
// interrupts // 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 // determines the board pin number by interrupt number
#define interruptToDigitalPin(interruptNum) (interruptInfo[interruptNum][0]) #define interruptToDigitalPin(interruptNum) (interruptInfo[interruptNum][0])
// determines gpio interrupt line by interrupt number // determines gpio interrupt line by interrupt number

View File

@ -164,27 +164,27 @@ HAL_TIMER32_CHANNEL_IndexTypeDef pwmPinToTimerChannel(uint32_t digPinNumber)
case 3: case 3:
return TIMER32_CHANNEL_3; return TIMER32_CHANNEL_3;
default: default:
return 255; return NULL;
} }
} }
// ---------------------- interrupts ---------------------- // // ---------------------- interrupts ---------------------- //
// interrupt table is stored in ram to improve performance // interrupt table is stored in ram to improve performance
// index = interrupt number. In each row {digitalPinNumber, IntLineValue, IntMuxValue} // 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 {2, GPIO_LINE_2, GPIO_MUX_LINE_2_PORT0_10}, // INT0
{3, GPIO_LINE_0, GPIO_MUX_LINE_0_PORT0_0}, // INT1 {3, GPIO_LINE_0, GPIO_MUX_LINE_0_PORT0_0}, // INT1
{4, GPIO_LINE_4, GPIO_MUX_LINE_4_PORT0_8}, // INT2 {4, GPIO_LINE_4, GPIO_MUX_LINE_4_PORT0_8}, // INT2
{5, GPIO_LINE_1, GPIO_MUX_LINE_1_PORT0_1}, // INT3 {5, GPIO_LINE_1, GPIO_MUX_LINE_1_PORT0_1}, // INT3
{8, GPIO_LINE_5, GPIO_MUX_LINE_5_PORT1_9}, // INT4 {8, GPIO_LINE_5, GPIO_MUX_LINE_5_PORT1_9}, // INT4
{9, GPIO_LINE_3, GPIO_MUX_LINE_3_PORT0_3}, // INT5 {9, GPIO_LINE_3, GPIO_MUX_LINE_3_PORT0_3}, // INT5
{BTN_BUILTIN, GPIO_LINE_6, GPIO_MUX_LINE_6_PORT2_6}, // INT6 (button) {BTN_BUILTIN, GPIO_LINE_6, GPIO_MUX_LINE_6_PORT2_6}, // INT6 (button) // todo кнопка на этом пине??
}; };
int8_t digitalPinToGpioIntMux(uint8_t digPinNumber) 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) if (interruptInfo[i][0] == digPinNumber)
return interruptInfo[i][2]; return interruptInfo[i][2];
@ -193,7 +193,7 @@ int8_t digitalPinToGpioIntMux(uint8_t digPinNumber)
} }
int8_t digitalPinToGpioIntLine(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) if (interruptInfo[i][0] == digPinNumber)
return interruptInfo[i][1]; return interruptInfo[i][1];
@ -203,7 +203,7 @@ int8_t digitalPinToGpioIntLine(uint8_t digPinNumber)
int8_t gpioIntLineToInterrupt(uint32_t gpioIntLine) 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) if (interruptInfo[i][1] == gpioIntLine)
return i; return i;
@ -213,7 +213,7 @@ int8_t gpioIntLineToInterrupt(uint32_t gpioIntLine)
int8_t digitalPinToInterrupt(uint32_t digPinNumber) 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) if (interruptInfo[i][0] == digPinNumber)
return i; return i;