[rt_drv_pwm]完善PWM框架互补输出部分代码 (#6338)

* [pwm]Improve the code

* 将与bsp无关的代码移植到框架部分

* 添加注释
This commit is contained in:
liYangYang 2022-09-01 12:59:44 +08:00 committed by GitHub
parent 6ac09a6db0
commit d25bf469fa
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 43 additions and 12 deletions

View File

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 2006-2021, RT-Thread Development Team * Copyright (c) 2006-2022, RT-Thread Development Team
* *
* SPDX-License-Identifier: Apache-2.0 * SPDX-License-Identifier: Apache-2.0
* *
@ -383,12 +383,8 @@ static rt_err_t drv_pwm_control(struct rt_device_pwm *device, int cmd, void *arg
switch (cmd) switch (cmd)
{ {
case PWMN_CMD_ENABLE:
configuration->complementary = RT_TRUE;
case PWM_CMD_ENABLE: case PWM_CMD_ENABLE:
return drv_pwm_enable(htim, configuration, RT_TRUE); return drv_pwm_enable(htim, configuration, RT_TRUE);
case PWMN_CMD_DISABLE:
configuration->complementary = RT_FALSE;
case PWM_CMD_DISABLE: case PWM_CMD_DISABLE:
return drv_pwm_enable(htim, configuration, RT_FALSE); return drv_pwm_enable(htim, configuration, RT_FALSE);
case PWM_CMD_SET: case PWM_CMD_SET:

View File

@ -24,7 +24,7 @@
struct rt_pwm_configuration struct rt_pwm_configuration
{ {
rt_uint32_t channel; /* 1-n or 0-n, which depends on specific MCU requirements */ rt_uint32_t channel; /* 0 ~ n or 0 ~ -n, which depends on specific MCU requirements */
rt_uint32_t period; /* unit:ns 1ns~4.29s:1Ghz~0.23hz */ rt_uint32_t period; /* unit:ns 1ns~4.29s:1Ghz~0.23hz */
rt_uint32_t pulse; /* unit:ns (pulse<=period) */ rt_uint32_t pulse; /* unit:ns (pulse<=period) */

View File

@ -8,6 +8,7 @@
* 2018-05-07 aozima the first version * 2018-05-07 aozima the first version
* 2022-05-14 Stanley Lwin add pwm function * 2022-05-14 Stanley Lwin add pwm function
* 2022-07-25 liYony fix complementary outputs and add usage information in finsh * 2022-07-25 liYony fix complementary outputs and add usage information in finsh
* 2022-08-31 liYony Add complementary output section to framework for management
*/ */
#include <rtdevice.h> #include <rtdevice.h>
@ -16,10 +17,20 @@ static rt_err_t _pwm_control(rt_device_t dev, int cmd, void *args)
{ {
rt_err_t result = RT_EOK; rt_err_t result = RT_EOK;
struct rt_device_pwm *pwm = (struct rt_device_pwm *)dev; struct rt_device_pwm *pwm = (struct rt_device_pwm *)dev;
struct rt_pwm_configuration *configuration = (struct rt_pwm_configuration *)args;
if (pwm->ops->control) switch (cmd)
{ {
result = pwm->ops->control(pwm, cmd, args); case PWMN_CMD_ENABLE:
configuration->complementary = RT_TRUE;
break;
case PWMN_CMD_DISABLE:
configuration->complementary = RT_FALSE;
break;
default:
if(pwm->ops->control)
result = pwm->ops->control(pwm, cmd, args);
break;
} }
return result; return result;
@ -136,8 +147,20 @@ rt_err_t rt_pwm_enable(struct rt_device_pwm *device, int channel)
return -RT_EIO; return -RT_EIO;
} }
configuration.channel = (channel > 0) ? (channel) : (-channel); /* Make it is positive num forever */ /* Make it is positive num forever */
configuration.complementary = (channel > 0) ? (RT_FALSE) : (RT_TRUE); /* If nagetive, it's complementary */ configuration.channel = (channel > 0) ? (channel) : (-channel);
/* If channel is a positive number (0 ~ n), it means using normal output pin.
* If channel is a negative number (0 ~ -n), it means using complementary output pin. */
if(channel > 0)
{
result = rt_device_control(&device->parent, PWMN_CMD_DISABLE, &configuration);
}
else
{
result = rt_device_control(&device->parent, PWMN_CMD_ENABLE, &configuration);
}
result = rt_device_control(&device->parent, PWM_CMD_ENABLE, &configuration); result = rt_device_control(&device->parent, PWM_CMD_ENABLE, &configuration);
return result; return result;
@ -153,8 +176,20 @@ rt_err_t rt_pwm_disable(struct rt_device_pwm *device, int channel)
return -RT_EIO; return -RT_EIO;
} }
configuration.channel = (channel > 0) ? (channel) : (-channel); /* Make it is positive num forever */ /* Make it is positive num forever */
configuration.complementary = (channel > 0) ? (RT_FALSE) : (RT_TRUE); /* If nagetive, it's complementary */ configuration.channel = (channel > 0) ? (channel) : (-channel);
/* If channel is a positive number (0 ~ n), it means using normal output pin.
* If channel is a negative number (0 ~ -n), it means using complementary output pin. */
if(channel > 0)
{
result = rt_device_control(&device->parent, PWMN_CMD_DISABLE, &configuration);
}
else
{
result = rt_device_control(&device->parent, PWMN_CMD_ENABLE, &configuration);
}
result = rt_device_control(&device->parent, PWM_CMD_DISABLE, &configuration); result = rt_device_control(&device->parent, PWM_CMD_DISABLE, &configuration);
return result; return result;