打印

GD32f310c8 Timre15 配置问题

[复制链接]
210|8
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
LKHZGD|  楼主 | 2024-9-14 08:20 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我是自学的新手,那位老师解答哈GD32f310c8 Timre15 配置单通道PWM配置哪里有问题指点哈谢谢

void timer_config(void)
{

        // PB8 具有 TIMER15 的通道0 功能
        timer_parameter_struct Timer_ParamType;
        timer_oc_parameter_struct Timer_OC_ParamType;
       
        rcu_periph_clock_enable(RCU_GPIOB);//启用外设时钟功能
        rcu_periph_clock_enable(RCU_TIMER15);
       
       
        gpio_af_set(GPIOB,GPIO_AF_2,GPIO_PIN_8);//端口复用为TIMER15_CH0模式
       
        gpio_mode_set(GPIOB, GPIO_MODE_AF, GPIO_PUPD_NONE, GPIO_PIN_8);
  gpio_output_options_set(GPIOB, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_8);
  gpio_bit_set(GPIOB, GPIO_PIN_8);
       
       
        timer_internal_clock_config(TIMER15);
        timer_deinit(TIMER15);
       
        timer_channel_output_mode_config(TIMER15,TIMER_CH_0,TIMER_OC_MODE_PWM0);
        timer_auto_reload_shadow_enable(TIMER15);
       
        Timer_OC_ParamType.ocidlestate = TIMER_OC_IDLE_STATE_HIGH;//空闲时通道输出极性
        Timer_OC_ParamType.ocnidlestate = TIMER_OCN_IDLE_STATE_LOW;//空闲时互补通道输出极性
        Timer_OC_ParamType.ocnpolarity = TIMER_OCN_POLARITY_HIGH;//互补通道输出极性
        Timer_OC_ParamType.ocpolarity = TIMER_OC_POLARITY_HIGH;//通道输出极性
        Timer_OC_ParamType.outputnstate = TIMER_CCXN_DISABLE;//禁用互补通道输出
        Timer_OC_ParamType.outputstate = TIMER_CCX_ENABLE;//使能通道输出
        timer_channel_output_config(TIMER15,TIMER_CH_0,&Timer_OC_ParamType);
       
        Timer_ParamType.alignedmode = TIMER_COUNTER_EDGE;//配置为边沿对其模式
        Timer_ParamType.clockdivision = TIMER_CKDIV_DIV2;//配置死区时间和采样时钟(DTS)之间的分频系数
        Timer_ParamType.counterdirection = TIMER_COUNTER_UP;//配置计数方向为向上计数
        Timer_ParamType.period = 1000-1;//周期
        Timer_ParamType.prescaler = 72-1;//预分频
        Timer_ParamType.repetitioncounter = 1;
        timer_init(TIMER15,&Timer_ParamType);
       
        timer_channel_output_pulse_value_config(TIMER15, TIMER_CH_0, 500-1);//比较寄存器的数值
       
        timer_enable(TIMER15);
}

int main(void)
{
    int16_t i = 0;
    FlagStatus breathe_flag = SET;

    /* configure the GPIO ports */
    gpio_config();

    /* configure the TIMER peripheral */
    timer_config();

    /* configure systick */
    systick_config();

    while (1){
        /* delay a time in milliseconds */
        delay_1ms(2);
        if (SET == breathe_flag){
             i = i + 10;
        }else{
            i = i - 10;
        }
        if(500 < i){
            breathe_flag = RESET;
        }
        if(0 >= i){
            breathe_flag = SET;
        }
        /* configure TIMER channel output pulse value */
        timer_channel_output_pulse_value_config(TIMER15,TIMER_CH_0,i);
    }
}

GD32f310c8 Timre13 这样配置是可以的,

使用特权

评论回复

相关帖子

沙发
cooldog123pp| | 2024-9-14 16:25 | 只看该作者
咋感觉老哥你是不是发错板块了,这个板块估计能给你解答问题的应该很少了。

使用特权

评论回复
评论
LKHZGD 2024-9-14 20:48 回复TA
哦。可能是,没注意,谢谢 
板凳
丙丁先生| | 2024-9-15 06:30 | 只看该作者
根据您提供的代码,配置单通道PWM的部分看起来是正确的。但是,您提到使用的是GD32f310c8 Timre15,而不是Timre13。请确保您使用的是正确的芯片型号和定时器。如果您仍然遇到问题,请检查以下几点:

确保您的硬件连接正确,特别是PB8引脚是否连接到TIMER15的通道0。
检查您的开发环境是否正确配置,包括编译器、库文件等。
检查您的代码是否有其他错误,例如变量类型不匹配、函数调用错误等。
如果问题仍然存在,建议您查阅GD32F310C8的数据手册以获取更多关于定时器配置的信息,或者在相关论坛或社区寻求帮助

使用特权

