test_pwm.c 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120
  1. /* Copyright (c) 2023, Canaan Bright Sight Co., Ltd
  2. *
  3. * Redistribution and use in source and binary forms, with or without
  4. * modification, are permitted provided that the following conditions are met:
  5. * 1. Redistributions of source code must retain the above copyright
  6. * notice, this list of conditions and the following disclaimer.
  7. * 2. Redistributions in binary form must reproduce the above copyright
  8. * notice, this list of conditions and the following disclaimer in the
  9. * documentation and/or other materials provided with the distribution.
  10. *
  11. * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
  12. * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
  13. * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
  14. * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
  15. * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
  16. * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
  17. * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
  18. * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
  19. * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
  20. * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
  21. * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
  22. * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
  23. * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  24. */
  25. /*
  26. * Copyright (c) 2006-2025 RT-Thread Development Team
  27. *
  28. * SPDX-License-Identifier: Apache-2.0
  29. */
  30. #include <unistd.h>
  31. #include <stdio.h>
  32. #include <drivers/dev_pwm.h>
  33. #include "drv_pwm.h"
  34. #include "drv_pinctrl.h"
  35. #include <rtdbg.h>
  36. #include "utest.h"
  37. /*
  38. * 测试 PWM 驱动对板载 LED 的亮度控制功能
  39. *
  40. * 1. 查找名为 "pwm" 的 PWM 设备。
  41. * 2. 使用 pinctrl 将 GPIO52 映射为 PWM4 通道,并配置引脚属性:
  42. * - 使能输出(OE);
  43. * - 禁用输入(IE);
  44. * - 禁用上下拉(PU/PD);
  45. * - 设置中等驱动能力(驱动强度为 4)。
  46. * 3. 设置 PWM 输出周期为 100000ns(对应频率为 10kHz)。
  47. * 4. 通过逐步增加 PWM 的脉冲宽度(pulse),控制板载 LED 的亮度由暗到亮:
  48. * - 从 10% 占空比(10000ns)开始;
  49. * - 每次增加 10%,直到 100%(全亮);
  50. * - 每次间隔 2 秒以便观察 LED 亮度变化。
  51. * 5. 最后禁用 PWM 输出,关闭 LED。
  52. *
  53. * 硬件说明:
  54. * - 本测试基于 K230-01studio 开发板;
  55. * - GPIO52 已通过电路连接一颗板载 LED;
  56. * - PWM4 通道控制该 LED 的亮灭和亮度;
  57. * - 测试过程中,可肉眼观察 LED 明暗变化。
  58. *
  59. */
  60. #define PWM_DEV_NAME "pwm1" /* PWM设备名称 */
  61. #define PWM_DEV_CHANNEL 1 /* PWM通道 */
  62. #define TEST_GPIO_LED 52
  63. void pwm_demo(void)
  64. {
  65. LOG_I("set gpio52 in PWM1 start.\n");
  66. k230_pinctrl_set_function(TEST_GPIO_LED, IOMUX_FUNC3);
  67. /* 使能输出 */
  68. k230_pinctrl_set_oe(TEST_GPIO_LED, 1);
  69. /* 禁止输入 */
  70. k230_pinctrl_set_ie(TEST_GPIO_LED, 0);
  71. /* 禁止上拉 */
  72. k230_pinctrl_set_pu(TEST_GPIO_LED, 0);
  73. /* 禁止下拉 */
  74. k230_pinctrl_set_pd(TEST_GPIO_LED, 0);
  75. /* 设置驱动能力为4(中等强度) */
  76. k230_pinctrl_set_drv(TEST_GPIO_LED, 4);
  77. LOG_I("pwm test start.\n");
  78. struct rt_device_pwm *pwm_dev; /* PWM设备句柄 */
  79. rt_uint32_t period; /* 周期, 单位为纳秒ns */
  80. rt_uint32_t pulse; /* PWM脉冲宽度值, 单位为纳秒ns */
  81. rt_err_t ret;
  82. /* 查找设备 */
  83. pwm_dev = (struct rt_device_pwm *)rt_device_find(PWM_DEV_NAME);
  84. uassert_not_null(pwm_dev);
  85. /* 设置PWM周期和脉冲宽度 */
  86. period = 100000; /* PWM 周期:100000ns = 100us,即 10kHz */
  87. /* 逐步循环提高PWM脉冲宽度 */
  88. for(pulse = 10000; pulse <= 100000; pulse+=10000)
  89. {
  90. ret = rt_pwm_set(pwm_dev, PWM_DEV_CHANNEL, period, pulse);
  91. uassert_int_equal(ret, RT_EOK);
  92. ret = rt_pwm_enable(pwm_dev, PWM_DEV_CHANNEL);
  93. uassert_int_equal(ret, RT_EOK);
  94. sleep(2);
  95. }
  96. ret = rt_pwm_disable(pwm_dev, PWM_DEV_CHANNEL);
  97. uassert_int_equal(ret, RT_EOK);
  98. }
  99. static void pwm_testcase(void)
  100. {
  101. UTEST_UNIT_RUN(pwm_demo);
  102. }
  103. static rt_err_t utest_tc_init(void)
  104. {
  105. return RT_EOK;
  106. }
  107. static rt_err_t utest_tc_cleanup(void)
  108. {
  109. return RT_EOK;
  110. }
  111. UTEST_TC_EXPORT(pwm_testcase, "bsp.k230.drivers.pwm", utest_tc_init, utest_tc_cleanup, 10);