pin_irq.py 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116
  1. '''
  2. Pin IRQ test for the CC3200 based boards.
  3. '''
  4. from machine import Pin
  5. import machine
  6. import os
  7. import time
  8. mch = os.uname().machine
  9. if 'LaunchPad' in mch:
  10. pins = ['GP16', 'GP13']
  11. elif 'WiPy' in mch:
  12. pins = ['GP16', 'GP13']
  13. else:
  14. raise Exception('Board not supported!')
  15. pin0 = Pin(pins[0], mode=Pin.OUT, value=1)
  16. pin1 = Pin(pins[1], mode=Pin.IN, pull=Pin.PULL_UP)
  17. def pin_handler (pin_o):
  18. global pin_irq_count_trigger
  19. global pin_irq_count_total
  20. global _trigger
  21. if _trigger & pin1_irq.flags():
  22. pin_irq_count_trigger += 1
  23. pin_irq_count_total += 1
  24. pin_irq_count_trigger = 0
  25. pin_irq_count_total = 0
  26. _trigger = Pin.IRQ_FALLING
  27. pin1_irq = pin1.irq(trigger=_trigger, handler=pin_handler)
  28. for i in range (0, 10):
  29. pin0.toggle()
  30. time.sleep_ms(5)
  31. print(pin_irq_count_trigger == 5)
  32. print(pin_irq_count_total == 5)
  33. pin_irq_count_trigger = 0
  34. pin_irq_count_total = 0
  35. _trigger = Pin.IRQ_RISING
  36. pin1_irq = pin1.irq(trigger=_trigger, handler=pin_handler)
  37. for i in range (0, 200):
  38. pin0.toggle()
  39. time.sleep_ms(5)
  40. print(pin_irq_count_trigger == 100)
  41. print(pin_irq_count_total == 100)
  42. pin1_irq.disable()
  43. pin0(1)
  44. pin_irq_count_trigger = 0
  45. pin_irq_count_total = 0
  46. _trigger = Pin.IRQ_FALLING
  47. pin1_irq.init(trigger=_trigger, handler=pin_handler)
  48. pin0(0)
  49. time.sleep_us(50)
  50. print(pin_irq_count_trigger == 1)
  51. print(pin_irq_count_total == 1)
  52. pin0(1)
  53. time.sleep_us(50)
  54. print(pin_irq_count_trigger == 1)
  55. print(pin_irq_count_total == 1)
  56. # check the call method
  57. pin1_irq()
  58. print(pin_irq_count_trigger == 1) # no flags since the irq was manually triggered
  59. print(pin_irq_count_total == 2)
  60. pin1_irq.disable()
  61. pin_irq_count_trigger = 0
  62. pin_irq_count_total = 0
  63. for i in range (0, 10):
  64. pin0.toggle()
  65. time.sleep_ms(5)
  66. print(pin_irq_count_trigger == 0)
  67. print(pin_irq_count_total == 0)
  68. # test waking up from suspended mode on low level
  69. pin0(0)
  70. t0 = time.ticks_ms()
  71. pin1_irq.init(trigger=Pin.IRQ_LOW_LEVEL, wake=machine.SLEEP)
  72. machine.sleep()
  73. print(time.ticks_ms() - t0 < 10)
  74. print('Awake')
  75. # test waking up from suspended mode on high level
  76. pin0(1)
  77. t0 = time.ticks_ms()
  78. pin1_irq.init(trigger=Pin.IRQ_HIGH_LEVEL, wake=machine.SLEEP)
  79. machine.sleep()
  80. print(time.ticks_ms() - t0 < 10)
  81. print('Awake')
  82. # check for memory leaks
  83. for i in range(0, 1000):
  84. pin0_irq = pin0.irq(trigger=_trigger, handler=pin_handler)
  85. pin1_irq = pin1.irq(trigger=_trigger, handler=pin_handler)
  86. # next ones must raise
  87. try:
  88. pin1_irq.init(trigger=123456, handler=pin_handler)
  89. except:
  90. print('Exception')
  91. try:
  92. pin1_irq.init(trigger=Pin.IRQ_LOW_LEVEL, wake=1789456)
  93. except:
  94. print('Exception')
  95. try:
  96. pin0_irq = pin0.irq(trigger=Pin.IRQ_RISING, wake=machine.SLEEP) # GP16 can't wake up from DEEPSLEEP
  97. except:
  98. print('Exception')
  99. pin0_irq.disable()
  100. pin1_irq.disable()