uart_irq.py 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148
  1. '''
  2. UART IRQ test for the CC3200 based boards.
  3. '''
  4. from machine import UART
  5. import os
  6. import time
  7. mch = os.uname().machine
  8. if 'LaunchPad' in mch:
  9. uart_pins = [[('GP12', 'GP13'), ('GP12', 'GP13', 'GP7', 'GP6')], [('GP16', 'GP17'), ('GP16', 'GP17', 'GP7', 'GP6')]]
  10. elif 'WiPy' in mch:
  11. uart_pins = [[('GP12', 'GP13'), ('GP12', 'GP13', 'GP7', 'GP6')], [('GP16', 'GP17'), ('GP16', 'GP17', 'GP7', 'GP6')]]
  12. else:
  13. raise Exception('Board not supported!')
  14. # just in case we have stdio duplicated on any of the uarts
  15. os.dupterm(None)
  16. uart0 = UART(0, 1000000, pins=uart_pins[0][0])
  17. uart1 = UART(1, 1000000, pins=uart_pins[1][0])
  18. uart0_int_count = 0
  19. uart1_int_count = 0
  20. def uart0_handler (uart_o):
  21. global uart0_irq
  22. global uart0_int_count
  23. if (uart0_irq.flags() & UART.RX_ANY):
  24. uart0_int_count += 1
  25. def uart1_handler (uart_o):
  26. global uart1_irq
  27. global uart1_int_count
  28. if (uart1_irq.flags() & UART.RX_ANY):
  29. uart1_int_count += 1
  30. uart0_irq = uart0.irq(trigger=UART.RX_ANY, handler=uart0_handler)
  31. uart1_irq = uart1.irq(trigger=UART.RX_ANY, handler=uart1_handler)
  32. uart0.write(b'123')
  33. # wait for the characters to be received
  34. while not uart1.any():
  35. pass
  36. time.sleep_us(100)
  37. print(uart1.any() == 3)
  38. print(uart1_int_count > 0)
  39. print(uart1_irq.flags() == 0)
  40. print(uart0_irq.flags() == 0)
  41. print(uart1.read() == b'123')
  42. uart1.write(b'12345')
  43. # wait for the characters to be received
  44. while not uart0.any():
  45. pass
  46. time.sleep_us(100)
  47. print(uart0.any() == 5)
  48. print(uart0_int_count > 0)
  49. print(uart0_irq.flags() == 0)
  50. print(uart1_irq.flags() == 0)
  51. print(uart0.read() == b'12345')
  52. # do it again
  53. uart1_int_count = 0
  54. uart0.write(b'123')
  55. # wait for the characters to be received
  56. while not uart1.any():
  57. pass
  58. time.sleep_us(100)
  59. print(uart1.any() == 3)
  60. print(uart1_int_count > 0)
  61. print(uart1_irq.flags() == 0)
  62. print(uart0_irq.flags() == 0)
  63. print(uart1.read() == b'123')
  64. # disable the interrupt
  65. uart1_irq.disable()
  66. # do it again
  67. uart1_int_count = 0
  68. uart0.write(b'123')
  69. # wait for the characters to be received
  70. while not uart1.any():
  71. pass
  72. time.sleep_us(100)
  73. print(uart1.any() == 3)
  74. print(uart1_int_count == 0) # no interrupt triggered this time
  75. print(uart1_irq.flags() == 0)
  76. print(uart0_irq.flags() == 0)
  77. print(uart1.read() == b'123')
  78. # enable the interrupt
  79. uart1_irq.enable()
  80. # do it again
  81. uart1_int_count = 0
  82. uart0.write(b'123')
  83. # wait for the characters to be received
  84. while not uart1.any():
  85. pass
  86. time.sleep_us(100)
  87. print(uart1.any() == 3)
  88. print(uart1_int_count > 0)
  89. print(uart1_irq.flags() == 0)
  90. print(uart0_irq.flags() == 0)
  91. print(uart1.read() == b'123')
  92. uart1_irq.init(trigger=UART.RX_ANY, handler=None) # No handler
  93. # do it again
  94. uart1_int_count = 0
  95. uart0.write(b'123')
  96. # wait for the characters to be received
  97. while not uart1.any():
  98. pass
  99. time.sleep_us(100)
  100. print(uart1.any() == 3)
  101. print(uart1_int_count == 0) # no interrupt handler called
  102. print(uart1_irq.flags() == 0)
  103. print(uart0_irq.flags() == 0)
  104. print(uart1.read() == b'123')
  105. # check for memory leaks
  106. for i in range(0, 1000):
  107. uart0_irq = uart0.irq(trigger=UART.RX_ANY, handler=uart0_handler)
  108. uart1_irq = uart1.irq(trigger=UART.RX_ANY, handler=uart1_handler)
  109. # next ones must raise
  110. try:
  111. uart0_irq = uart0.irq(trigger=100, handler=uart0_handler)
  112. except:
  113. print('Exception')
  114. try:
  115. uart0_irq = uart0.irq(trigger=0)
  116. except:
  117. print('Exception')
  118. try:
  119. uart0_irq = uart0.irq(trigger=UART.RX_ANY, wake=Sleep.SUSPENDED)
  120. except:
  121. print('Exception')
  122. uart0_irq.disable()
  123. uart1_irq.disable()