From 562c29dbe16d039c78e787f83d2ae41971919884 Mon Sep 17 00:00:00 2001 From: klassents Date: Wed, 25 Sep 2024 11:39:22 +0700 Subject: [PATCH] =?UTF-8?q?=D0=BF=D0=B5=D1=80=D0=B5=D0=BD=D0=B5=D1=81?= =?UTF-8?q?=D0=BB=D0=B0=20=D1=80=D0=B0=D0=B1=D0=BE=D1=82=D1=83=20=D1=81=20?= =?UTF-8?q?=D1=80=D0=B5=D0=B3=D0=B8=D1=81=D1=82=D1=80=D0=B0=D0=BC=D0=B8=20?= =?UTF-8?q?=D0=B2=20LL=20=D1=84=D0=B0=D0=B9=D0=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- cores/arduino/wiring_LL.h | 29 ++++++++++++ .../SoftwareSerial/src/SoftwareSerial.cpp | 46 +++++-------------- libraries/SoftwareSerial/src/SoftwareSerial.h | 2 - 3 files changed, 41 insertions(+), 36 deletions(-) create mode 100644 cores/arduino/wiring_LL.h diff --git a/cores/arduino/wiring_LL.h b/cores/arduino/wiring_LL.h new file mode 100644 index 0000000..fec4efe --- /dev/null +++ b/cores/arduino/wiring_LL.h @@ -0,0 +1,29 @@ +#ifndef _WIRING_LL_H_ +#define _WIRING_LL_H_ + +#include "mik32_hal_irq.h" +#include "mik32_hal_gpio.h" +#include "mik32_hal_scr1_timer.h" + +// ----------------- Systick ----------------- // +// get ticks from systick +#define SYSTICK_GET_TICKS() ((uint64_t)(SCR1_TIMER->MTIMEH)<<32 | SCR1_TIMER->MTIME) + + +// ----------------- IRQ ----------------- // +#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) + +// ----------------- 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_CLEAR_ALL() (GPIO_IRQ->CLEAR = 0b11111111) + + +#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 c11f6d9..455bebb 100644 --- a/libraries/SoftwareSerial/src/SoftwareSerial.cpp +++ b/libraries/SoftwareSerial/src/SoftwareSerial.cpp @@ -19,30 +19,11 @@ http://arduiniana.org. #include #include -#include "mik32_hal_irq.h" -#include "mik32_hal_gpio.h" -#include "mik32_hal_scr1_timer.h" +#include "wiring_LL.h" #define MAX_SOFT_SERIAL_SPEED 115200 #define MIN_SOFT_SERIAL_SPEED 300 -// --------- TO LL --------- -// get ticks from systick -#define SYSTICK_GET_TICKS() ((uint64_t)(SCR1_TIMER->MTIMEH)<<32 | SCR1_TIMER->MTIME) - -#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_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_CLEAR_ALL() (GPIO_IRQ->CLEAR = 0b11111111) -#define GLOBAL_IRQ_DISABLE() (clear_csr(mie, MIE_MEIE)) -#define GLOBAL_IRQ_ENABLE() set_csr(mstatus, MSTATUS_MIE); \ - set_csr(mie, MIE_MEIE) -// --------- TO LL --------- - - // Statics // static variable is common to all class instances SoftwareSerial *SoftwareSerial::active_object = 0; @@ -279,14 +260,13 @@ void SoftwareSerial::begin(long speed) _rx_delay_stopbit+=30; } - // Save start bit polarity - low to high if _inverse_logic - _int_mode = _inverse_logic ? (uint8_t)GPIO_INT_MODE_RISING : (uint8_t)GPIO_INT_MODE_FALLING; - // Save gpio_mux and gpio_line for on/off interrupts - _int_maskMux = digitalPinToGpioIntMux(_receivePin); // gpio mux value - _int_maskLine = digitalPinToGpioIntLine(_receivePin); // gpio irq line value - HAL_GPIO_InitInterruptLine((HAL_GPIO_Line_Config) _int_maskMux, (HAL_GPIO_InterruptMode)_int_mode); - GPIO_IRQ_LINE_DISABLE(_int_maskLine); // turn off int - HAL_EPIC_MaskEdgeSet(HAL_EPIC_GPIO_IRQ_MASK); // turn on the mask in EPIC + // Save gpio_line for turning on/off interrupts + _int_maskLine = digitalPinToGpioIntLine(_receivePin); + // Init interrupt line + HAL_GPIO_InitInterruptLine((HAL_GPIO_Line_Config)digitalPinToGpioIntMux(_receivePin), + _inverse_logic ? GPIO_INT_MODE_RISING : GPIO_INT_MODE_FALLING); + GPIO_IRQ_LINE_DISABLE(_int_maskLine); // turn off int line (it turning on while line init) + HAL_EPIC_MaskEdgeSet(HAL_EPIC_GPIO_IRQ_MASK); // turn on the mask in EPIC } else ErrorMsgHandler("SoftwareSerial.begin(): Rx pin does not support interrupts, use different pin"); @@ -302,12 +282,10 @@ void SoftwareSerial::begin(long speed) void SoftwareSerial::setRxIntMsk(bool enable) { - if (enable) - // enable interrupt line - GPIO_IRQ_LINE_ENABLE(_int_maskLine); - else - // disable interrupt line - GPIO_IRQ_LINE_DISABLE(_int_maskLine); + if (enable) + GPIO_IRQ_LINE_ENABLE(_int_maskLine); + else + GPIO_IRQ_LINE_DISABLE(_int_maskLine); } void SoftwareSerial::end() diff --git a/libraries/SoftwareSerial/src/SoftwareSerial.h b/libraries/SoftwareSerial/src/SoftwareSerial.h index 4a23ee4..66d798a 100644 --- a/libraries/SoftwareSerial/src/SoftwareSerial.h +++ b/libraries/SoftwareSerial/src/SoftwareSerial.h @@ -46,9 +46,7 @@ private: uint8_t _transmitPin; uint16_t _transmitBitMask; uint32_t _transmitPortRegister; - uint8_t _int_maskMux; uint8_t _int_maskLine; - uint8_t _int_mode; // must never be 0! uint32_t _rx_delay_centering;