Skip to content

Commit 1b0174e

Browse files
committed
feat(core): second step of the migration: Serial API
Signed-off-by: Aymane Bahssain <aymane.bahssain@st.com>
1 parent 3ddb770 commit 1b0174e

File tree

4 files changed

+181
-107
lines changed

4 files changed

+181
-107
lines changed

CI/build/examples/BareMinimum/BareMinimum.ino

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,54 @@
33
* It allows to test build of built-in libraries
44
* and can not be executed.
55
*/
6+
7+
#include <SoftwareSerial.h>
8+
9+
#ifndef USER_BTN
10+
#define USER_BTN 2
11+
#endif
12+
13+
#ifndef LED_BUILTIN
14+
#define LED_BUILTIN 13
15+
#endif
16+
17+
#ifndef PIN_SERIAL_RX
18+
#define PIN_SERIAL_RX 0
19+
#endif
20+
21+
#ifndef PIN_SERIAL_TX
22+
#define PIN_SERIAL_TX 1
23+
#endif
24+
25+
#ifndef Serial
26+
HardwareSerial Serial(PIN_SERIAL_RX, PIN_SERIAL_TX);
27+
#endif
28+
29+
SoftwareSerial swSerial(10, 11);
30+
631
void setup() {
32+
// Serial HW & SW
33+
#if (!defined(USBD_USE_CDC) && !defined(DISABLE_GENERIC_SERIALUSB)) && (!defined(VIRTIOCON) && !defined(DISABLE_GENERIC_SERIALVIRTIO))
34+
Serial.setRx(PIN_SERIAL_RX);
35+
Serial.setTx(digitalPinToPinName(PIN_SERIAL_TX));
36+
#endif
37+
Serial.begin(9600); // start serial for output
38+
while (!Serial) {};
39+
40+
// Test SoftwareSerial
41+
swSerial.begin(4800);
42+
swSerial.println("X");
43+
delay(20);
44+
while (swSerial.available()) {
45+
int c = swSerial.read();
46+
Serial.print("swSerial read: ");
47+
Serial.println((char)c);
48+
}
49+
swSerial.end();
50+
751
}
852

953
void loop() {
1054
}
1155

56+

CI/build/examples/BareMinimum/CMakeLists.txt

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ cmake_minimum_required(VERSION 3.21)
77
# STEP 1: set up bases of environment
88
# -----------------------------------------------------------------------------
99

10-
add_definitions(-DEXTENDED_PIN_MODE)
10+
add_definitions(-DEXTENDED_PIN_MODE -DARDUINO_CORE_STM32)
1111

1212
file(REAL_PATH "../../../../" CORE_PATH EXPAND_TILDE)
1313
file(TO_CMAKE_PATH "${CORE_PATH}" CORE_PATH)
@@ -42,12 +42,12 @@ include(build_sketch)
4242
build_sketch(TARGET "BareMinimum"
4343
SOURCES
4444
BareMinimum.ino
45-
# DEPENDS
45+
DEPENDS
4646
# CMSIS_DSP
4747
# EEPROM
4848
# IWatchdog
4949
# Servo
50-
# SoftwareSerial
50+
SoftwareSerial
5151
# SPI
5252
# Wire
5353
)

cores/arduino/HardwareSerial.cpp

Lines changed: 58 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -120,17 +120,17 @@
120120
#endif // HAVE_HWSERIALx
121121

122122
// Constructors ////////////////////////////////////////////////////////////////
123-
HardwareSerial::HardwareSerial(uint32_t _rx, uint32_t _tx, uint32_t _rts, uint32_t _cts)
123+
STM32HardwareSerial::STM32HardwareSerial(pin_size_t _rx, pin_size_t _tx, pin_size_t _rts, pin_size_t _cts)
124124
{
125125
init(digitalPinToPinName(_rx), digitalPinToPinName(_tx), digitalPinToPinName(_rts), digitalPinToPinName(_cts));
126126
}
127127

