未验证 提交 a4eb5a53 编写于 作者: 1 100ask-Alen 提交者: GitHub

提交stm32 bsp drv_pwm.c里面的一个小建议 (#6517)

 在使用stm32的pwm驱动时,发现其初始化channel的时候是根据device->channel这个值去初始化的,device->channel这个值是在pwm_configh.h里面定义设置的,又根据rtt的pwm例程,和常规习惯,应该大多数人会更喜欢设置channel=1/2/3/4,而不是在pwm_configh.h中将channel设置为TIM_CHANNEL_1/2/3/4,因此建议drv_pwm.c做出PR中的修改。

在实际开发中,因pwm_configh.h的示例均是.channel=0,又没有做出解释说明要让.channel=TIM_CHANNEL_1/2/3/4的值,容易误操作导致没有成功输出PWM,这是我在实际开发中遇到的现实问题,因而提出此建议。
上级 721c08dc
...@@ -17,6 +17,12 @@ ...@@ -17,6 +17,12 @@
extern "C" { extern "C" {
#endif #endif
/*
* .tim_handle.Instance = TIM1/2/3...,
* .name = "your pwm device name",
* .channel = 1/2/3/4
*/
#ifdef BSP_USING_PWM2 #ifdef BSP_USING_PWM2
#ifndef PWM2_CONFIG #ifndef PWM2_CONFIG
#define PWM2_CONFIG \ #define PWM2_CONFIG \
......
...@@ -17,6 +17,12 @@ ...@@ -17,6 +17,12 @@
extern "C" { extern "C" {
#endif #endif
/*
* .tim_handle.Instance = TIM1/2/3...,
* .name = "your pwm device name",
* .channel = 1/2/3/4
*/
#ifdef BSP_USING_PWM1 #ifdef BSP_USING_PWM1
#ifndef PWM1_CONFIG #ifndef PWM1_CONFIG
#define PWM1_CONFIG \ #define PWM1_CONFIG \
......
...@@ -17,6 +17,12 @@ ...@@ -17,6 +17,12 @@
extern "C" { extern "C" {
#endif #endif
/*
* .tim_handle.Instance = TIM1/2/3...,
* .name = "your pwm device name",
* .channel = 1/2/3/4
*/
#ifdef BSP_USING_PWM2 #ifdef BSP_USING_PWM2
#ifndef PWM2_CONFIG #ifndef PWM2_CONFIG
#define PWM2_CONFIG \ #define PWM2_CONFIG \
......
...@@ -17,6 +17,12 @@ ...@@ -17,6 +17,12 @@
extern "C" { extern "C" {
#endif #endif
/*
* .tim_handle.Instance = TIM1/2/3...,
* .name = "your pwm device name",
* .channel = 1/2/3/4
*/
#ifdef BSP_USING_PWM1 #ifdef BSP_USING_PWM1
#ifndef PWM1_CONFIG #ifndef PWM1_CONFIG
#define PWM1_CONFIG \ #define PWM1_CONFIG \
......
...@@ -17,6 +17,12 @@ ...@@ -17,6 +17,12 @@
extern "C" { extern "C" {
#endif #endif
/*
* .tim_handle.Instance = TIM1/2/3...,
* .name = "your pwm device name",
* .channel = 1/2/3/4
*/
#ifdef BSP_USING_PWM1 #ifdef BSP_USING_PWM1
#ifndef PWM1_CONFIG #ifndef PWM1_CONFIG
#define PWM1_CONFIG \ #define PWM1_CONFIG \
......
...@@ -17,6 +17,12 @@ ...@@ -17,6 +17,12 @@
extern "C" { extern "C" {
#endif #endif
/*
* .tim_handle.Instance = TIM1/2/3...,
* .name = "your pwm device name",
* .channel = 1/2/3/4
*/
#ifdef BSP_USING_PWM2 #ifdef BSP_USING_PWM2
#ifndef PWM2_CONFIG #ifndef PWM2_CONFIG
#define PWM2_CONFIG \ #define PWM2_CONFIG \
......
...@@ -18,6 +18,12 @@ ...@@ -18,6 +18,12 @@
extern "C" { extern "C" {
#endif #endif
/*
* .tim_handle.Instance = TIM1/2/3...,
* .name = "your pwm device name",
* .channel = 1/2/3/4
*/
#ifdef BSP_USING_PWM2 #ifdef BSP_USING_PWM2
#ifndef PWM2_CONFIG #ifndef PWM2_CONFIG
#define PWM2_CONFIG \ #define PWM2_CONFIG \
......
...@@ -17,6 +17,12 @@ ...@@ -17,6 +17,12 @@
extern "C" { extern "C" {
#endif #endif
/*
* .tim_handle.Instance = TIM1/2/3...,
* .name = "your pwm device name",
* .channel = 1/2/3/4
*/
#ifdef BSP_USING_PWM2 #ifdef BSP_USING_PWM2
#ifndef PWM2_CONFIG #ifndef PWM2_CONFIG
#define PWM2_CONFIG \ #define PWM2_CONFIG \
......
...@@ -18,6 +18,12 @@ ...@@ -18,6 +18,12 @@
extern "C" { extern "C" {
#endif #endif
/*
* .tim_handle.Instance = TIM1/2/3...,
* .name = "your pwm device name",
* .channel = 1/2/3/4
*/
#ifdef BSP_USING_PWM1 #ifdef BSP_USING_PWM1
#ifndef PWM1_CONFIG #ifndef PWM1_CONFIG
#define PWM1_CONFIG \ #define PWM1_CONFIG \
......
...@@ -17,6 +17,12 @@ ...@@ -17,6 +17,12 @@
extern "C" { extern "C" {
#endif #endif
/*
* .tim_handle.Instance = TIM1/2/3...,
* .name = "your pwm device name",
* .channel = 1/2/3/4
*/
#ifdef BSP_USING_PWM2 #ifdef BSP_USING_PWM2
#ifndef PWM2_CONFIG #ifndef PWM2_CONFIG
#define PWM2_CONFIG \ #define PWM2_CONFIG \
......
...@@ -17,6 +17,12 @@ ...@@ -17,6 +17,12 @@
extern "C" { extern "C" {
#endif #endif
/*
* .tim_handle.Instance = TIM1/2/3...,
* .name = "your pwm device name",
* .channel = 1/2/3/4
*/
#ifdef BSP_USING_PWM1 #ifdef BSP_USING_PWM1
#ifndef PWM1_CONFIG #ifndef PWM1_CONFIG
#define PWM1_CONFIG \ #define PWM1_CONFIG \
......
...@@ -17,6 +17,12 @@ ...@@ -17,6 +17,12 @@
extern "C" { extern "C" {
#endif #endif
/*
* .tim_handle.Instance = TIM1/2/3...,
* .name = "your pwm device name",
* .channel = 1/2/3/4
*/
#ifdef BSP_USING_PWM1 #ifdef BSP_USING_PWM1
#ifndef PWM1_CONFIG #ifndef PWM1_CONFIG
#define PWM1_CONFIG \ #define PWM1_CONFIG \
......
...@@ -17,6 +17,12 @@ ...@@ -17,6 +17,12 @@
extern "C" { extern "C" {
#endif #endif
/*
* .tim_handle.Instance = TIM1/2/3...,
* .name = "your pwm device name",
* .channel = 1/2/3/4
*/
#ifdef BSP_USING_PWM2 #ifdef BSP_USING_PWM2
#ifndef PWM2_CONFIG #ifndef PWM2_CONFIG
#define PWM2_CONFIG \ #define PWM2_CONFIG \
......
...@@ -17,6 +17,12 @@ ...@@ -17,6 +17,12 @@
extern "C" { extern "C" {
#endif #endif
/*
* .tim_handle.Instance = TIM1/2/3...,
* .name = "your pwm device name",
* .channel = 1/2/3/4
*/
#ifdef BSP_USING_PWM1 #ifdef BSP_USING_PWM1
#ifndef PWM1_CONFIG #ifndef PWM1_CONFIG
#define PWM1_CONFIG \ #define PWM1_CONFIG \
......
...@@ -17,6 +17,12 @@ ...@@ -17,6 +17,12 @@
extern "C" { extern "C" {
#endif #endif
/*
* .tim_handle.Instance = TIM1/2/3...,
* .name = "your pwm device name",
* .channel = 1/2/3/4
*/
#ifdef BSP_USING_PWM1 #ifdef BSP_USING_PWM1
#ifndef PWM1_CONFIG #ifndef PWM1_CONFIG
#define PWM1_CONFIG \ #define PWM1_CONFIG \
......
...@@ -234,7 +234,13 @@ static struct rt_pwm_ops drv_ops = ...@@ -234,7 +234,13 @@ static struct rt_pwm_ops drv_ops =
static rt_err_t drv_pwm_enable(TIM_HandleTypeDef *htim, struct rt_pwm_configuration *configuration, rt_bool_t enable) static rt_err_t drv_pwm_enable(TIM_HandleTypeDef *htim, struct rt_pwm_configuration *configuration, rt_bool_t enable)
{ {
/* Converts the channel number to the channel number of Hal library */ /* Converts the channel number to the channel number of Hal library */
rt_uint32_t channel = 0x04 * (configuration->channel - 1); rt_uint32_t channel = configuration->channel;
if(channel < 1 || channel > 4)
{
LOG_E("pwm channel %d is invalid, failed to enable", configuration->channel);
return -RT_ERROR;
}
channel = 0x04 * (configuration->channel - 1);
if (!configuration->complementary) if (!configuration->complementary)
{ {
...@@ -265,7 +271,13 @@ static rt_err_t drv_pwm_enable(TIM_HandleTypeDef *htim, struct rt_pwm_configurat ...@@ -265,7 +271,13 @@ static rt_err_t drv_pwm_enable(TIM_HandleTypeDef *htim, struct rt_pwm_configurat
static rt_err_t drv_pwm_get(TIM_HandleTypeDef *htim, struct rt_pwm_configuration *configuration) static rt_err_t drv_pwm_get(TIM_HandleTypeDef *htim, struct rt_pwm_configuration *configuration)
{ {
/* Converts the channel number to the channel number of Hal library */ /* Converts the channel number to the channel number of Hal library */
rt_uint32_t channel = 0x04 * (configuration->channel - 1); rt_uint32_t channel = configuration->channel;
if(channel < 1 || channel > 4)
{
LOG_E("pwm channel %d is invalid, failed to get", configuration->channel);
return -RT_ERROR;
}
channel = 0x04 * (configuration->channel - 1);
rt_uint64_t tim_clock; rt_uint64_t tim_clock;
tim_clock = tim_clock_get(htim); tim_clock = tim_clock_get(htim);
...@@ -291,7 +303,13 @@ static rt_err_t drv_pwm_set(TIM_HandleTypeDef *htim, struct rt_pwm_configuration ...@@ -291,7 +303,13 @@ static rt_err_t drv_pwm_set(TIM_HandleTypeDef *htim, struct rt_pwm_configuration
rt_uint32_t period, pulse; rt_uint32_t period, pulse;
rt_uint64_t tim_clock, psc; rt_uint64_t tim_clock, psc;
/* Converts the channel number to the channel number of Hal library */ /* Converts the channel number to the channel number of Hal library */
rt_uint32_t channel = 0x04 * (configuration->channel - 1); rt_uint32_t channel = configuration->channel;
if(channel < 1 || channel > 4)
{
LOG_E("pwm channel %d is invalid, failed to set", configuration->channel);
return -RT_ERROR;
}
channel = 0x04 * (configuration->channel - 1);
tim_clock = tim_clock_get(htim); tim_clock = tim_clock_get(htim);
/* Convert nanosecond to frequency and duty cycle. 1s = 1 * 1000 * 1000 * 1000 ns */ /* Convert nanosecond to frequency and duty cycle. 1s = 1 * 1000 * 1000 * 1000 ns */
...@@ -354,7 +372,13 @@ static rt_err_t drv_pwm_set_pulse(TIM_HandleTypeDef *htim, struct rt_pwm_configu ...@@ -354,7 +372,13 @@ static rt_err_t drv_pwm_set_pulse(TIM_HandleTypeDef *htim, struct rt_pwm_configu
rt_uint32_t period, pulse; rt_uint32_t period, pulse;
rt_uint64_t tim_clock; rt_uint64_t tim_clock;
/* Converts the channel number to the channel number of Hal library */ /* Converts the channel number to the channel number of Hal library */
rt_uint32_t channel = 0x04 * (configuration->channel - 1); rt_uint32_t channel = configuration->channel;
if(channel < 1 || channel > 4)
{
LOG_E("pwm channel %d is invalid, failed to set pulse", configuration->channel);
return -RT_ERROR;
}
channel = 0x04 * (configuration->channel - 1);
tim_clock = tim_clock_get(htim); tim_clock = tim_clock_get(htim);
/* Convert nanosecond to frequency and duty cycle. 1s = 1 * 1000 * 1000 * 1000 ns */ /* Convert nanosecond to frequency and duty cycle. 1s = 1 * 1000 * 1000 * 1000 ns */
...@@ -408,6 +432,14 @@ static rt_err_t stm32_hw_pwm_init(struct stm32_pwm *device) ...@@ -408,6 +432,14 @@ static rt_err_t stm32_hw_pwm_init(struct stm32_pwm *device)
TIM_MasterConfigTypeDef master_config = {0}; TIM_MasterConfigTypeDef master_config = {0};
TIM_ClockConfigTypeDef clock_config = {0}; TIM_ClockConfigTypeDef clock_config = {0};
rt_uint32_t channel = device->channel;
if(channel < 1 || channel > 4)
{
LOG_E("%s pwm channel %d is invalid, failed to init", device->name, device->channel);
return -RT_ERROR;
}
channel = 0x04 * (device->channel - 1);
RT_ASSERT(device != RT_NULL); RT_ASSERT(device != RT_NULL);
tim = (TIM_HandleTypeDef *)&device->tim_handle; tim = (TIM_HandleTypeDef *)&device->tim_handle;
...@@ -458,45 +490,11 @@ static rt_err_t stm32_hw_pwm_init(struct stm32_pwm *device) ...@@ -458,45 +490,11 @@ static rt_err_t stm32_hw_pwm_init(struct stm32_pwm *device)
oc_config.OCNIdleState = TIM_OCNIDLESTATE_RESET; oc_config.OCNIdleState = TIM_OCNIDLESTATE_RESET;
oc_config.OCIdleState = TIM_OCIDLESTATE_RESET; oc_config.OCIdleState = TIM_OCIDLESTATE_RESET;
/* config pwm channel */ if (HAL_TIM_PWM_ConfigChannel(tim, &oc_config, channel) != HAL_OK)
if (device->channel & 0x01)
{
if (HAL_TIM_PWM_ConfigChannel(tim, &oc_config, TIM_CHANNEL_1) != HAL_OK)
{
LOG_E("%s channel1 config failed", device->name);
result = -RT_ERROR;
goto __exit;
}
}
if (device->channel & 0x02)
{
if (HAL_TIM_PWM_ConfigChannel(tim, &oc_config, TIM_CHANNEL_2) != HAL_OK)
{
LOG_E("%s channel2 config failed", device->name);
result = -RT_ERROR;
goto __exit;
}
}
if (device->channel & 0x04)
{ {
if (HAL_TIM_PWM_ConfigChannel(tim, &oc_config, TIM_CHANNEL_3) != HAL_OK) LOG_E("%s %d config failed", device->name, device->channel);
{ result = -RT_ERROR;
LOG_E("%s channel3 config failed", device->name); goto __exit;
result = -RT_ERROR;
goto __exit;
}
}
if (device->channel & 0x08)
{
if (HAL_TIM_PWM_ConfigChannel(tim, &oc_config, TIM_CHANNEL_4) != HAL_OK)
{
LOG_E("%s channel4 config failed", device->name);
result = -RT_ERROR;
goto __exit;
}
} }
/* pwm pin configuration */ /* pwm pin configuration */
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册