1 /*
2  * Copyright (c) 2006-2023, RT-Thread Development Team
3  *
4  * SPDX-License-Identifier: Apache-2.0
5  *
6  * Change Logs:
7  * Date           Author         Notes
8  * 2023-3-27     wcx1024979076   first version.
9  */
10 /*
11  * 程序清单:这是一个 PWM 设备使用例程
12  * 例程导出了 pwm_led_sample 命令到控制终端
13  * 命令调用格式:pwm_led_sample
14  * 程序功能:通过 PWM 设备控制 LED 灯的亮度,可以看到LED不停的由暗变到亮,然后又从亮变到暗。
15 */
16 #include <rtthread.h>
17 #include <rtdevice.h>
18 
19 #ifdef BSP_USING_PWM
20 
21 #define LED_PIN_NUM          8     /* LED PIN脚编号,查看驱动文件drv_gpio.c确定 */
22 #define PWM_DEV_NAME        "pwm"  /* PWM设备名称 */
23 #define PWM_DEV_CHANNEL      0       /* PWM通道 */
24 struct rt_device_pwm *pwm_dev;      /* PWM设备句柄 */
pwm_led_sample(int argc,char * argv[])25 static int pwm_led_sample(int argc, char *argv[])
26 {
27     rt_uint32_t period, pulse, dir;
28     period = 500000;    /* 周期为0.5ms,单位为纳秒ns */
29     dir = 1;            /* PWM脉冲宽度值的增减方向 */
30     pulse = 0;          /* PWM脉冲宽度值,单位为纳秒ns */
31 
32     /* 查找设备 */
33     pwm_dev = (struct rt_device_pwm *)rt_device_find(PWM_DEV_NAME);
34     if (pwm_dev == RT_NULL)
35     {
36         rt_kprintf("pwm sample run failed! can't find %s device!\n", PWM_DEV_NAME);
37         return -RT_ERROR;
38     }
39     /* 设置PWM周期和脉冲宽度默认值 */
40     rt_pwm_set(pwm_dev, PWM_DEV_CHANNEL, period, pulse);
41     /* 使能设备 */
42     rt_pwm_enable(pwm_dev, PWM_DEV_CHANNEL);
43 
44     while (1)
45     {
46         rt_thread_mdelay(50);
47         if (dir)
48         {
49             pulse += 400000;      /* 从0值开始每次增加5000ns */
50         }
51         else
52         {
53             pulse -= 400000;      /* 从最大值开始每次减少5000ns */
54         }
55         if (pulse >= period)
56         {
57             dir = 0;
58         }
59         if (0 == pulse)
60         {
61             dir = 1;
62         }
63         /* 设置PWM周期和脉冲宽度 */
64         rt_pwm_set(pwm_dev, PWM_DEV_CHANNEL, period, pulse);
65     }
66 }
67 /* 导出到 msh 命令列表中 */
68 MSH_CMD_EXPORT(pwm_led_sample, pwm sample);
69 
70 #endif   /* RT_USING_PWM */
71