128-
HardwareSerial::HardwareSerial(PinName _rx, PinName _tx, PinName _rts, PinName _cts)
128+
STM32HardwareSerial::STM32HardwareSerial(PinName _rx, PinName _tx, PinName _rts, PinName _cts)
129129
{
130130
init(_rx, _tx, _rts, _cts);
131131
}
132132

133-
HardwareSerial::HardwareSerial(void *peripheral, HalfDuplexMode_t halfDuplex)
133+
STM32HardwareSerial::STM32HardwareSerial(void *peripheral, HalfDuplexMode_t halfDuplex)
134134
{
135135
// If PIN_SERIALy_RX is not defined assume half-duplex
136136
_serial.pin_rx = NC;
@@ -302,17 +302,17 @@ HardwareSerial::HardwareSerial(void *peripheral, HalfDuplexMode_t halfDuplex)
302302
init(_serial.pin_rx, _serial.pin_tx);
303303
}
304304

305-
HardwareSerial::HardwareSerial(uint32_t _rxtx)
305+
STM32HardwareSerial::STM32HardwareSerial(pin_size_t _rxtx)
306306
{
307307
init(NC, digitalPinToPinName(_rxtx));
308308
}
309309

310-
HardwareSerial::HardwareSerial(PinName _rxtx)
310+
STM32HardwareSerial::STM32HardwareSerial(PinName _rxtx)
311311
{
312312
init(NC, _rxtx);
313313
}
314314

