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的朋友,过来看看
|