5217|4

2943

帖子

4

TA的资源

五彩晶圆(中级)

楼主
 

GD32的引脚PWM输出停止后输出电平保持问题,熟悉GD32的朋友过来看看! [复制链接]

 

我用GD32F103Cxx的单片机,我开启了单片机提供的PWM功能,初始化后启动输出可以正常输出波形,但是有一个问题无法解决:

就是当timer_disable(TIMER2);执行后,就会保持PWM输出时的状态,我过是高就保持为高,如果为低保持为低。无论引脚设置为GPIO_MODE_AF_PP或GPIO_MODE_AF_OD都没有办法固定为一种状态。我希望在PWM停止后停留在一个固定状态,不论停止时是何种输出状态。或者是否可以检测PWM是否完整的输出一个周期后在停止。

我的初始化代码:


void pwm2_ch1(void)
{

    /* TIMER3 configuration: generate PWM signals with different duty cycles:
       TIMER3CLK = SystemCoreClock / 108 = 1MHz */
    timer_oc_parameter_struct timer_ocintpara;
    timer_parameter_struct timer_initpara;

    rcu_periph_clock_enable(RCU_TIMER2);
    timer_deinit(TIMER2);

    /* TIMER3 configuration */
    timer_initpara.prescaler         = 14400-1;
    timer_initpara.alignedmode       = TIMER_COUNTER_EDGE;
    timer_initpara.counterdirection  = TIMER_COUNTER_UP;
    timer_initpara.period            = 5000 -1;
    timer_initpara.clockdivision     = TIMER_CKDIV_DIV4;
    timer_initpara.repetitioncounter = 0;
    timer_init(TIMER2,&timer_initpara);

     /* CH0 configuration in PWM mode */
    timer_ocintpara.outputstate  = TIMER_CCX_ENABLE;
    timer_ocintpara.outputnstate = TIMER_CCXN_DISABLE;
    timer_ocintpara.ocpolarity   = TIMER_OC_POLARITY_HIGH;
    timer_ocintpara.ocnpolarity  = TIMER_OCN_POLARITY_HIGH;
    timer_ocintpara.ocidlestate  = TIMER_OC_IDLE_STATE_LOW;
    timer_ocintpara.ocnidlestate = TIMER_OCN_IDLE_STATE_LOW;
    timer_channel_output_config(TIMER2,TIMER_CH_1,&timer_ocintpara);

    timer_channel_output_pulse_value_config(TIMER2,TIMER_CH_1,2500);
    timer_channel_output_mode_config(TIMER2,TIMER_CH_1,TIMER_OC_MODE_PWM0);
    timer_channel_output_shadow_config(TIMER2,TIMER_CH_1,TIMER_OC_SHADOW_DISABLE);

    timer_primary_output_config(TIMER2,ENABLE);
    /* auto-reload preload enable */
    timer_auto_reload_shadow_enable(TIMER2);
    //timer_enable(TIMER2);
		

}


	gpio_pin_remap_config(GPIO_TIMER2_PARTIAL_REMAP, ENABLE);
	gpio_init(GPIOB, GPIO_MODE_AF_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_5);

STM32有相应的函数,TIM_ForcedOC3Config在GD32库中没有发现,我目前使用的是HAL库,看了下停止代码如下: 

/**
  * [url=home.php?mod=space&uid=159083]@brief[/url] Stops the PWM signal generation on the complementary output.
  * @param  htim TIM handle
  * @param  Channel TIM Channel to be disabled
  *          This parameter can be one of the following values:
  *            [url=home.php?mod=space&uid=1238002]@arg[/url] TIM_CHANNEL_1: TIM Channel 1 selected
  *            @arg TIM_CHANNEL_2: TIM Channel 2 selected
  *            @arg TIM_CHANNEL_3: TIM Channel 3 selected
  * @retval HAL status
  */
HAL_StatusTypeDef HAL_TIMEx_PWMN_Stop(TIM_HandleTypeDef *htim, uint32_t Channel)
{
  /* Check the parameters */
  assert_param(IS_TIM_CCXN_INSTANCE(htim->Instance, Channel));

  /* Disable the complementary PWM output  */
  TIM_CCxNChannelCmd(htim->Instance, Channel, TIM_CCxN_DISABLE);

  /* Disable the Main Output */
  __HAL_TIM_MOE_DISABLE(htim);

  /* Disable the Peripheral */
  __HAL_TIM_DISABLE(htim);

  /* Set the TIM complementary channel state */
  TIM_CHANNEL_N_STATE_SET(htim, Channel, HAL_TIM_CHANNEL_STATE_READY);

  /* Return function status */
  return HAL_OK;
}

论坛中有熟悉GD32的朋友,过来看看

 

此帖出自GD32 MCU论坛

最新回复

能解决问题 就好,我们试用开发板,就是提出问题,解决问题,也不是说谁对谁错,最终是为了解决问题。希望大家都不走弯路。   详情 回复 发表于 2022-4-28 20:09
点赞 关注
 

回复
举报

7095

帖子

11

TA的资源

版主

沙发
 
PWM到结束后,除非是100, 要不他还是低呀。不知道理解是否对?
此帖出自GD32 MCU论坛

点评

用示波器看过波形吗?建议最好用示波器或者是逻辑分析仪,把时序抓出来。先自己看看你说述的现象是不是你提出的问题。把波形放到帖子里。这样大家好帮你分析。  详情 回复 发表于 2022-4-28 16:07
 
 
 

回复

7095

帖子

11

TA的资源

版主

板凳
 
lugl4313820 发表于 2022-4-28 16:05 PWM到结束后,除非是100, 要不他还是低呀。不知道理解是否对?

用示波器看过波形吗?建议最好用示波器或者是逻辑分析仪,把时序抓出来。先自己看看你说述的现象是不是你提出的问题。把波形放到帖子里。这样大家好帮你分析。

此帖出自GD32 MCU论坛

点评

我描述的问题,是没有问题的,因为我的PWM输出很慢,可以通过观察就可以发现。 目前问题似乎解决了,使用timer_channel_output_mode_config(TIMER2,TIMER_CH_1,TIMER_OC_MODE_LOW); 但是,还是不知道这是不是  详情 回复 发表于 2022-4-28 17:54
 
 
 

回复

2943

帖子

4

TA的资源

五彩晶圆(中级)

4
 
lugl4313820 发表于 2022-4-28 16:07 用示波器看过波形吗?建议最好用示波器或者是逻辑分析仪,把时序抓出来。先自己看看你说述的现象是不是你 ...

我描述的问题,是没有问题的,因为我的PWM输出很慢,可以通过观察就可以发现。

目前问题似乎解决了,使用timer_channel_output_mode_config(TIMER2,TIMER_CH_1,TIMER_OC_MODE_LOW);

但是,还是不知道这是不是正确方式

此帖出自GD32 MCU论坛
 
 
 

回复

7095

帖子

11

TA的资源

版主

5
 

能解决问题 就好,我们试用开发板,就是提出问题,解决问题,也不是说谁对谁错,最终是为了解决问题。希望大家都不走弯路。

此帖出自GD32 MCU论坛
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/8 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表