315-
void HardwareSerial::init(PinName _rx, PinName _tx, PinName _rts, PinName _cts)
315+
void STM32HardwareSerial::init(PinName _rx, PinName _tx, PinName _rts, PinName _cts)
316316
{
317317
if (_rx == _tx) {
318318
_serial.pin_rx = NC;
@@ -330,7 +330,7 @@ void HardwareSerial::init(PinName _rx, PinName _tx, PinName _rts, PinName _cts)
330330
_serial.tx_tail = 0;
331331
}
332332

333-
void HardwareSerial::configForLowPower(void)
333+
void STM32HardwareSerial::configForLowPower(void)
334334
{
335335
#if defined(HAL_PWR_MODULE_ENABLED) && (defined(UART_IT_WUF) || defined(LPUART1_BASE))
336336
// Reconfigure properly Serial instance to use HSI as clock source
@@ -342,7 +342,7 @@ void HardwareSerial::configForLowPower(void)
342342

343343
// Actual interrupt handlers //////////////////////////////////////////////////////////////
344344

345-
void HardwareSerial::_rx_complete_irq(serial_t *obj)
345+
void STM32HardwareSerial::_rx_complete_irq(serial_t *obj)
346346
{
347347
// No Parity error, read byte and store it in the buffer if there is room
348348
unsigned char c;
@@ -364,7 +364,7 @@ void HardwareSerial::_rx_complete_irq(serial_t *obj)
364364

365365
// Actual interrupt handlers //////////////////////////////////////////////////
366366

367-
int HardwareSerial::_tx_complete_irq(serial_t *obj)
367+
int STM32HardwareSerial::_tx_complete_irq(serial_t *obj)
368368
{
369369
size_t remaining_data;
370370
// previous HAL transfer is finished, move tail pointer accordingly
@@ -387,7 +387,7 @@ int HardwareSerial::_tx_complete_irq(serial_t *obj)
387387

388388
// Public Methods //////////////////////////////////////////////////////////////
389389

390-
void HardwareSerial::begin(unsigned long baud, byte config)
390+
void STM32HardwareSerial::begin(unsigned long baud, uint16_t config)
391391
{
392392
uint32_t databits = 0;
393393
uint32_t stopbits = 0;
@@ -397,35 +397,42 @@ void HardwareSerial::begin(unsigned long baud, byte config)
397397
_config = config;
398398

399399
// Manage databits
400-
switch (config & 0x07) {
401-
case 0x02:
400+
switch (config & SERIAL_DATA_MASK) {
401+
case SERIAL_DATA_6:
402402
databits = 6;
403403
break;
404-
case 0x04:
404+
case SERIAL_DATA_7:
405405
databits = 7;
406406
break;
407-
case 0x06:
407+
case SERIAL_DATA_8:
408408
databits = 8;
409409
break;
410410
default:
411411
databits = 0;
412412
break;
413413
}
414414

415-
if ((config & 0x30) == 0x30) {
416-
parity = UART_PARITY_ODD;
417-
databits++;
418-
} else if ((config & 0x20) == 0x20) {
419-
parity = UART_PARITY_EVEN;
420-
databits++;
421-
} else {
422-
parity = UART_PARITY_NONE;
415+
switch (config & SERIAL_PARITY_MASK) {
416+
case SERIAL_PARITY_ODD:
417+
parity = UART_PARITY_ODD;
418+
databits++; // word length = data bits + parity
419+
break;
420+
case SERIAL_PARITY_EVEN:
421+
parity = UART_PARITY_EVEN;
422+
databits++;
423+
break;
424+
default:
425+
parity = UART_PARITY_NONE;
426+
break;
423427
}
424428

425-
if ((config & 0x08) == 0x08) {
426-
stopbits = UART_STOPBITS_2;
427-
} else {
428-
stopbits = UART_STOPBITS_1;
429+
switch (config & SERIAL_STOP_BIT_MASK) {
430+
case SERIAL_STOP_BIT_2:
431+
stopbits = UART_STOPBITS_2;
432+
break;
433+
default:
434+
stopbits = UART_STOPBITS_1;
435+
break;
429436
}
430437

431438
switch (databits) {
@@ -453,7 +460,7 @@ void HardwareSerial::begin(unsigned long baud, byte config)
453460
}
454461
}
455462

456-
void HardwareSerial::end()
463+
void STM32HardwareSerial::end()
457464
{
458465
_ready = false;
459466

@@ -466,12 +473,12 @@ void HardwareSerial::end()
466473
_serial.rx_head = _serial.rx_tail;
467474
}
468475

469-
int HardwareSerial::available(void)
476+
int STM32HardwareSerial::available(void)
470477
{
471478
return ((unsigned int)(SERIAL_RX_BUFFER_SIZE + _serial.rx_head - _serial.rx_tail)) % SERIAL_RX_BUFFER_SIZE;
472479
}
473480

474-
int HardwareSerial::peek(void)
481+
int STM32HardwareSerial::peek(void)
475482
{
476483
if (_serial.rx_head == _serial.rx_tail) {
477484
return -1;
@@ -480,7 +487,7 @@ int HardwareSerial::peek(void)
480487
}
481488
}
482489

483-
int HardwareSerial::read(void)
490+
int STM32HardwareSerial::read(void)
484491
{
485492
enableHalfDuplexRx();
486493
// if the head isn't ahead of the tail, we don't have any characters
@@ -493,7 +500,7 @@ int HardwareSerial::read(void)
493500
}
494501
}
495502

496-
int HardwareSerial::availableForWrite(void)
503+
int STM32HardwareSerial::availableForWrite(void)
497504
{
498505
tx_buffer_index_t head = _serial.tx_head;
499506
tx_buffer_index_t tail = _serial.tx_tail;
@@ -504,12 +511,12 @@ int HardwareSerial::availableForWrite(void)
504511
return tail - head - 1;
505512
}
506513

507-
void HardwareSerial::flush()
514+
void STM32HardwareSerial::flush()
508515
{
509516
flush(0);
510517
}
511518

512-
void HardwareSerial::flush(uint32_t timeout)
519+
void STM32HardwareSerial::flush(uint32_t timeout)
513520
{
514521
// If we have never written a byte, no need to flush. This special
515522
// case is needed since there is no way to force the TXC (transmit
@@ -530,7 +537,7 @@ void HardwareSerial::flush(uint32_t timeout)
530537
}
531538
}
532539

533-
size_t HardwareSerial::write(const uint8_t *buffer, size_t size)
540+
size_t STM32HardwareSerial::write(const uint8_t *buffer, size_t size)
534541
{
535542
size_t size_intermediate;
536543
size_t ret = size;
@@ -591,75 +598,75 @@ size_t HardwareSerial::write(const uint8_t *buffer, size_t size)
591598
return ret;
592599
}
593600

594-
size_t HardwareSerial::write(uint8_t c)
601+
size_t STM32HardwareSerial::write(uint8_t c)
595602
{
596603
uint8_t buff = c;
597604
return write(&buff, 1);
598605
}
599606

600-
void HardwareSerial::setRx(uint32_t _rx)
607+
void STM32HardwareSerial::setRx(pin_size_t _rx)
601608
{
602609
_serial.pin_rx = digitalPinToPinName(_rx);
603610
}
604611

605-
void HardwareSerial::setTx(uint32_t _tx)
612+
void STM32HardwareSerial::setTx(pin_size_t _tx)
606613
{
607614
_serial.pin_tx = digitalPinToPinName(_tx);
608615
}
609616

610-
void HardwareSerial::setRx(PinName _rx)
617+
void STM32HardwareSerial::setRx(PinName _rx)
611618
{
612619
_serial.pin_rx = _rx;
613620
}
614621

615-
void HardwareSerial::setTx(PinName _tx)
622+
void STM32HardwareSerial::setTx(PinName _tx)
616623
{
617624
_serial.pin_tx = _tx;
618625
}
619626

620-
void HardwareSerial::setRts(uint32_t _rts)
627+
void STM32HardwareSerial::setRts(pin_size_t _rts)
621628
{
622629
_serial.pin_rts = digitalPinToPinName(_rts);
623630
}
624631

625-
void HardwareSerial::setCts(uint32_t _cts)
632+
void STM32HardwareSerial::setCts(pin_size_t _cts)
626633
{
627634
_serial.pin_cts = digitalPinToPinName(_cts);
628635
}
629636

630-
void HardwareSerial::setRtsCts(uint32_t _rts, uint32_t _cts)
637+
void STM32HardwareSerial::setRtsCts(pin_size_t _rts, pin_size_t _cts)
631638
{
632639
_serial.pin_rts = digitalPinToPinName(_rts);
633640
_serial.pin_cts = digitalPinToPinName(_cts);
634641
}
635642

636-
void HardwareSerial::setRts(PinName _rts)
643+
void STM32HardwareSerial::setRts(PinName _rts)
637644
{
638645
_serial.pin_rts = _rts;
639646
}
640647

641-
void HardwareSerial::setCts(PinName _cts)
648+
void STM32HardwareSerial::setCts(PinName _cts)
642649
{
643650
_serial.pin_cts = _cts;
644651
}
645652

646-
void HardwareSerial::setRtsCts(PinName _rts, PinName _cts)
653+
void STM32HardwareSerial::setRtsCts(PinName _rts, PinName _cts)
647654
{
648655
_serial.pin_rts = _rts;
649656
_serial.pin_cts = _cts;
650657
}
651658

652-
void HardwareSerial::setHalfDuplex(void)
659+
void STM32HardwareSerial::setHalfDuplex(void)
653660
{
654661
_serial.pin_rx = NC;
655662
}
656663

657-
bool HardwareSerial::isHalfDuplex(void) const
664+
bool STM32HardwareSerial::isHalfDuplex(void) const
658665
{
659666
return _serial.pin_rx == NC;
660667
}
661668

662-
void HardwareSerial::enableHalfDuplexRx(void)
669+
void STM32HardwareSerial::enableHalfDuplexRx(void)
663670
{
664671
if (isHalfDuplex()) {
665672
// In half-duplex mode we have to wait for all TX characters to
@@ -672,17 +679,17 @@ void HardwareSerial::enableHalfDuplexRx(void)
672679
}
673680
}
674681

675-
void HardwareSerial::setRxInvert(void)
682+
void STM32HardwareSerial::setRxInvert(void)
676683
{
677684
_rx_invert = true;
678685
}
679686

680-
void HardwareSerial::setTxInvert(void)
687+
void STM32HardwareSerial::setTxInvert(void)
681688
{
682689
_tx_invert = true;
683690
}
684691

685-
void HardwareSerial::setDataInvert(void)
692+
void STM32HardwareSerial::setDataInvert(void)
686693
{
687694
_data_invert = true;
688695
}

0 commit comments

Comments
 (0)