打印

GD32的TIMER0_CH0可以当作普通的PWM输出吗

[复制链接]
1009|18
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
duo点|  楼主 | 2025-3-28 12:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
GD32的TIMER0为高级定时器,他有互补输出,现在只想使用为普通的非互补输出,那么它的TIMER0_CH0可以当作普通的PWM输出吗?不开启互补输出它的TIMER0_CH0_ON可以用作普通的GPIO吗?

使用特权

评论回复
沙发
tpgf| | 2025-4-9 15:34 | 只看该作者
GD32的TIMER0_CH0可以当作普通的PWM输出,但需要正确配置相关参数

使用特权

评论回复
板凳
yangjiyou1969| | 2025-4-9 16:18 | 只看该作者
在定时器配置里配置一下就可以了
        /* CH0 configuration in OC TOGGLE mode */
        if (LED_CCXN) {
                timer_ocintpara.outputstate  = TIMER_CCX_DISABLE;                                //ͨµÀÊä³ö״̬
                timer_ocintpara.outputnstate = TIMER_CCXN_ENABLE;                                //»¥²¹Í¨µÀÊä³ö״̬
                timer_ocintpara.ocnpolarity  = TIMER_OCN_POLARITY_HIGH;        //»¥²¹Í¨µÀÊä³ö¼«ÐÔ
                timer_ocintpara.ocnidlestate = TIMER_OCN_IDLE_STATE_LOW;//¿ÕÏÐ״̬Ï»¥²¹Í¨µÀÊä³ö¼«ÐÔ
        }else{
                timer_ocintpara.outputstate  = TIMER_CCX_ENABLE;                                //ͨµÀÊä³ö״̬
                timer_ocintpara.outputnstate = TIMER_CCXN_DISABLE;                        //»¥²¹Í¨µÀÊä³ö״̬
                timer_ocintpara.ocpolarity   = TIMER_OC_POLARITY_HIGH;        //ͨµÀÊä³ö¼«ÐÔ
                timer_ocintpara.ocidlestate  = TIMER_OC_IDLE_STATE_LOW;        //¿ÕÏÐ״̬ÏÂͨµÀÊä³ö
        }
        timer_channel_output_config(ThisTIMER, TimerCh, &timer_ocintpara);
       
//1=        TIMER_OC_MODE_TOGGLE

//        timer_channel_output_mode_config(ThisTIMER, TimerCh, TIMER_OC_MODE_TOGGLE);
//        timer_channel_output_shadow_config(ThisTIMER, TimerCh, TIMER_OC_SHADOW_ENABLE);

// or

//2=        TIMER_OC_MODE_PWM0

        timer_channel_output_mode_config(ThisTIMER, TimerCh, TIMER_OC_MODE_PWM0);
        timer_channel_output_pulse_value_config(ThisTIMER,TimerCh,2500-1);
        timer_channel_output_shadow_config(ThisTIMER, TimerCh, TIMER_OC_SHADOW_ENABLE);
        /* auto-reload preload enable */

使用特权

评论回复
地板
yangjiyou1969| | 2025-4-9 16:23 | 只看该作者
在定时器配置里配置一下就可以了
        /* CH0 configuration in OC TOGGLE mode */
        if (LED_CCXN) {
                timer_ocintpara.outputstate  = TIMER_CCX_DISABLE;                                //通道输出状态
                timer_ocintpara.outputnstate = TIMER_CCXN_ENABLE;                                //互补通道输出状态
                timer_ocintpara.ocnpolarity  = TIMER_OCN_POLARITY_HIGH;        //互补通道输出极性
                timer_ocintpara.ocnidlestate = TIMER_OCN_IDLE_STATE_LOW;//空闲状态下互补通道输出极性
        }else{
                timer_ocintpara.outputstate  = TIMER_CCX_ENABLE;                                //通道输出状态
                timer_ocintpara.outputnstate = TIMER_CCXN_DISABLE;                        //互补通道输出状态
                timer_ocintpara.ocpolarity   = TIMER_OC_POLARITY_HIGH;        //通道输出极性
                timer_ocintpara.ocidlestate  = TIMER_OC_IDLE_STATE_LOW;        //空闲状态下通道输出
        }
        timer_channel_output_config(ThisTIMER, TimerCh, &timer_ocintpara);
       
