/SoftSerialIntCC

Timer Capture/Compare Driven Software Serial Libray for STM32Duino

Primary LanguageC++

SoftSerialIntCC

Timer Capture/Compare Driven Software Serial Libray for STM32Duino

  • Simultaneous Multi-instance Full-duplex Software Serial Library for STM32Duino
  • Using Timer Capture/Compare Hardware Assist

/******************************************************************************
Features:

  • Member functions compatible with Hardware Serial and Arduino NewSoftSerial Libs
  • Fully interrupt driven and uses timer capture and compare - no delay routines.
  • Tolerates other interrupts up to 1 bit time (minus interrupt latencies)
  • Circular buffers on both send and receive.
  • Simultaneous send/receive on multiple ports
  • Up to 115,200 baud. 57,600 baud full duplex
  • Supports baud rates down to 300 baud with minimal system overhead
  • Supports up to 4 ports (one timer used per port) without modification.
  • Easily modified for more ports or different timers on chips with more timers.
  • Extensions for transmit enable/disable
  • Can send/receive simultaneously with other ports/instantiatious. Tested reliable up to 57,600 depending on system interrupt load.

Notes:

Restrictions

  • Must use correct pins assigned to the capture/compare input/outputs of the timer you select. As currently defined: TX pin = Timer channel 1 RX pin = Timer channel 2 Of course, this can be changed by modifing the definitions under "Timer Channel Definitions" in this file.

Performance

  • Multiple port simultaneous send or receive and ability to communicate full duplex (receiving a charachter and transmitting at the same time) will be dependent on baud rate and other system interrupt load (including interrupts disabled)- you'll need to experiment.
  • Can be used similar to delay based libraries (NewSoftSerial for instance) which only enable one port at a time at half duplex to guarantee reliable operation at high baud rates and system interrupt loading.

Improvements

  • No doubt the code can be improved upon. If you improve the code please give back by providing soure code for modifications you've made!
  • Specific improvements that come to mind and I'd like to explore are: o Replacing the STM32/Maple timer interrupt handlers with something more streamlined and lower latency and overhead. o A lower overhead method to implement C++ ISR's while supporting multiple instantians and the STM32 timer shared interrupts. o Code tuning to save cycles in the C++ ISR's such as using bit-banding o Automatically select pins based on timer selection.

License

  • Copyright 2015 Ron Curry, InSyte Technologies
  • Permission is hereby granted, free of charge, to any person
  • obtaining a copy of this software and associated documentation
  • files (the "Software"), to deal in the Software without
  • restriction, including without limitation the rights to use, copy,
  • modify, merge, publish, distribute, sublicense, and/or sell copies
  • of the Software, and to permit persons to whom the Software is
  • furnished to do so, subject to the following conditions:
  • The above copyright notice and this permission notice shall be
  • included in all copies or substantial portions of the Software.
  • THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
  • EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
  • MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
  • NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
  • BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
  • ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
  • CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
  • SOFTWARE. *****************************************************************************/