test_gpio_irq.c 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133
  1. /*
  2. * Copyright (C) 2022, Canaan Bright Sight Co., Ltd
  3. *
  4. * All enquiries to https://www.canaan-creative.com/
  5. */
  6. /*
  7. * Copyright (c) 2006-2025 RT-Thread Development Team
  8. *
  9. * SPDX-License-Identifier: Apache-2.0
  10. */
  11. /*
  12. * 本测试用例演示基于 01Studio Canmv-K230 开发板测试 gpio 的中断检测功能。其中
  13. * 采用开发板上的按键 S3 以及其连接的 KEY_GPIO21 作为中断输入
  14. * 在中断处理函数中控制 LED 的状态。LED2 采用开发板上的 LED2(连接 LED_GPIO52)。
  15. * gpio_falling_edge_trigger_irq 将按键 S3 的中断触发方式设置为下降沿触发,测试
  16. * 时应该会观察到在每次按下 S3 时收到中断。
  17. * gpio_rising_edge_trigger_irq 将按键 S3 的中断触发方式设置为上升沿触发,测试
  18. * 时应该会观察到在每次松开 S3 时收到中断。
  19. * gpio_both_edge_trigger_irq 将按键 S3 的中断触发方式设置为双边沿触发。测试时
  20. * 应该会观察到在每次按下或松开 S3 时都会收到中断。
  21. */
  22. #include <unistd.h>
  23. #include <stdio.h>
  24. #include <rtthread.h>
  25. #include <rtdevice.h>
  26. #include "drv_gpio.h"
  27. #include "utest.h"
  28. #define LED_PIN_NUM 52
  29. #define KEY_PIN_NUM 21
  30. /* It is best to use an even number, especially for testing both edges triggering. */
  31. #define MAX_LOOP_COUNT 6
  32. static volatile int cnt;
  33. #define LED_ON 1
  34. #define LED_OFF 0
  35. static volatile int led_status;
  36. static void led_on(void)
  37. {
  38. LOG_W("led ON\n");
  39. kd_pin_write(LED_PIN_NUM, GPIO_PV_HIGH);
  40. led_status = LED_ON;
  41. }
  42. static void led_off(void)
  43. {
  44. LOG_W("led OFF\n");
  45. kd_pin_write(LED_PIN_NUM, GPIO_PV_LOW);
  46. led_status = LED_OFF;
  47. }
  48. void key_irq(void *args)
  49. {
  50. LOG_I("---> IRQ: %d\n", ++cnt);
  51. if(LED_OFF == led_status)
  52. led_on();
  53. else
  54. led_off();
  55. }
  56. static void gpio_falling_edge_trigger_irq(void)
  57. {
  58. cnt = 0;
  59. /* Use default pinmux function */
  60. kd_pin_mode(LED_PIN_NUM, GPIO_DM_OUTPUT);
  61. led_off();
  62. /* Use default pinmux function */
  63. kd_pin_mode(KEY_PIN_NUM, GPIO_DM_INPUT);
  64. kd_pin_attach_irq(KEY_PIN_NUM, GPIO_PE_FALLING, key_irq, RT_NULL);
  65. kd_pin_irq_enable(KEY_PIN_NUM, KD_GPIO_IRQ_ENABLE);
  66. while (cnt < MAX_LOOP_COUNT);
  67. kd_pin_detach_irq(KEY_PIN_NUM);
  68. }
  69. static void gpio_rising_edge_trigger_irq(void)
  70. {
  71. cnt = 0;
  72. /* Use default pinmux function */
  73. kd_pin_mode(LED_PIN_NUM, GPIO_DM_OUTPUT);
  74. led_off();
  75. /* Use default pinmux function */
  76. kd_pin_mode(KEY_PIN_NUM, GPIO_DM_INPUT);
  77. kd_pin_attach_irq(KEY_PIN_NUM, GPIO_PE_RISING, key_irq, RT_NULL);
  78. kd_pin_irq_enable(KEY_PIN_NUM, KD_GPIO_IRQ_ENABLE);
  79. while (cnt < MAX_LOOP_COUNT);
  80. kd_pin_detach_irq(KEY_PIN_NUM);
  81. }
  82. static void gpio_both_edge_trigger_irq(void)
  83. {
  84. cnt = 0;
  85. /* Use default pinmux function */
  86. kd_pin_mode(LED_PIN_NUM, GPIO_DM_OUTPUT);
  87. led_off();
  88. /* Use default pinmux function */
  89. kd_pin_mode(KEY_PIN_NUM, GPIO_DM_INPUT);
  90. kd_pin_attach_irq(KEY_PIN_NUM, GPIO_PE_BOTH, key_irq, RT_NULL);
  91. kd_pin_irq_enable(KEY_PIN_NUM, KD_GPIO_IRQ_ENABLE);
  92. while (cnt < MAX_LOOP_COUNT);
  93. kd_pin_detach_irq(KEY_PIN_NUM);
  94. }
  95. static void testcase(void)
  96. {
  97. UTEST_UNIT_RUN(gpio_falling_edge_trigger_irq);
  98. UTEST_UNIT_RUN(gpio_rising_edge_trigger_irq);
  99. UTEST_UNIT_RUN(gpio_both_edge_trigger_irq);
  100. }
  101. static rt_err_t utest_tc_init(void)
  102. {
  103. return RT_EOK;
  104. }
  105. static rt_err_t utest_tc_cleanup(void)
  106. {
  107. return RT_EOK;
  108. }
  109. UTEST_TC_EXPORT(testcase, "gpio_irq", utest_tc_init, utest_tc_cleanup, 100);