micropython/tests/extmod/machine_uart_tx.py
Alessandro Gatti 9c9b99686e tests/target_wiring: Provide an ESP8266 target wiring module.
This commit introduces ESP8266 support for target wiring tests, fixing
execution of relevant tests that once failed on that platform.

ESP8266 boards need to have GPIO4 and GPIO5 connected together to
provide a UART loopback, in order to test whether UART data effectively
flows through.

The wiring-enabled UART transmission timing test was also updated with
measurements compatible with a few ESP8266 test boards.

Signed-off-by: Alessandro Gatti <a.gatti@frob.it>
2025-12-17 16:05:49 +11:00

55 lines
1.7 KiB
Python

# Test machine.UART transmission.
# Does not require any external connections.
try:
from machine import UART
except ImportError:
print("SKIP")
raise SystemExit
import time, sys
from target_wiring import uart_loopback_args, uart_loopback_kwargs
initial_delay_ms = 0
bit_margin = 0
timing_margin_us = 100
# Tune test parameters based on the target.
if "alif" in sys.platform:
bit_margin = 1
elif "esp32" in sys.platform:
timing_margin_us = 400
elif "esp8266" in sys.platform:
timing_margin_us = 4100
elif "mimxrt" in sys.platform:
initial_delay_ms = 20 # UART sends idle frame after init, so wait for that
bit_margin = 1
elif "nrf" in sys.platform:
timing_margin_us = 130
elif "pyboard" in sys.platform:
initial_delay_ms = 50 # UART sends idle frame after init, so wait for that
bit_margin = 1 # first start-bit must wait to sync with the UART clock
elif "rp2" in sys.platform:
timing_margin_us = 180
elif "samd" in sys.platform:
timing_margin_us = 300
bit_margin = 1
# Test that write+flush takes the expected amount of time to execute.
for bits_per_s in (2400, 9600, 115200):
text = "Hello World"
uart = UART(*uart_loopback_args, baudrate=bits_per_s, **uart_loopback_kwargs)
time.sleep_ms(initial_delay_ms)
start_us = time.ticks_us()
uart.write(text)
uart.flush()
duration_us = time.ticks_diff(time.ticks_us(), start_us)
# 1(startbit) + 8(bits) + 1(stopbit) + 0(parity)
bits_per_char = 10
expect_us = (len(text)) * bits_per_char * 1_000_000 // bits_per_s
delta_us = abs(duration_us - expect_us)
margin_us = timing_margin_us + bit_margin * 1_000_000 // bits_per_s
print(bits_per_s, delta_us <= margin_us or delta_us)