Skip to content

Commit

Permalink
tests/extmod: Add test for machine.UART.IRQ_TXIDLE.
Browse files Browse the repository at this point in the history
The test checks whether the message created by the IRQ handler appears
about at the end of the data sent by UART.

Supported MCUs resp. boards:

- RP2040
- MIMXRT1xxx
- Adafruit ItsyBitsy M0
- Adafruit ItsyBitsy M4
- NRF52 (Arduino Nano Connect 33 BLE)

Signed-off-by: Damien George <damien@micropython.org>
  • Loading branch information
dpgeorge authored and robert-hh committed Aug 28, 2024
1 parent df3d76f commit 921cee9
Show file tree
Hide file tree
Showing 2 changed files with 88 additions and 0 deletions.
76 changes: 76 additions & 0 deletions tests/extmod/machine_uart_irq_txidle.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,76 @@
# Test machine.UART.IRQ_TXIDLE firing after a transmission.
# Does not require any external connections.

try:
from machine import UART

UART.IRQ_TXIDLE
except (ImportError, AttributeError):
print("SKIP")
raise SystemExit

import time, sys

# Configure pins based on the target.
if "rp2" in sys.platform:
uart_id = 0
tx_pin = "GPIO0"
rx_pin = "GPIO1"
min_window = 1
elif "samd" in sys.platform and "ItsyBitsy M0" in sys.implementation._machine:
uart_id = 0
tx_pin = "D1"
rx_pin = "D0"
# For SAMD delay_ms has to be used for the trailing window, and the
# mininmal time is 11 ms to allow for scheduling.
min_window = 11
elif "samd" in sys.platform and "ItsyBitsy M4" in sys.implementation._machine:
uart_id = 3
tx_pin = "D1"
rx_pin = "D0"
min_window = 11
elif "mimxrt" in sys.platform:
uart_id = 1
tx_pin = None
min_window = 0
elif "nrf" in sys.platform:
uart_id = 0
tx_pin = None
min_window = 0
else:
print("Please add support for this test on this platform.")
raise SystemExit


def irq(u):
print("IRQ_TXIDLE:", u.irq().flags() == u.IRQ_TXIDLE)


text = "Hello World" * 20

# Test that the IRQ is called after the write has completed.
for bits_per_s in (2400, 9600, 115200):
if tx_pin is None:
uart = UART(uart_id, bits_per_s)
else:
uart = UART(uart_id, bits_per_s, tx=tx_pin, rx=rx_pin)

uart.irq(irq, uart.IRQ_TXIDLE)

# The IRQ_TXIDLE shall trigger after the message has been sent. Thus
# the test marks a time window close to the expected of the sending
# and the time at which the IRQ should have been fired.
# It is just a rough estimation of 10 characters before and
# 20 characters after the data's end, unless there is a need to
# wait a minimal time, like for SAMD devices.

bits_per_char = 10 # 1(startbit) + 8(bits) + 1(stopbit) + 0(parity)
start_time_us = (len(text) - 10) * bits_per_char * 1_000_000 // bits_per_s
window_ms = max(min_window, 20 * bits_per_char * 1_000 // bits_per_s + 1)

print("write", bits_per_s)
uart.write(text)
time.sleep_us(start_time_us)
print("ready")
time.sleep_ms(window_ms)
print("done")
12 changes: 12 additions & 0 deletions tests/extmod/machine_uart_irq_txidle.py.exp
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
write 2400
ready
IRQ_TXIDLE: True
done
write 9600
ready
IRQ_TXIDLE: True
done
write 115200
ready
IRQ_TXIDLE: True
done

0 comments on commit 921cee9

Please sign in to comment.