diff --git a/cores/arduino/WInterrupts.c b/cores/arduino/WInterrupts.c index 64bf587..78bcd08 100644 --- a/cores/arduino/WInterrupts.c +++ b/cores/arduino/WInterrupts.c @@ -19,13 +19,13 @@ static void nothing(void) // enable global interrupts void interrupts(void) { - HAL_IRQ_EnableInterrupts(); + GLOBAL_IRQ_ENABLE(); } // disable global interrupts void noInterrupts(void) { - HAL_IRQ_DisableInterrupts(); + GLOBAL_IRQ_DISABLE(); } // we can provide no more than 8 interrupts on gpio at the same time diff --git a/cores/arduino/board.cpp b/cores/arduino/board.cpp index 4b06378..04bfa4c 100644 --- a/cores/arduino/board.cpp +++ b/cores/arduino/board.cpp @@ -27,8 +27,6 @@ void post_init(void) { // enable global interrupts by default interrupts(); - - ((GPIO_0)->SET = (GPIO_PIN_0)); } // --------------------- other --------------------- // diff --git a/cores/arduino/trap_handler.c b/cores/arduino/trap_handler.c index 712913c..9e6fc21 100644 --- a/cores/arduino/trap_handler.c +++ b/cores/arduino/trap_handler.c @@ -1,4 +1,5 @@ #include "mik32_hal_irq.h" +#include "wiring_LL.h" // isr functions extern void serial_handler_wrapper(uint8_t uartNumInt); @@ -33,5 +34,5 @@ void __attribute__((noinline, section(".ram_text"))) trap_handler(void) wire_handler_wrapper(); // reset all interrupts - HAL_EPIC_Clear(0xFFFFFFFF); + EPIC_CLEAR_ALL(); } diff --git a/cores/arduino/wiring_LL.h b/cores/arduino/wiring_LL.h index 84ba3c7..a635e5f 100644 --- a/cores/arduino/wiring_LL.h +++ b/cores/arduino/wiring_LL.h @@ -4,30 +4,57 @@ #include "mik32_hal_irq.h" #include "mik32_hal_gpio.h" #include "mik32_hal_scr1_timer.h" +#include "mik32_hal_timer16.h" -// ----------------- Systick ----------------- // +// ----------------- COMMON ----------------- // +// convert pin mask from HAL_PinsTypeDef to pin number +#define PIN_MASK_TO_PIN_NUMBER(mask) \ +({ \ + uint8_t pos; \ + for (pos = 0; pos < 16; pos++) \ + if ((mask >> pos) & 1) \ + break; \ + pos; \ +}) + +// ----------------- SYSTICK ----------------- // // get ticks from systick -#define SYSTICK_GET_TICKS() ((uint64_t)(SCR1_TIMER->MTIMEH)<<32 | SCR1_TIMER->MTIME) +#define SYSTICK_GET_TICKS() ((uint64_t)(SCR1_TIMER->MTIMEH)<<32 | SCR1_TIMER->MTIME) +// ----------------- TIMER16 ----------------- // +#define TIM16_DISABLE(htim16) (htim16.Instance->CR &= ~TIMER16_CR_ENABLE_M) +#define TIM16_CLEAR_INT_MASK(htim16, intMask) (htim16.Instance->ICR = intMask) +#define TIM16_GET_ARRM_INT_STATUS(htim16) ((bool)((htim16.Instance->ISR & htim16.Instance->IER) & TIMER16_ISR_ARR_MATCH_M)) + +// ----------------- EPIC ----------------- // +#define EPIC_LEVEL_CLEAR_BY_MASK(mask) (EPIC->MASK_LEVEL_CLEAR |= mask) +#define EPIC_CLEAR_ALL() (EPIC->CLEAR = 0xFFFFFFFF) // ----------------- IRQ ----------------- // -#define GLOBAL_IRQ_DISABLE() (clear_csr(mie, MIE_MEIE)) -#define GLOBAL_IRQ_ENABLE() set_csr(mstatus, MSTATUS_MIE); \ - set_csr(mie, MIE_MEIE) +#define GLOBAL_IRQ_DISABLE() (clear_csr(mie, MIE_MEIE)) +#define GLOBAL_IRQ_ENABLE() set_csr(mstatus, MSTATUS_MIE); \ + set_csr(mie, MIE_MEIE) // ----------------- GPIO ----------------- // -#define GPIO_SET_PIN(GPIO_x, pin) ((GPIO_x)->SET = (pin)) -#define GPIO_CLEAR_PIN(GPIO_x, pin) ((GPIO_x)->CLEAR = (pin)) -#define GPIO_READ_PIN(GPIO_x, pin) (((GPIO_x)->SET & (pin)) != (uint32_t)GPIO_PIN_LOW ? GPIO_PIN_HIGH : GPIO_PIN_LOW) +#define GPIO_SET_PIN(GPIO_x, pinMask) ((GPIO_x)->SET = (pinMask)) +#define GPIO_CLEAR_PIN(GPIO_x, pinMask) ((GPIO_x)->CLEAR = (pinMask)) +#define GPIO_TOGGLE_PIN(GPIO_x, pinMask) ((GPIO_x)->OUTPUT_ ^= pinMask) +#define GPIO_READ_PIN(GPIO_x, pinMask) (((GPIO_x)->SET & (pinMask)) != (uint32_t)GPIO_PIN_LOW ? GPIO_PIN_HIGH : GPIO_PIN_LOW) +// get pin state by it's number +#define GPIO_GET_PIN_STATE(GPIO_x, pinNumber) (((GPIO_x)->OUTPUT_ >> pinNumber) & 0b1) // ----------------- GPIO IRQ ----------------- // -#define GPIO_IRQ_LINE_ENABLE(lineMask) ( GPIO_IRQ->ENABLE_SET = (1 << (lineMask >> GPIO_IRQ_LINE_S)) ) -#define GPIO_IRQ_LINE_DISABLE(lineMask) ( GPIO_IRQ->ENABLE_CLEAR = (1 << (lineMask >> GPIO_IRQ_LINE_S)) ) -#define GPIO_IRQ_LINE_STATE(lineMask) ((GPIO_IRQ->INTERRUPT & (1 << (lineMask >> GPIO_IRQ_LINE_S))) != 0) -#define GPIO_IRQ_CLEAR_ALL() ( GPIO_IRQ->CLEAR = 0b11111111) +#define GPIO_IRQ_LINE_ENABLE(lineMask) ( GPIO_IRQ->ENABLE_SET = (1 << (lineMask >> GPIO_IRQ_LINE_S)) ) +#define GPIO_IRQ_LINE_DISABLE(lineMask) ( GPIO_IRQ->ENABLE_CLEAR = (1 << (lineMask >> GPIO_IRQ_LINE_S)) ) +#define GPIO_IRQ_LINE_STATE(lineMask) ((GPIO_IRQ->INTERRUPT & (1 << (lineMask >> GPIO_IRQ_LINE_S))) != 0) +#define GPIO_IRQ_CLEAR_ALL() ( GPIO_IRQ->CLEAR = 0b11111111) // ----------------- PIN CONFIG ----------------- // -// return config of pin with pinShift(0...16) in portReg (config, pupd, ds for ports 0...2) -#define PIN_GET_PAD_CONFIG(portReg, pinShift) ((PAD_CONFIG->portReg >> (pinShift<<1)) & 0b11) +// return config of pin with pinNumber(0...16) in portReg (config, pupd, ds for ports 0...2) +#define PIN_GET_PAD_CONFIG(portReg, pinNumber) ((PAD_CONFIG->portReg >> (pinNumber<<1)) & 0b11) +#define PIN_SET_PAD_CONFIG(portReg, pinNumber, value) (PAD_CONFIG->portReg = (PAD_CONFIG->portReg & (~PAD_CONFIG_PIN_M(pinNumber))) \ + | PAD_CONFIG_PIN(pinNumber, value)) + + #endif /* _WIRING_LL_H_ */ \ No newline at end of file diff --git a/libraries/SoftwareSerial/src/SoftwareSerial.cpp b/libraries/SoftwareSerial/src/SoftwareSerial.cpp index 18d9b41..001eb0b 100644 --- a/libraries/SoftwareSerial/src/SoftwareSerial.cpp +++ b/libraries/SoftwareSerial/src/SoftwareSerial.cpp @@ -198,10 +198,15 @@ void SoftwareSerial::setRX(uint8_t rx) // attach interrupt to rx pin if available attachInterrupt(digitalPinToInterrupt(_receivePin), softSerial_handler_wrapper, _inverse_logic ? RISING : FALLING); + // turn on pull up for rx if logic is not inverse if (!_inverse_logic) - // turn on pull up for rx if logic is not inverse - HAL_GPIO_PinConfig((GPIO_TypeDef *)_receivePortRegister, (HAL_PinsTypeDef)_receiveBitMask, - HAL_GPIO_MODE_GPIO_INPUT, HAL_GPIO_PULL_UP, HAL_GPIO_DS_2MA); + { + uint8_t pinNumber = PIN_MASK_TO_PIN_NUMBER(_receiveBitMask); + if (((GPIO_TypeDef*)_receivePortRegister) == GPIO_0) + PIN_SET_PAD_CONFIG(PORT_0_PUPD, pinNumber, HAL_GPIO_PULL_UP); + else if (((GPIO_TypeDef*)_receivePortRegister) == GPIO_1) + PIN_SET_PAD_CONFIG(PORT_1_PUPD, pinNumber, HAL_GPIO_PULL_UP); + } // turn off int line for while (it turning on in attachInterrupt()) GPIO_IRQ_LINE_DISABLE(_int_maskLine); }