Yes
all code
const int pinA = PB12;
const int pinB = PB13;
const long decimalOutA = 0b0001000000000000;
const long decimalOutB = 0b0010000000000000;
volatile long rotaryHalfSteps = 0;
volatile uint8_t int0signal = 0;
volatile uint8_t int1signal = 0;
void int0()
{
int0signal = GPIOB->regs->IDR & decimalOutA ? 1 : 0;
if ( int0signal == int1signal )
rotaryHalfSteps++;
else
rotaryHalfSteps--;
}
void int1()
{
int1signal = GPIOB->regs->IDR & decimalOutB ? 1 : 0;
if ( int0signal == int1signal )
rotaryHalfSteps--;
else
rotaryHalfSteps++;
}
void setup()
{
pinMode(pinA, INPUT_PULLUP);
pinMode(pinB, INPUT_PULLUP);
attachInterrupt(digitalPinToInterrupt(pinA), int0, CHANGE);
attachInterrupt(digitalPinToInterrupt(pinB), int1, CHANGE);
Serial.begin(115200);
}
void loop()
{
long actualRotaryTicks = (rotaryHalfSteps / 2);
Serial.println(actualRotaryTicks);
delay(50);
}