перенесла функцию записи в ram, внутри функции все на регистрах. теперь на любых скоростях все ок и с первым байтом

This commit is contained in:
klassents committed 2024-09-18 10:27:22 +07:00
1 parent aa1163f859
commit 1d5ffdc6f0
2 files changed
+22 -22

No files matched your search

+20 -20
View File
@@ -32,8 +32,9 @@ http://arduiniana.org.
// #include <avr/pgmspace.h> // #include <avr/pgmspace.h>
#include <Arduino.h> #include <Arduino.h>
#include <SoftwareSerial.h> #include <SoftwareSerial.h>
// #include "mik32_hal_irq.h" #include "mik32_hal_irq.h"
#include "mik32_hal_gpio.h" #include "mik32_hal_gpio.h"
#include "mik32_hal_scr1_timer.h"
// //
// Statics // Statics
@@ -68,10 +69,10 @@ volatile uint8_t SoftwareSerial::_receive_buffer_head = 0;
// Private methods // Private methods
// //
/* static */ // get ticks from systick
#include "mik32_hal_scr1_timer.h"
#define CURRENT_TICKS ((uint64_t)(SCR1_TIMER->MTIMEH)<<32 | SCR1_TIMER->MTIME) #define CURRENT_TICKS ((uint64_t)(SCR1_TIMER->MTIMEH)<<32 | SCR1_TIMER->MTIME)
// function placed in ram. Should not call other function placed in flash
void SoftwareSerial::tunedDelay(uint32_t delayTicks) void SoftwareSerial::tunedDelay(uint32_t delayTicks)
{ {
uint64_t startTicks = CURRENT_TICKS; uint64_t startTicks = CURRENT_TICKS;
@@ -359,47 +360,46 @@ void SoftwareSerial::end()
stopListening(); stopListening();
} }
// function placed in ram. Should not call other function placed in flash
size_t SoftwareSerial::write(uint8_t byte) size_t SoftwareSerial::write(uint8_t byte)
{ {
if (_tx_delay == 0) if (_tx_delay == 0)
{
setWriteError();
return 0; return 0;
}
if (_inverse_logic) if (_inverse_logic)
byte = ~byte; 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 // Write the start bit
if (_inverse_logic) if (_inverse_logic)
HAL_GPIO_WritePin((GPIO_TypeDef *)_transmitPortRegister, (HAL_PinsTypeDef)_transmitBitMask, GPIO_PIN_HIGH); ((GPIO_TypeDef *)_transmitPortRegister)->SET = (HAL_PinsTypeDef)_transmitBitMask;
else 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 in LSB mode
// Write each of the 8 bits
for (uint8_t i = 8; i > 0; --i) for (uint8_t i = 8; i > 0; --i)
{ {
if (byte & 1) // choose bit 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 else
HAL_GPIO_WritePin((GPIO_TypeDef *)_transmitPortRegister, (HAL_PinsTypeDef)_transmitBitMask, GPIO_PIN_LOW); ((GPIO_TypeDef *)_transmitPortRegister)->CLEAR = (HAL_PinsTypeDef)_transmitBitMask;
tunedDelay(_tx_delay); tunedDelay(_tx_delay);
byte >>= 1; byte >>= 1;
} }
// restore pin to natural state // restore pin to natural state - stop bit
if (_inverse_logic) if (_inverse_logic)
HAL_GPIO_WritePin((GPIO_TypeDef *)_transmitPortRegister, (HAL_PinsTypeDef)_transmitBitMask, GPIO_PIN_LOW); ((GPIO_TypeDef *)_transmitPortRegister)->CLEAR = (HAL_PinsTypeDef)_transmitBitMask;
else else
HAL_GPIO_WritePin((GPIO_TypeDef *)_transmitPortRegister, (HAL_PinsTypeDef)_transmitBitMask, GPIO_PIN_HIGH); ((GPIO_TypeDef *)_transmitPortRegister)->SET = (HAL_PinsTypeDef)_transmitBitMask;
interrupts(); // enable interrupts // enable interrupts
tunedDelay(_tx_delay); set_csr(mstatus, MSTATUS_MIE);
set_csr(mie, MIE_MEIE);
tunedDelay(_tx_delay); // wait stop bit
return 1; return 1;
} }
@@ -76,7 +76,7 @@ private:
static uint32_t subtract_cap(uint32_t num, uint16_t sub); static uint32_t subtract_cap(uint32_t num, uint16_t sub);
// private static method for timing // 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:
// public methods // public methods
@@ -96,7 +96,7 @@ public:
} }
int peek(); 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 read();
virtual int available(); virtual int available();
virtual void flush(); virtual void flush();