//1=        TIMER_OC_MODE_TOGGLE

//        timer_channel_output_mode_config(ThisTIMER, TimerCh, TIMER_OC_MODE_TOGGLE);
//        timer_channel_output_shadow_config(ThisTIMER, TimerCh, TIMER_OC_SHADOW_ENABLE);

// or

//2=        TIMER_OC_MODE_PWM0

        timer_channel_output_mode_config(ThisTIMER, TimerCh, TIMER_OC_MODE_PWM0);
        timer_channel_output_pulse_value_config(ThisTIMER,TimerCh,2500-1);
        timer_channel_output_shadow_config(ThisTIMER, TimerCh, TIMER_OC_SHADOW_ENABLE);
        /* auto-reload preload enable */

使用特权

评论回复
5
xiaoqizi| | 2025-4-13 20:45 | 只看该作者
选择合适的计数模式,如向上计数模式或中央对齐计数模式等

使用特权

评论回复
6
木木guainv| | 2025-4-14 08:04 | 只看该作者
配置自动重装载寄存器的值,该值决定了PWM的周期。例如,如果系统时钟频率为72MHz,想要得到一个周期为10ms的PWM信号,那么自动重装载寄存器的值应设置为72000-1

使用特权

评论回复
7
Jiangxiaopi| | 2025-4-14 11:07 | 只看该作者
比较输出使能位用于控制是否输出PWM信号,输出极性位则决定了PWM信号的高低电平状态

使用特权

评论回复
8
荣陶陶| | 2025-4-14 14:08 | 只看该作者
根据实际需求设置预分频器的值,以调整定时器的计数频率

使用特权

评论回复
9
Zhiniaocun| | 2025-4-14 17:12 | 只看该作者
比较输出使能位用于控制是否输出PWM信号,输出极性位则决定了PWM信号的高低电平状态

使用特权

评论回复
10
liu96jp| | 2025-4-18 14:03 | 只看该作者
在GD32系列单片机中,TIMER0作为高级定时器,确实支持互补输出功能,但您也可以将其配置为普通的非互补PWM输出模式。

使用特权

评论回复
11
ex7s4| | 2025-4-18 15:13 | 只看该作者
可以将TIMER0_CH0配置为普通PWM输出,而无需启用互补输出。

使用特权

评论回复
12
zhizia4f| | 2025-4-18 16:22 | 只看该作者
在 timer_channel_output_config() 中设置 outputnstate = TIMER_CCXN_DISABLE,这样互补通道(CH0_ON)就不会被占用。

使用特权

评论回复
13
y1n9an| | 2025-4-18 17:35 | 只看该作者
确保 outputstate = TIMER_CCX_ENABLE,使CH0正常输出PWM

使用特权

评论回复
14
w2nme1ai7| | 2025-4-18 19:30 | 只看该作者
不调用 timer_primary_output_config()(或设为 DISABLE),以避免强制启用互补输出

使用特权

评论回复
15
su1yirg| | 2025-4-18 21:15 | 只看该作者
可以将TIMER0_CH0_ON用作普通GPIO

使用特权

评论回复
16
l1uyn9b| | 2025-4-19 08:22 | 只看该作者
互补通道未被使能,确保 outputnstate = TIMER_CCXN_DISABLE,否则该引脚会被定时器占用。

使用特权

评论回复
17
lamanius| | 2025-4-19 10:18 | 只看该作者
在禁用互补输出后,需将该引脚(如PA7或PB1,具体取决于型号)重新初始化为普通GPIO模式

使用特权

评论回复
18
t1ngus4| | 2025-4-19 13:44 | 只看该作者
检查复用功能,确保该引脚未绑定到其他外设(如UART、SPI等)

使用特权

评论回复
19
g0d5xs| | 2025-4-19 15:21 | 只看该作者
即使不启用互补输出,某些高级定时器(如TIMER0)的寄存器可能仍会强制检查相关配置,需确保 timer_break_config() 中的死区时间设为0,避免意外影响

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

460

主题

1792

帖子

1

粉丝