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 /*
27 * Copyright (c) 2006-2025 RT-Thread Development Team
28 *
29 * SPDX-License-Identifier: Apache-2.0
30 */
31
32 #include <unistd.h>
33 #include <stdio.h>
34 #include <drivers/dev_pwm.h>
35 #include "drv_pwm.h"
36 #include "drv_pinctrl.h"
37 #include <rtdbg.h>
38 #include "utest.h"
39
40 /*
41 * 测试 PWM 驱动对板载 LED 的亮度控制功能
42 *
43 * 1. 查找名为 "pwm" 的 PWM 设备。
44 * 2. 使用 pinctrl 将 GPIO52 映射为 PWM4 通道,并配置引脚属性:
45 * - 使能输出(OE);
46 * - 禁用输入(IE);
47 * - 禁用上下拉(PU/PD);
48 * - 设置中等驱动能力(驱动强度为 4)。
49 * 3. 设置 PWM 输出周期为 100000ns(对应频率为 10kHz)。
50 * 4. 通过逐步增加 PWM 的脉冲宽度(pulse),控制板载 LED 的亮度由暗到亮:
51 * - 从 10% 占空比(10000ns)开始;
52 * - 每次增加 10%,直到 100%(全亮);
53 * - 每次间隔 2 秒以便观察 LED 亮度变化。
54 * 5. 最后禁用 PWM 输出,关闭 LED。
55 *
56 * 硬件说明:
57 * - 本测试基于 K230-01studio 开发板;
58 * - GPIO52 已通过电路连接一颗板载 LED;
59 * - PWM4 通道控制该 LED 的亮灭和亮度;
60 * - 测试过程中,可肉眼观察 LED 明暗变化。
61 *
62 */
63
64 #define PWM_DEV_NAME "pwm1" /* PWM设备名称 */
65 #define PWM_DEV_CHANNEL 1 /* PWM通道 */
66 #define TEST_GPIO_LED 52
67
pwm_demo(void)68 void pwm_demo(void)
69 {
70 LOG_I("set gpio52 in PWM1 start.\n");
71 k230_pinctrl_set_function(TEST_GPIO_LED, IOMUX_FUNC3);
72 /* 使能输出 */
73 k230_pinctrl_set_oe(TEST_GPIO_LED, 1);
74 /* 禁止输入 */
75 k230_pinctrl_set_ie(TEST_GPIO_LED, 0);
76 /* 禁止上拉 */
77 k230_pinctrl_set_pu(TEST_GPIO_LED, 0);
78 /* 禁止下拉 */
79 k230_pinctrl_set_pd(TEST_GPIO_LED, 0);
80 /* 设置驱动能力为4(中等强度) */
81 k230_pinctrl_set_drv(TEST_GPIO_LED, 4);
82 LOG_I("pwm test start.\n");
83 struct rt_device_pwm *pwm_dev; /* PWM设备句柄 */
84 rt_uint32_t period; /* 周期, 单位为纳秒ns */
85 rt_uint32_t pulse; /* PWM脉冲宽度值, 单位为纳秒ns */
86 rt_err_t ret;
87 /* 查找设备 */
88 pwm_dev = (struct rt_device_pwm *)rt_device_find(PWM_DEV_NAME);
89 uassert_not_null(pwm_dev);
90 /* 设置PWM周期和脉冲宽度 */
91 period = 100000; /* PWM 周期:100000ns = 100us,即 10kHz */
92 /* 逐步循环提高PWM脉冲宽度 */
93 for(pulse = 10000; pulse <= 100000; pulse+=10000)
94 {
95 ret = rt_pwm_set(pwm_dev, PWM_DEV_CHANNEL, period, pulse);
96 uassert_int_equal(ret, RT_EOK);
97 ret = rt_pwm_enable(pwm_dev, PWM_DEV_CHANNEL);
98 uassert_int_equal(ret, RT_EOK);
99 sleep(2);
100 }
101 ret = rt_pwm_disable(pwm_dev, PWM_DEV_CHANNEL);
102 uassert_int_equal(ret, RT_EOK);
103 }
104
pwm_testcase(void)105 static void pwm_testcase(void)
106 {
107 UTEST_UNIT_RUN(pwm_demo);
108 }
109
utest_tc_init(void)110 static rt_err_t utest_tc_init(void)
111 {
112 return RT_EOK;
113 }
114
utest_tc_cleanup(void)115 static rt_err_t utest_tc_cleanup(void)
116 {
117 return RT_EOK;
118 }
119
120 UTEST_TC_EXPORT(pwm_testcase, "pwm", utest_tc_init, utest_tc_cleanup, 10);