Arduino Core for STM32  1.0
HardwareSerial.h
Go to the documentation of this file.
1 
19 #ifndef HardwareSerial_h
20 #define HardwareSerial_h
21 
22 
23 #ifndef YIELD
24 #define YIELD
25 #endif
26 
27 #include "wirish.h"
28 #include <inttypes.h>
29 #include "Stream.h"
30 
31 //Includes
32 #if defined(STM32F103xB)
33 //#include "stm32f1xx_hal.h"
34 
35 #elif defined(STM32F031x6) || defined(STM32F070xB) || defined(STM32F070x6) || defined(STM32F030x6)
36 //#include "stm32f0xx_hal.h"
37 
38 #elif defined(STM32L031xx)
39 //#include "stm32l0xx_hal.h"
40 
41 #elif defined(STM32L432xx)
42 //#include "stm32l4xx_hal.h"
43 
44 #else
45 #error "This library does not supports selected MCU." //This is here only, because some methods may not works with that chip.
46 #endif
47 
48 #if defined(HAL_UART_MODULE_ENABLED) || defined(DOXYGEN_FORCED)
49 
53 #define HS_RX_BUF_SIZE 128
54 
55 
56 #ifndef IS_LPUART_INSTANCE
57 #define IS_LPUART_INSTANCE(instance) (true)
58 #endif
59 
60 //STM32F1xx have its own library and structures for USART and UART, so we need to implement it somehow
61 
67 enum SerialMode {
69  SERIAL_FULL = UART_MODE_TX_RX,
71  SERIAL_RX_ONLY = UART_MODE_RX,
73  SERIAL_TX_ONLY = UART_MODE_TX
74 };
75 
79 typedef UART_InitTypeDef SerialConfig;
80 
81 #ifdef __STM32F1xx_HAL_USART_H //code for STM32F1xx
82 
86 typedef USART_InitTypeDef SSerialConfig;
87 #endif
88 
89 #if !defined(__STM32F1xx_HAL_UART_H) && !defined(__STM32F1xx_HAL_USART_H) //code not for STM32F1xx
90 
94 typedef UART_AdvFeatureInitTypeDef AdvSerialConfig;
95 #endif
96 
109 class HardwareSerial: public Stream
110 {
111 public:
112 
116  HardwareSerial(UART_HandleTypeDef& uart);
117 
118 #ifdef __STM32F1xx_HAL_USART_H //code for STM32F1xx
119  HardwareSerial(USART_HandleTypeDef& usart);
120 
121 #endif
122 
126  ~HardwareSerial();
127 
128 
136  bool connectDMAtoRx(DMA_HandleTypeDef &DMA_handle);
137 
145  bool connectDMAtoTx(DMA_HandleTypeDef &DMA_handle);
146 
153  return disconnectDMAfromRx(true);
154  }
155 
161  bool disconnectDMAfromTx();
162 
167  bool isDMAconnectedToRx(void);
168 
173  bool isDMAconnectedToTx(void);
174 
180  bool begin();
181 
187  bool begin(unsigned long baud);
188 
195  bool begin(unsigned long baud, SerialMode mode);
196 
197 #if defined(__STM32F1xx_HAL_USART_H) //code for STM32F1xx
198 
204  bool begin(SSerialConfig config);
205 
213  bool begin(unsigned long baud, SSerialConfig config);
214 #endif
215 
221  bool begin(SerialConfig config);
222 
229  bool begin(unsigned long baud, SerialConfig config);
230 
231 #if !defined(__STM32F1xx_HAL_UART_H) && !defined(__STM32F1xx_HAL_USART_H) //code not for STM32F1xx
232 
240  bool begin(SerialConfig config, AdvSerialConfig advConfig);
241 
242 
250  bool begin(unsigned long baud, AdvSerialConfig advConfig);
251 
260  bool begin(unsigned long baud, SerialConfig config, AdvSerialConfig advConfig);
261 
270  bool begin(unsigned long baud, SerialMode mode, AdvSerialConfig advConfig);
271 
281  bool begin(unsigned long baud, SerialConfig config, SerialMode mode, AdvSerialConfig advConfig);
282 #endif
283 
284 
289  void end();
290 
296  bool updateBaudRate(unsigned long baud);
297 
306  {
307  return HS_RX_BUF_SIZE;
308  }
309 
314  int available(void) override;
315 
316 
321  bool bufferOverflowed();
322 
327  int peek(void) override;
328 
336  int read(void) override;
337 
349  size_t read(char* buffer, size_t size);
350 
362  size_t read(uint8_t* buffer, size_t size)
363  {
364  return read((char*)buffer, size);
365  }
366 
378  size_t readBytes(char* buffer, size_t size) override;
379 
391  size_t readBytes(uint8_t* buffer, size_t size) override
392  {
393  return readBytes((char*)buffer, size);
394  }
395 
400  void flush(uint32_t timeout = 0);
401 
408  size_t write(uint8_t c) override;
409 
417  size_t write(const uint8_t *buffer, size_t size) override;
418 
426  size_t writeNonBlocking(const uint8_t* buffer, size_t size);
427 
435  size_t writeNonBlocking(const char* buffer, size_t size);
436 
441  bool isSending();
442 
443 
444  using Print::write; // Import other write() methods to support things like write(0) properly
445 
446 
450  operator bool() const
451  {
452 #ifdef __STM32F1xx_HAL_USART_H //code for STM32F1xx
453  if(!_isUart){ //usart
454  return (_usart != NULL) && ((IS_UART_INSTANCE(_usart->Instance)) || (IS_LPUART_INSTANCE(_usart->Instance)));
455  }
456  else{ //uart
457  return (_uart != NULL) && ((IS_UART_INSTANCE(_uart->Instance)) || (IS_LPUART_INSTANCE(_uart->Instance)));
458  }
459 #else
460  return (_uart != NULL) && ((IS_UART_INSTANCE(_uart->Instance)) || (IS_LPUART_INSTANCE(_uart->Instance)));
461 #endif
462  }
463 
468  inline bool instanceExists(){
469 #ifdef __STM32F1xx_HAL_USART_H //code for STM32F1xx
470  if(!_isUart){ //usart
471  return (_usart != NULL) && ((IS_UART_INSTANCE(_usart->Instance)) || (IS_LPUART_INSTANCE(_usart->Instance)));
472  }
473  else{ //uart
474  return (_uart != NULL) && ((IS_UART_INSTANCE(_uart->Instance)) || (IS_LPUART_INSTANCE(_uart->Instance)));
475  }
476 #else
477  return (_uart != NULL) && ((IS_UART_INSTANCE(_uart->Instance)) || (IS_LPUART_INSTANCE(_uart->Instance)));
478 #endif
479  }
480 
486  bool isTxEnabled(void)
487  {
488 #ifdef __STM32F1xx_HAL_USART_H //code for STM32F1xx
489  if(!_isUart){ //usart
490  return _usart->Init.Mode == SERIAL_FULL || _usart->Init.Mode == SERIAL_TX_ONLY;
491  }
492  else{ //uart
493  return _uart->Init.Mode == SERIAL_FULL || _uart->Init.Mode == SERIAL_TX_ONLY;
494  }
495 #else
496  return _uart->Init.Mode == SERIAL_FULL || _uart->Init.Mode == SERIAL_TX_ONLY;
497 #endif
498 
499  }
500 
506  bool isRxEnabled(void)
507  {
508 #ifdef __STM32F1xx_HAL_USART_H //code for STM32F1xx
509  if(!_isUart){ //usart
510  return _usart->Init.Mode == SERIAL_FULL || _usart->Init.Mode == SERIAL_RX_ONLY;
511  }
512  else{ //uart
513  return _uart->Init.Mode == SERIAL_FULL || _uart->Init.Mode == SERIAL_RX_ONLY;
514  }
515 #else
516  return _uart->Init.Mode == SERIAL_FULL || _uart->Init.Mode == SERIAL_RX_ONLY;
517 #endif
518  }
519 
524  uint32_t getClockInstFrequency();
525 
532  int baudRate(void)
533  {
534 #ifdef __STM32F1xx_HAL_USART_H //code for STM32F1xx
535  if(!_isUart){ //usart
536  return _usart->Init.BaudRate;
537  }
538  else{ //uart
539  return _uart->Init.BaudRate;
540  }
541 #else
542  return _uart->Init.BaudRate;
543 #endif
544  }
545 
550  bool hasError(void)
551  {
552 #ifdef __STM32F1xx_HAL_USART_H //code for STM32F1xx
553  if(!_isUart){ //usart
554  return _usart->ErrorCode != HAL_USART_ERROR_NONE;
555  }
556  else{ //uart
557  return _uart->ErrorCode != HAL_UART_ERROR_NONE;
558  }
559 #else
560  return _uart->ErrorCode != HAL_UART_ERROR_NONE;
561 #endif
562 
563  }
564 
569  void setWriteDoneCallback(void (* WriteDoneCallback_)() );
570 
571  //Advanced funkcie potrebné pre RXFULL callback
572 
577  static inline void handleRxFullCallback(USART_TypeDef* instance);
578 
584  static inline void handleRxFullCallback(uint32_t UARTIndex);
585 
590  static inline void handleTxDoneCallback(USART_TypeDef* instance);
591 
597  static inline void handleTxDoneCallback(uint32_t UARTIndex);
598 
604  static uint32_t getUARTIndex(USART_TypeDef* instance);
605 
610  static HardwareSerial** getUARTInstances(); //returns pointer to instances
611 
616  static uint8_t getAvailableUARTsCount();
617 
622  UART_HandleTypeDef& getHAL_UART_Struct(){
623  return *_uart;
624  }
625 
626 #ifdef __STM32F1xx_HAL_USART_H //code for STM32F1xx
627 
632  USART_HandleTypeDef& getHAL_USART_Struct(){
633  return *_usart;
634  }
635 #endif
636 
637 
638 protected:
642  UART_HandleTypeDef* _uart;
643 
644 #ifdef __STM32F1xx_HAL_USART_H //code for STM32F1xx
645 
649  USART_HandleTypeDef* _usart;
650 
651 
656  bool _isUart;
657 #endif
658 
659 
664 
665 
669  volatile uint16_t rxBufOVFCNT = 0;
670 
671 
675  uint16_t RxBufferReadPos = 0;
676 
677 #ifdef __STM32F1xx_HAL_USART_H //code for STM32F1xx
678 
682  void UART_EndRxTransfer(USART_HandleTypeDef *huart);
683 
688  void UART_EndTxTransfer(USART_HandleTypeDef *huart);
689 #endif
690 
694  void UART_EndRxTransfer(UART_HandleTypeDef *huart);
695 
699  void UART_EndTxTransfer(UART_HandleTypeDef *huart);
700 
704  void abortDMARx();
705 
709  void abortDMATx();
710 
718  bool disconnectDMAfromRx(bool startRxIT = true);
719 
723  void (* WriteDoneCallback)() = NULL;
724 
728  void UART_RxFullCallback();
729 
730 
735  void addThisToInstArr();
736 
740  void removeThisFromInstArr();
741 
745  static HardwareSerial* instances[]; //There are stored pointers to all created instances of this class
746 
750  static uint8_t availableUARTsCount;
751 
757  size_t widthCheck(size_t width_) override;
758 };
759 
763 void HS_UART_AbortReceive_IT(UART_HandleTypeDef* huart);
764 
765 #ifdef __STM32F1xx_HAL_USART_H //code for STM32F1xx
766 
770 void HS_UART_AbortReceive_IT(USART_HandleTypeDef* huart);
771 #endif
772 
773 #endif
774 #endif
HardwareSerial::HardwareSerial
HardwareSerial(UART_HandleTypeDef &uart)
Constructor.
HardwareSerial::isTxEnabled
bool isTxEnabled(void)
Checks if transmitting mode is enabled.
Definition: HardwareSerial.h:486
HardwareSerial::available
int available(void) override
Gets the count of bytes (characters) available for reading from the Rx buffer.
SerialConfig
UART_InitTypeDef SerialConfig
HAL library configuration structure.
Definition: HardwareSerial.h:79
HardwareSerial::handleRxFullCallback
static void handleRxFullCallback(USART_TypeDef *instance)
Handles RxFull callback function.
HardwareSerial::rxBufOVFCNT
volatile uint16_t rxBufOVFCNT
Rx buffer overflow count, restarts when read() was called.
Definition: HardwareSerial.h:669
HardwareSerial::UART_RxFullCallback
void UART_RxFullCallback()
This method is called when Rx Buffer is full.
HardwareSerial::begin
bool begin()
Initialize and enable UART periphery and it's clock.
HardwareSerial::bufferOverflowed
bool bufferOverflowed()
Returns true when Rx buffer has overflowed.
HardwareSerial::flush
void flush(uint32_t timeout=0)
Waits for the transmission of outgoing serial data to complete.
HardwareSerial::widthCheck
size_t widthCheck(size_t width_) override
Overriden width check function from Stream class.
HardwareSerial::updateBaudRate
bool updateBaudRate(unsigned long baud)
Updates baud rate at runtime.
HardwareSerial::isDMAconnectedToRx
bool isDMAconnectedToRx(void)
Checks if DMA channel is connected to UART Rx and can be used for data receiving.
HardwareSerial::UART_EndRxTransfer
void UART_EndRxTransfer(UART_HandleTypeDef *huart)
Aborts Rx IT Transfer.
HardwareSerial::readBytes
size_t readBytes(uint8_t *buffer, size_t size) override
@Reads characters from the Rx buffer into your buffer.
Definition: HardwareSerial.h:391
HardwareSerial::RxBufferReadPos
uint16_t RxBufferReadPos
Rading position in Rx Buffer.
Definition: HardwareSerial.h:675
IS_LPUART_INSTANCE
#define IS_LPUART_INSTANCE(instance)
Definition: HardwareSerial.h:57
SERIAL_FULL
@ SERIAL_FULL
Transmitting and receiving mode
Definition: HardwareSerial.h:69
HardwareSerial::connectDMAtoTx
bool connectDMAtoTx(DMA_HandleTypeDef &DMA_handle)
Use this method to connect DMA channel to UART Tx programmatically.
HardwareSerial::WriteDoneCallback
void(* WriteDoneCallback)()
User callback function, that can be set using setWriteDoneCallback().
Definition: HardwareSerial.h:723
AdvSerialConfig
UART_AdvFeatureInitTypeDef AdvSerialConfig
HAL library advanced configuration structure.
Definition: HardwareSerial.h:94
HardwareSerial::setWriteDoneCallback
void setWriteDoneCallback(void(*WriteDoneCallback_)())
Sets callback function, that will be called when all data using writeNonBlocking() method were send.
HardwareSerial::getUARTIndex
static uint32_t getUARTIndex(USART_TypeDef *instance)
Gets UART instance index.
HardwareSerial::isSending
bool isSending()
Checks if data are sending right now and if periphery is busy.
HardwareSerial::instanceExists
bool instanceExists()
Checks if UART instance exists.
Definition: HardwareSerial.h:468
HardwareSerial::availableUARTsCount
static uint8_t availableUARTsCount
Available UART instances count.
Definition: HardwareSerial.h:750
HardwareSerial::disconnectDMAfromTx
bool disconnectDMAfromTx()
Disconnects DMA channel from UART Tx.
HardwareSerial::rxBuf
uint8_t rxBuf[HS_RX_BUF_SIZE]
DMA or IT receiving buffer.
Definition: HardwareSerial.h:663
HS_UART_AbortReceive_IT
void HS_UART_AbortReceive_IT(UART_HandleTypeDef *huart)
Copied from HAL UART library.
HardwareSerial::addThisToInstArr
void addThisToInstArr()
Writes new class instance to array of all timer instances.
HardwareSerial::read
int read(void) override
Reads incoming serial data.
HardwareSerial::abortDMARx
void abortDMARx()
Aborts Rx DMA Transfer.
HS_RX_BUF_SIZE
#define HS_RX_BUF_SIZE
Rx buffer size.
Definition: HardwareSerial.h:53
Stream
This class is for receiving and transmitting data.
Definition: Stream.h:56
SerialMode
SerialMode
Enumeration of 3 UART direction modes.
Definition: HardwareSerial.h:67
HardwareSerial::end
void end()
Deinitialization and disabling UART periphery, it can be used for "sleep mode".
HardwareSerial::getRxBufferSize
size_t getRxBufferSize()
Gets the size of Rx buffer.
Definition: HardwareSerial.h:305
SERIAL_RX_ONLY
@ SERIAL_RX_ONLY
Only receiving mode
Definition: HardwareSerial.h:71
HardwareSerial::hasError
bool hasError(void)
Checks if faulty byte was received.
Definition: HardwareSerial.h:550
HardwareSerial::getClockInstFrequency
uint32_t getClockInstFrequency()
Gets UART periphery clock frequency.
HardwareSerial::connectDMAtoRx
bool connectDMAtoRx(DMA_HandleTypeDef &DMA_handle)
Use this method to connect DMA channel to UART Rx programmatically.
HardwareSerial::disconnectDMAfromRx
bool disconnectDMAfromRx()
Disconnects DMA channel from UART Rx.
Definition: HardwareSerial.h:152
wirish.h
This file contains basic (Arduino like) GPIO manipulation functions, delay, random,...
HardwareSerial::handleTxDoneCallback
static void handleTxDoneCallback(USART_TypeDef *instance)
Handles TxDone callback function.
HardwareSerial::getUARTInstances
static HardwareSerial ** getUARTInstances()
Gets array of all created UART instances (just from this class, not UART structure).
HardwareSerial::~HardwareSerial
~HardwareSerial()
Destructor.
HardwareSerial::peek
int peek(void) override
Returns the next byte (character) of incoming serial data without removing it from the Rx buffer.
HardwareSerial::isDMAconnectedToTx
bool isDMAconnectedToTx(void)
Checks if DMA channel is connected to UART Tx and can be used for data transmitting.
HardwareSerial::removeThisFromInstArr
void removeThisFromInstArr()
Removes this instance from instances array.
HardwareSerial::isRxEnabled
bool isRxEnabled(void)
Checks if receiving mode is enabled.
Definition: HardwareSerial.h:506
HardwareSerial::_uart
UART_HandleTypeDef * _uart
UART periphery handle structure.
Definition: HardwareSerial.h:642
HardwareSerial::UART_EndTxTransfer
void UART_EndTxTransfer(UART_HandleTypeDef *huart)
Aborts Tx IT Transfer.
HardwareSerial::baudRate
int baudRate(void)
Gets UART baud rate that was set in method begin() or updateBaudRate().
Definition: HardwareSerial.h:532
HardwareSerial::getHAL_UART_Struct
UART_HandleTypeDef & getHAL_UART_Struct()
Returns UART structure, that is used for handling UART.
Definition: HardwareSerial.h:622
HardwareSerial::writeNonBlocking
size_t writeNonBlocking(const uint8_t *buffer, size_t size)
Writes binary data to the serial port.
HardwareSerial::getAvailableUARTsCount
static uint8_t getAvailableUARTsCount()
Gets available UARTs instances count.
HardwareSerial::abortDMATx
void abortDMATx()
Aborts Tx DMA Transfer.
HardwareSerial::read
size_t read(uint8_t *buffer, size_t size)
Copies the number of data from Rx buffer to your buffer.
Definition: HardwareSerial.h:362
HardwareSerial
This class is for handling UART periphery.
Definition: HardwareSerial.h:109
HardwareSerial::readBytes
size_t readBytes(char *buffer, size_t size) override
@Reads characters from the Rx buffer into your buffer.
SERIAL_TX_ONLY
@ SERIAL_TX_ONLY
Only transmitting mode
Definition: HardwareSerial.h:73
HardwareSerial::write
size_t write(uint8_t c) override
Writes binary data to the serial port.
HardwareSerial::instances
static HardwareSerial * instances[]
Array of all created UART instances (just from this class, not UART structure).
Definition: HardwareSerial.h:745
Stream.h
Base class for character-based streams.