diff --git a/bsp/stm32/libraries/HAL_Drivers/drv_pwm.c b/bsp/stm32/libraries/HAL_Drivers/drv_pwm.c index ff875e8946b8fa0e9dc5071dee315c384fdd317d..b74428d81691611683c9dfb985894454284d88c5 100644 --- a/bsp/stm32/libraries/HAL_Drivers/drv_pwm.c +++ b/bsp/stm32/libraries/HAL_Drivers/drv_pwm.c @@ -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 * @@ -383,12 +383,8 @@ static rt_err_t drv_pwm_control(struct rt_device_pwm *device, int cmd, void *arg switch (cmd) { - case PWMN_CMD_ENABLE: - configuration->complementary = RT_TRUE; case PWM_CMD_ENABLE: return drv_pwm_enable(htim, configuration, RT_TRUE); - case PWMN_CMD_DISABLE: - configuration->complementary = RT_FALSE; case PWM_CMD_DISABLE: return drv_pwm_enable(htim, configuration, RT_FALSE); case PWM_CMD_SET: diff --git a/components/drivers/include/drivers/rt_drv_pwm.h b/components/drivers/include/drivers/rt_drv_pwm.h index 597842be792f5e6b99aede8ea70efe0294a1affc..1338d43ee87d1e9a332c3e5b932bc5d415fa0a0d 100644 --- a/components/drivers/include/drivers/rt_drv_pwm.h +++ b/components/drivers/include/drivers/rt_drv_pwm.h @@ -24,7 +24,7 @@ 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 pulse; /* unit:ns (pulse<=period) */ diff --git a/components/drivers/misc/rt_drv_pwm.c b/components/drivers/misc/rt_drv_pwm.c index bb599721b0cf3e23a92e631915a4e60e26afad4a..23a3283de41710152f0752bbcceb27063a5beeee 100644 --- a/components/drivers/misc/rt_drv_pwm.c +++ b/components/drivers/misc/rt_drv_pwm.c @@ -8,6 +8,7 @@ * 2018-05-07 aozima the first version * 2022-05-14 Stanley Lwin add pwm function * 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 @@ -16,10 +17,20 @@ static rt_err_t _pwm_control(rt_device_t dev, int cmd, void *args) { rt_err_t result = RT_EOK; 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; @@ -136,8 +147,20 @@ rt_err_t rt_pwm_enable(struct rt_device_pwm *device, int channel) return -RT_EIO; } - configuration.channel = (channel > 0) ? (channel) : (-channel); /* Make it is positive num forever */ - configuration.complementary = (channel > 0) ? (RT_FALSE) : (RT_TRUE); /* If nagetive, it's complementary */ + /* Make it is positive num forever */ + 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); return result; @@ -153,8 +176,20 @@ rt_err_t rt_pwm_disable(struct rt_device_pwm *device, int channel) return -RT_EIO; } - configuration.channel = (channel > 0) ? (channel) : (-channel); /* Make it is positive num forever */ - configuration.complementary = (channel > 0) ? (RT_FALSE) : (RT_TRUE); /* If nagetive, it's complementary */ + /* Make it is positive num forever */ + 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); return result;