Наткнулся на странное поведение... Представьте себе что нужно настроить пины РА14 и РА15 на вход с поддтяжкой, Т.е. PULLUP
Настраиваю такой последовательностью команд
Код: Выделить всё
case INPUT_PULLUP:
GPIO_OutCmd(port, pin_Map[pin].halPin, DISABLE);
GPIO_PullModeConfig(port, pin_Map[pin].halPin, GPIO_PullMode_PU);
break;
Но если приаттачить к этим пинам обработчики прерывания, начинается чехарда
Настраиваю такой последовательностью
Код: Выделить всё
static voidFuncPtr GPIO_Irq_Table[GPIO_PIN_NUMS]={NULL};
void attachInterrupt(PINS interruptNumber, voidFuncPtr callback, PinStatus mode)
{
GPIO_Irq_Table[interruptNumber] = callback;
if(mode == CHANGE)
{
GPIO_ITTypeConfig(pin_Map[interruptNumber].pPort, pin_Map[interruptNumber].halPin, GPIO_IntType_Edge);
GPIO_ITEdgeConfig(pin_Map[interruptNumber].pPort, pin_Map[interruptNumber].halPin, GPIO_IntEdge_Any);
}
else if (mode == FALLING)
{
GPIO_ITTypeConfig(pin_Map[interruptNumber].pPort, pin_Map[interruptNumber].halPin, GPIO_IntType_Edge);
GPIO_ITEdgeConfig(pin_Map[interruptNumber].pPort, pin_Map[interruptNumber].halPin, GPIO_IntEdge_Polarity);
GPIO_ITPolConfig(pin_Map[interruptNumber].pPort,pin_Map[interruptNumber].halPin, GPIO_IntPol_Negative);
}
else if (mode == RISING)
{
GPIO_ITTypeConfig(pin_Map[interruptNumber].pPort, pin_Map[interruptNumber].halPin, GPIO_IntType_Edge);
GPIO_ITEdgeConfig(pin_Map[interruptNumber].pPort, pin_Map[interruptNumber].halPin, GPIO_IntEdge_Polarity);
GPIO_ITPolConfig(pin_Map[interruptNumber].pPort,pin_Map[interruptNumber].halPin, GPIO_IntPol_Positive);
}
else if (mode == LOW)
{
GPIO_ITTypeConfig(pin_Map[interruptNumber].pPort, pin_Map[interruptNumber].halPin, GPIO_IntType_Level);
GPIO_ITPolConfig(pin_Map[interruptNumber].pPort,pin_Map[interruptNumber].halPin, GPIO_IntPol_Negative);
}
else if (mode == HIGH)
{
GPIO_ITTypeConfig(pin_Map[interruptNumber].pPort, pin_Map[interruptNumber].halPin, GPIO_IntType_Level);
GPIO_ITPolConfig(pin_Map[interruptNumber].pPort,pin_Map[interruptNumber].halPin, GPIO_IntPol_Positive);
}
GPIO_ITCmd(pin_Map[interruptNumber].pPort, pin_Map[interruptNumber].halPin, ENABLE);
if (!GPIO_Interrupt_Init)
{
SetIrqHandler(IsrVect_IRQ_GPIO, GPIO_IRQManager,0x1);
GPIO_Interrupt_Init = true;
}
}
Код: Выделить всё
void GPIO_IRQManager()
{
for(uint8_t i = 0; i < GPIO_PIN_NUMS; i++)
{
if(GPIO_Irq_Table[i] == NULL) continue;
FlagStatus pinStat = GPIO_ITStatus(pin_Map[i].pPort, pin_Map[i].halPin);
if (pinStat == SET)
{
GPIO_ITStatusClear(pin_Map[i].pPort, pin_Map[i].halPin);
GPIO_Irq_Table[i]();
}
}
}
Код: Выделить всё
void isr_Enc_A()
{
digitalToggle(LED1);
digitalToggle(LED);
printf("Enc_A \n\r");
}
void isr_Enc_B()
{
digitalToggle(LED2);
digitalToggle(LED);
printf("Enc_B \n\r");
}
Что я делаю не так?
