Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

为stm32的PWM驱动添加对STM32H7的支持、添加互补PWM功能的支持,补全pwm_get命令等 #4250

Merged
merged 5 commits into from
Jan 21, 2021
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
38 changes: 29 additions & 9 deletions bsp/stm32/libraries/HAL_Drivers/drv_pwm.c
Original file line number Diff line number Diff line change
Expand Up @@ -9,8 +9,10 @@
*/

#include <board.h>

#ifdef RT_USING_PWM
#include "drv_config.h"
#include <drivers/rt_drv_pwm.h>

//#define DRV_DEBUG
#define LOG_TAG "drv.pwm"
Expand Down Expand Up @@ -167,13 +169,27 @@ static rt_err_t drv_pwm_enable(TIM_HandleTypeDef *htim, struct rt_pwm_configurat
/* Converts the channel number to the channel number of Hal library */
rt_uint32_t channel = 0x04 * (configuration->channel - 1);

if (!enable)
if (!configuration->complementary)
{
HAL_TIM_PWM_Stop(htim, channel);
if (!enable)
{
HAL_TIM_PWM_Stop(htim, channel);
}
else
{
HAL_TIM_PWM_Start(htim, channel);
}
}
else
else if (configuration->complementary)
{
HAL_TIM_PWM_Start(htim, channel);
if (!enable)
{
HAL_TIMEx_PWMN_Stop(htim, channel);
}
else
{
HAL_TIMEx_PWMN_Start(htim, channel);
}
}

return RT_EOK;
Expand All @@ -187,10 +203,10 @@ static rt_err_t drv_pwm_get(TIM_HandleTypeDef *htim, struct rt_pwm_configuration

#if defined(SOC_SERIES_STM32F2) || defined(SOC_SERIES_STM32F4) || defined(SOC_SERIES_STM32F7)
if (htim->Instance == TIM9 || htim->Instance == TIM10 || htim->Instance == TIM11)
#elif defined(SOC_SERIES_STM32L4)
#elif defined(SOC_SERIES_STM32L4) || defined(SOC_SERIES_STM32H7)
if (htim->Instance == TIM15 || htim->Instance == TIM16 || htim->Instance == TIM17)
#elif defined(SOC_SERIES_STM32MP1)
if (htim->Instance == TIM4)
if (htim->Instance == TIM4)
#elif defined(SOC_SERIES_STM32F1) || defined(SOC_SERIES_STM32F0) || defined(SOC_SERIES_STM32G0)
if (0)
#endif
Expand All @@ -201,7 +217,7 @@ static rt_err_t drv_pwm_get(TIM_HandleTypeDef *htim, struct rt_pwm_configuration
}
else
{
#if defined(SOC_SERIES_STM32L4) || defined(SOC_SERIES_STM32F0) || defined(SOC_SERIES_STM32G0)
#if defined(SOC_SERIES_STM32L4) || defined(SOC_SERIES_STM32F0) || defined(SOC_SERIES_STM32G0) || defined(SOC_SERIES_STM32H7)
tim_clock = HAL_RCC_GetPCLK1Freq();
#else
tim_clock = HAL_RCC_GetPCLK1Freq() * 2;
Expand Down Expand Up @@ -234,7 +250,7 @@ static rt_err_t drv_pwm_set(TIM_HandleTypeDef *htim, struct rt_pwm_configuration

#if defined(SOC_SERIES_STM32F2) || defined(SOC_SERIES_STM32F4) || defined(SOC_SERIES_STM32F7)
if (htim->Instance == TIM9 || htim->Instance == TIM10 || htim->Instance == TIM11)
#elif defined(SOC_SERIES_STM32L4)
#elif defined(SOC_SERIES_STM32L4) || defined(SOC_SERIES_STM32H7)
if (htim->Instance == TIM15 || htim->Instance == TIM16 || htim->Instance == TIM17)
#elif defined(SOC_SERIES_STM32MP1)
if (htim->Instance == TIM4)
Expand All @@ -248,7 +264,7 @@ static rt_err_t drv_pwm_set(TIM_HandleTypeDef *htim, struct rt_pwm_configuration
}
else
{
#if defined(SOC_SERIES_STM32L4) || defined(SOC_SERIES_STM32F0) || defined(SOC_SERIES_STM32G0)
#if defined(SOC_SERIES_STM32L4) || defined(SOC_SERIES_STM32F0) || defined(SOC_SERIES_STM32G0) || defined(SOC_SERIES_STM32H7)
tim_clock = HAL_RCC_GetPCLK1Freq();
#else
tim_clock = HAL_RCC_GetPCLK1Freq() * 2;
Expand Down Expand Up @@ -293,8 +309,12 @@ 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_TRUE;
case PWM_CMD_DISABLE:
return drv_pwm_enable(htim, configuration, RT_FALSE);
case PWM_CMD_SET:
Expand Down
8 changes: 8 additions & 0 deletions components/drivers/include/drivers/rt_drv_pwm.h
Original file line number Diff line number Diff line change
Expand Up @@ -18,12 +18,20 @@
#define PWM_CMD_DISABLE (128 + 1)
#define PWM_CMD_SET (128 + 2)
#define PWM_CMD_GET (128 + 3)
#define PWMN_CMD_ENABLE (128 + 4)
#define PWMN_CMD_DISABLE (128 + 5)

struct rt_pwm_configuration
{
rt_uint32_t channel; /* 0-n */
rt_uint32_t period; /* unit:ns 1ns~4.29s:1Ghz~0.23hz */
rt_uint32_t pulse; /* unit:ns (pulse<=period) */

/*
* RT_TRUE : The channel of pwm is complememtary.
* RT_FALSE : The channel of pwm is nomal.
*/
rt_bool_t complementary;
};

struct rt_device_pwm;
Expand Down
74 changes: 68 additions & 6 deletions components/drivers/misc/rt_drv_pwm.c
Original file line number Diff line number Diff line change
Expand Up @@ -136,7 +136,8 @@ rt_err_t rt_pwm_enable(struct rt_device_pwm *device, int channel)
return -RT_EIO;
}

configuration.channel = channel;
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 */
result = rt_device_control(&device->parent, PWM_CMD_ENABLE, &configuration);

return result;
Expand All @@ -152,7 +153,8 @@ rt_err_t rt_pwm_disable(struct rt_device_pwm *device, int channel)
return -RT_EIO;
}

configuration.channel = channel;
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 */
result = rt_device_control(&device->parent, PWM_CMD_DISABLE, &configuration);

return result;
Expand All @@ -176,6 +178,20 @@ rt_err_t rt_pwm_set(struct rt_device_pwm *device, int channel, rt_uint32_t perio
return result;
}

rt_err_t rt_pwm_get(struct rt_device_pwm *device, struct rt_pwm_configuration *cfg)
{
rt_err_t result = RT_EOK;

if (!device)
{
return -RT_EIO;
}

result = rt_device_control(&device->parent, PWM_CMD_GET, cfg);

return result;
}

#ifdef RT_USING_FINSH
#include <finsh.h>

Expand All @@ -191,6 +207,7 @@ static int pwm_enable(int argc, char **argv)
if (argc != 3)
{
rt_kprintf("Usage: pwm_enable pwm1 1\n");
rt_kprintf(" pwm_enable <pwm_dev> <channel/-channel>\n");
result = -RT_ERROR;
goto _exit;
}
Expand All @@ -202,12 +219,13 @@ static int pwm_enable(int argc, char **argv)
goto _exit;
}

/* If channel is complementary(1), make the channel number to nagetive */
result = rt_pwm_enable(device, atoi(argv[2]));

_exit:
return result;
}
MSH_CMD_EXPORT(pwm_enable, pwm_enable pwm1 1);
MSH_CMD_EXPORT(pwm_enable, pwm_enable <pwm_dev> <channel/-channel>);

static int pwm_disable(int argc, char **argv)
{
Expand All @@ -216,7 +234,8 @@ static int pwm_disable(int argc, char **argv)

if (argc != 3)
{
rt_kprintf("Usage: pwm_enable pwm1 1\n");
rt_kprintf("Usage: pwm_disable pwm1 1\n");
rt_kprintf(" pwm_disable <pwm_dev> <channel/-channel> \n");
result = -RT_ERROR;
goto _exit;
}
Expand All @@ -228,12 +247,13 @@ static int pwm_disable(int argc, char **argv)
goto _exit;
}

/* If channel is complementary(1), make the channel number to nagetive */
result = rt_pwm_disable(device, atoi(argv[2]));

_exit:
return result;
}
MSH_CMD_EXPORT(pwm_disable, pwm_disable pwm1 1);
MSH_CMD_EXPORT(pwm_disable, pwm_disable <pwm_dev> <channel/-channel>);

