изменила название дефайна про кол-во прерываний. В 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
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]();

View File

@ -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);

View File

@ -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<<interruptNumber); // delete interrupt from mask
@ -122,7 +122,7 @@ void SPIClass::beginTransaction(SPISettings settings)
// disable interrupts in use if necessary
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))
// 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

View File

@ -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

View File

@ -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;

View File

@ -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

View File

@ -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;