From 1d5ffdc6f083a5fa58d8540bf8ea1b0ca2933837 Mon Sep 17 00:00:00 2001 From: klassents Date: Wed, 18 Sep 2024 10:27: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=84=D1=83=D0=BD=D0=BA=D1=86=D0=B8=D1=8E=20?= =?UTF-8?q?=D0=B7=D0=B0=D0=BF=D0=B8=D1=81=D0=B8=20=D0=B2=20ram,=20=D0=B2?= =?UTF-8?q?=D0=BD=D1=83=D1=82=D1=80=D0=B8=20=D1=84=D1=83=D0=BD=D0=BA=D1=86?= =?UTF-8?q?=D0=B8=D0=B8=20=D0=B2=D1=81=D0=B5=20=D0=BD=D0=B0=20=D1=80=D0=B5?= =?UTF-8?q?=D0=B3=D0=B8=D1=81=D1=82=D1=80=D0=B0=D1=85.=20=D1=82=D0=B5?= =?UTF-8?q?=D0=BF=D0=B5=D1=80=D1=8C=20=D0=BD=D0=B0=20=D0=BB=D1=8E=D0=B1?= =?UTF-8?q?=D1=8B=D1=85=20=D1=81=D0=BA=D0=BE=D1=80=D0=BE=D1=81=D1=82=D1=8F?= =?UTF-8?q?=D1=85=20=D0=B2=D1=81=D0=B5=20=D0=BE=D0=BA=20=D0=B8=20=D1=81=20?= =?UTF-8?q?=D0=BF=D0=B5=D1=80=D0=B2=D1=8B=D0=BC=20=D0=B1=D0=B0=D0=B9=D1=82?= =?UTF-8?q?=D0=BE=D0=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../SoftwareSerial/src/SoftwareSerial.cpp | 42 +++++++++---------- libraries/SoftwareSerial/src/SoftwareSerial.h | 4 +- 2 files changed, 23 insertions(+), 23 deletions(-) diff --git a/libraries/SoftwareSerial/src/SoftwareSerial.cpp b/libraries/SoftwareSerial/src/SoftwareSerial.cpp index aa15f0f..b1ab6fb 100644 --- a/libraries/SoftwareSerial/src/SoftwareSerial.cpp +++ b/libraries/SoftwareSerial/src/SoftwareSerial.cpp @@ -32,8 +32,9 @@ http://arduiniana.org. // #include #include #include -// #include "mik32_hal_irq.h" +#include "mik32_hal_irq.h" #include "mik32_hal_gpio.h" +#include "mik32_hal_scr1_timer.h" // // Statics @@ -68,11 +69,11 @@ volatile uint8_t SoftwareSerial::_receive_buffer_head = 0; // Private methods // -/* static */ -#include "mik32_hal_scr1_timer.h" +// get ticks from systick #define CURRENT_TICKS ((uint64_t)(SCR1_TIMER->MTIMEH)<<32 | SCR1_TIMER->MTIME) -void SoftwareSerial::tunedDelay(uint32_t delayTicks) +// function placed in ram. Should not call other function placed in flash +void SoftwareSerial::tunedDelay(uint32_t delayTicks) { uint64_t startTicks = CURRENT_TICKS; while ((CURRENT_TICKS - startTicks) < delayTicks) @@ -359,47 +360,46 @@ void SoftwareSerial::end() stopListening(); } +// function placed in ram. Should not call other function placed in flash size_t SoftwareSerial::write(uint8_t byte) { if (_tx_delay == 0) - { - setWriteError(); return 0; - } if (_inverse_logic) byte = ~byte; - noInterrupts(); // turn off interrupts for a clean txmit + clear_csr(mie, MIE_MEIE); // turn off interrupts for a clean txmit // Write the start bit if (_inverse_logic) - HAL_GPIO_WritePin((GPIO_TypeDef *)_transmitPortRegister, (HAL_PinsTypeDef)_transmitBitMask, GPIO_PIN_HIGH); + ((GPIO_TypeDef *)_transmitPortRegister)->SET = (HAL_PinsTypeDef)_transmitBitMask; else - HAL_GPIO_WritePin((GPIO_TypeDef *)_transmitPortRegister, (HAL_PinsTypeDef)_transmitBitMask, GPIO_PIN_LOW); + ((GPIO_TypeDef *)_transmitPortRegister)->CLEAR = (HAL_PinsTypeDef)_transmitBitMask; + tunedDelay(_tx_delay); // wait start bit - tunedDelay(_tx_delay); - - // Write each of the 8 bits + // Write each of the 8 bits in LSB mode for (uint8_t i = 8; i > 0; --i) { if (byte & 1) // choose bit - HAL_GPIO_WritePin((GPIO_TypeDef *)_transmitPortRegister, (HAL_PinsTypeDef)_transmitBitMask, GPIO_PIN_HIGH); + ((GPIO_TypeDef *)_transmitPortRegister)->SET = (HAL_PinsTypeDef)_transmitBitMask; else - HAL_GPIO_WritePin((GPIO_TypeDef *)_transmitPortRegister, (HAL_PinsTypeDef)_transmitBitMask, GPIO_PIN_LOW); - + ((GPIO_TypeDef *)_transmitPortRegister)->CLEAR = (HAL_PinsTypeDef)_transmitBitMask; tunedDelay(_tx_delay); byte >>= 1; } - // restore pin to natural state + // restore pin to natural state - stop bit if (_inverse_logic) - HAL_GPIO_WritePin((GPIO_TypeDef *)_transmitPortRegister, (HAL_PinsTypeDef)_transmitBitMask, GPIO_PIN_LOW); + ((GPIO_TypeDef *)_transmitPortRegister)->CLEAR = (HAL_PinsTypeDef)_transmitBitMask; else - HAL_GPIO_WritePin((GPIO_TypeDef *)_transmitPortRegister, (HAL_PinsTypeDef)_transmitBitMask, GPIO_PIN_HIGH); + ((GPIO_TypeDef *)_transmitPortRegister)->SET = (HAL_PinsTypeDef)_transmitBitMask; - interrupts(); // enable interrupts - tunedDelay(_tx_delay); + // enable interrupts + set_csr(mstatus, MSTATUS_MIE); + set_csr(mie, MIE_MEIE); + + tunedDelay(_tx_delay); // wait stop bit return 1; } diff --git a/libraries/SoftwareSerial/src/SoftwareSerial.h b/libraries/SoftwareSerial/src/SoftwareSerial.h index fa9970f..e3bca24 100644 --- a/libraries/SoftwareSerial/src/SoftwareSerial.h +++ b/libraries/SoftwareSerial/src/SoftwareSerial.h @@ -76,7 +76,7 @@ private: static uint32_t subtract_cap(uint32_t num, uint16_t sub); // private static method for timing - static void __attribute__( ( noinline, section(".data") ) ) tunedDelay(uint32_t delayTicks); + static void tunedDelay(uint32_t delayTicks) __attribute__((noinline, section(".data"))) ; public: // public methods @@ -96,7 +96,7 @@ public: } int peek(); - virtual size_t write(uint8_t byte); + virtual size_t write(uint8_t byte) __attribute__((noinline, section(".data"))); virtual int read(); virtual int available(); virtual void flush();