static int pwm_set(int argc, char **argv)
{
Expand All @@ -243,6 +263,7 @@ static int pwm_set(int argc, char **argv)
if (argc != 5)
{
rt_kprintf("Usage: pwm_set pwm1 1 100 50\n");
rt_kprintf("Usage: pwm_set <pwm_dev> <channel> <period> <pulse>\n");
result = -RT_ERROR;
goto _exit;
}
Expand All @@ -259,7 +280,48 @@ static int pwm_set(int argc, char **argv)
_exit:
return result;
}
MSH_CMD_EXPORT(pwm_set, pwm_set pwm1 1 100 50);
MSH_CMD_EXPORT(pwm_set, pwm_set <pwm_dev> <channel> <period> <pulse>);


static int pwm_get(int argc, char **argv)
{
int result = 0;
struct rt_device_pwm *device = RT_NULL;
struct rt_pwm_configuration cfg = {0};

if (argc != 3)
{
rt_kprintf("Usage: pwm_get pwm1 1\n");
rt_kprintf(" pwm_get <pwm_dev> <channel>\n");
result = -RT_ERROR;
goto _exit;
}

device = (struct rt_device_pwm *)rt_device_find(argv[1]);
if (!device)
{
result = -RT_EIO;
goto _exit;
}

cfg.channel = atoi(argv[2]);
result = rt_pwm_get(device, &cfg);
if (result != RT_EOK)
{
rt_kprintf("Get info of device: [%s] error.\n", argv[1]);
}
else
{
rt_kprintf("Get info of device: [%s]:\n", argv[1]);
rt_kprintf("period : %d\n", cfg.period);
rt_kprintf("pulse : %d\n", cfg.pulse);
rt_kprintf("Duty cycle : %d%%\n", (int)(((double)(cfg.pulse)/(cfg.period)) * 100));
}

_exit:
return result;
}
MSH_CMD_EXPORT(pwm_get, pwm_get <pwm_dev> <channel>);

#endif /* FINSH_USING_MSH */
#endif /* RT_USING_FINSH */