评论回复
地板
丙丁先生| | 2024-9-15 06:32 | 只看该作者
```c
void timer_config(void)
{
    // PB8 具有 TIMER15 的通道0 功能
    timer_parameter_struct Timer_ParamType;
    timer_oc_parameter_struct Timer_OC_ParamType;
   
    // 启用GPIOB和TIMER15的外设时钟功能
    rcu_periph_clock_enable(RCU_GPIOB);
    rcu_periph_clock_enable(RCU_TIMER15);
   
    // 将PB8端口复用为TIMER15_CH0模式
    gpio_af_set(GPIOB,GPIO_AF_2,GPIO_PIN_8);
   
    // 配置PB8为复用功能,输出模式,无上下拉,速度为50MHz
    gpio_mode_set(GPIOB, GPIO_MODE_AF, GPIO_PUPD_NONE, GPIO_PIN_8);
    gpio_output_options_set(GPIOB, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_8);
    gpio_bit_set(GPIOB, GPIO_PIN_8);
   
    // 配置TIMER15的内部时钟
    timer_internal_clock_config(TIMER15);
    // 复位TIMER15
    timer_deinit(TIMER15);
   
    // 配置TIMER15的通道0为PWM模式
    timer_channel_output_mode_config(TIMER15,TIMER_CH_0,TIMER_OC_MODE_PWM0);
    // 使能TIMER15的自动重装载影子寄存器
    timer_auto_reload_shadow_enable(TIMER15);
   
    // 配置TIMER15的通道0输出参数
    Timer_OC_ParamType.ocidlestate = TIMER_OC_IDLE_STATE_HIGH; //空闲时通道输出极性为高电平
    Timer_OC_ParamType.ocnidlestate = TIMER_OCN_IDLE_STATE_LOW; //空闲时互补通道输出极性为低电平
    Timer_OC_ParamType.ocnpolarity = TIMER_OCN_POLARITY_HIGH; //互补通道输出极性为高电平
    Timer_OC_ParamType.ocpolarity = TIMER_OC_POLARITY_HIGH; //通道输出极性为高电平
    Timer_OC_ParamType.outputnstate = TIMER_CCXN_DISABLE; //禁用互补通道输出
    Timer_OC_ParamType.outputstate = TIMER_CCX_ENABLE; //使能通道输出
    timer_channel_output_config(TIMER15,TIMER_CH_0,&Timer_OC_ParamType);
   
    // 配置TIMER15的参数
    Timer_ParamType.alignedmode = TIMER_COUNTER_EDGE; //配置为边沿对其模式
    Timer_ParamType.clockdivision = TIMER_CKDIV_DIV2; //配置死区时间和采样时钟(DTS)之间的分频系数
    Timer_ParamType.counterdirection = TIMER_COUNTER_UP; //配置计数方向为向上计数
    Timer_ParamType.period = 1000-1; //周期为999
    Timer_ParamType.prescaler = 72-1; //预分频系数为71
    Timer_ParamType.repetitioncounter = 1;
    timer_init(TIMER15,&Timer_ParamType);
   
    // 配置TIMER15的通道0输出脉冲值
    timer_channel_output_pulse_value_config(TIMER15, TIMER_CH_0, 500-1); //比较寄存器的数值为499
   
    // 使能TIMER15
    timer_enable(TIMER15);
}
```

使用特权

评论回复
5
丙丁先生| | 2024-9-15 06:34 | 只看该作者
```c
int main(void) // 主函数入口
{
    int16_t i = 0; // 定义一个16位整数变量i并初始化为0
    FlagStatus breathe_flag = SET; // 定义一个标志位breathe_flag并设置为SET

    /* configure the GPIO ports */ // 配置GPIO端口
    gpio_config();

    /* configure the TIMER peripheral */ // 配置定时器外设
    timer_config();

    /* configure systick */ // 配置系统滴答定时器
    systick_config();

    while (1){ // 无限循环
        /* delay a time in milliseconds */ // 延时2毫秒
        delay_1ms(2);
        if (SET == breathe_flag){ // 如果breathe_flag为SET
             i = i + 10; // i增加10
        }else{
            i = i - 10; // i减少10
        }
        if(500 < i){ // 如果i大于500
            breathe_flag = RESET; // 将breathe_flag设置为RESET
        }
        if(0 >= i){ // 如果i小于等于0
            breathe_flag = SET; // 将breathe_flag设置为SET
        }
        /* configure TIMER channel output pulse value */ // 配置定时器通道输出脉冲值
        timer_channel_output_pulse_value_config(TIMER15,TIMER_CH_0,i);
    }
}
```

使用特权

评论回复
6
丙丁先生| | 2024-9-15 06:39 | 只看该作者
     gpio_af_set(GPIOB,GPIO_AF_2,GPIO_PIN_8);//端口复用为TIMER15_CH0模式
      
        gpio_mode_set(GPIOB, GPIO_MODE_AF, GPIO_PUPD_NONE, GPIO_PIN_8);
  gpio_output_options_set(GPIOB, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_8);
  gpio_bit_set(GPIOB, GPIO_PIN_8);

使用特权

评论回复
7
丙丁先生| | 2024-9-15 06:40 | 只看该作者
这段代码是用于配置GPIOB的第8个引脚(GPIO_PIN_8)为TIMER15_CH0模式。具体步骤如下:

1. 使用`gpio_af_set(GPIOB, GPIO_AF_2, GPIO_PIN_8)`将GPIOB的第8个引脚复用为TIMER15_CH0模式。这里的`GPIO_AF_2`表示复用的外设功能为TIMER15的通道0。

2. 使用`gpio_mode_set(GPIOB, GPIO_MODE_AF, GPIO_PUPD_NONE, GPIO_PIN_8)`设置GPIOB的第8个引脚的模式为复用功能模式(GPIO_MODE_AF),上拉下拉电阻设置为无(GPIO_PUPD_NONE)。

3. 使用`gpio_output_options_set(GPIOB, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_8)`设置GPIOB的第8个引脚的输出类型为推挽输出(GPIO_OTYPE_PP),输出速度为50MHz(GPIO_OSPEED_50MHZ)。

4. 使用`gpio_bit_set(GPIOB, GPIO_PIN_8)`将GPIOB的第8个引脚设置为高电平。

没有报错信息,看下硬件连接。

使用特权

评论回复
8
yuanshenqi| | 2024-9-16 16:12 | 只看该作者
3333333

使用特权

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

本版积分规则

6

主题

14

帖子

0

粉丝