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
- Teensy 4.x
- 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 19, 2024
1 parent a283ed7 commit 78760d1
Show file tree
Hide file tree
Showing 2 changed files with 81 additions and 0 deletions.
69 changes: 69 additions & 0 deletions tests/extmod/machine_uart_irq_txidle.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,69 @@
# 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 and "Teensy 4" in sys.implementation._machine:
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("SKIP")
raise SystemExit


def irq(u):
print("IRQ_TXIDLE:", bool(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)

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 78760d1

Please sign in to comment.