打印
[研电赛技术支持]

GD32F470 TimerBase

[复制链接]
1272|10
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
Zhiniaocun|  楼主 | 2025-4-12 07:17 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
//timer.c

#include "timer.h"

void timer_base_init(uint32_t x100ns)
{
  timer_parameter_struct timer_initpara;

  /* enable the peripherals clock */
  rcu_periph_clock_enable(USER_TIMER1_CLK);                //120M
       
  /* deinit a TIMER */
  timer_deinit(USER_TIMER1);
  /* initialize TIMER init parameter struct */
  timer_struct_para_init(&timer_initpara);
  /* TIMER2 configuration */
  timer_initpara.prescaler         = 12 - 1;
  timer_initpara.alignedmode       = TIMER_COUNTER_EDGE;
  timer_initpara.counterdirection  = TIMER_COUNTER_UP;
  timer_initpara.period            = x100ns - 1;
  timer_initpara.clockdivision     = TIMER_CKDIV_DIV1;
  timer_init(USER_TIMER1, &timer_initpara);

  /* clear channel 0 interrupt bit */
  timer_interrupt_flag_clear(USER_TIMER1, TIMER_INT_FLAG_UP);
  /* enable the TIMER interrupt */
  timer_interrupt_enable(USER_TIMER1, TIMER_INT_UP);
  /* enable a TIMER */
  timer_enable(USER_TIMER1);

  nvic_irq_enable(USER_TIMER1_IRQ, 0, 0);
}

void USER_TIMER1_IRQHandler(void)
{
  if(SET == timer_interrupt_flag_get(USER_TIMER1, TIMER_INT_UP)) {
    /* clear update interrupt bit */
    timer_interrupt_flag_clear(USER_TIMER1, TIMER_INT_UP);
    {
      tp1_tog();
    }   
  }  
}



//timer.h

#ifndef __TIMER_H_
#define __TIMER_H_

#include "includes.h"

#define USER_TIMER1               TIMER1
#define USER_TIMER1_CLK           RCU_TIMER1
#define USER_TIMER1_IRQ           TIMER1_IRQn
#define USER_TIMER1_IRQHandler    TIMER1_IRQHandler

#define        T1US                10
#define        T1MS                (T1US*1000)
#define        T10MS                (T1MS*10)


void timer_base_init(uint32_t x100ns);

#endif

————————————————

                            版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

原文链接:https://blog.csdn.net/lljss1980/article/details/143107425

使用特权

评论回复
沙发
磨砂| | 2025-5-8 08:52 | 只看该作者
系统时钟通过外部晶振和PLL配置生成,例如200MHz或240MHz

使用特权

评论回复
板凳
晓伍| | 2025-5-8 11:04 | 只看该作者
APB1总线默认分频为4(CK_APB1 = CK_SYS / 4)。
APB2总线默认分频为2(CK_APB2 = CK_SYS / 2)。

使用特权

评论回复
地板
八层楼| | 2025-5-8 13:28 | 只看该作者
定时器的基础配置包括预分频器和自动重装载寄存器,用于确定定时器的计数频率和周期。

使用特权

评论回复
5
观海| | 2025-5-8 15:58 | 只看该作者
#include "gd32f4xx.h"
#include "gd32f4xx_timer.h"

void TIMx_Init(uint32_t arr, uint32_t psc) {
    timer_parameter_struct initpara;

    // 使能定时器时钟
    rcu_periph_clock_enable(RCU_TIMER1);

    // 配置定时器时钟源(TIMERSEL = 1,即CK_TIMERx = CK_SYS)
    rcu_timer_clock_prescaler_config(RCU_TIMER_PSC_MUL4);

    // 初始化定时器参数结构体
    timer_struct_para_init(&initpara);

    // 配置定时器参数
    initpara.prescaler = psc;              // 预分频值
    initpara.period = arr;                 // 自动重装载值
    initpara.alignedmode = TIMER_COUNTER_EDGE; // 对齐模式
    initpara.counterdirection = TIMER_COUNTER_UP; // 向上计数
    initpara.clockdivision = TIMER_CKDIV_DIV1;   // 时钟分频
    initpara.repetitioncounter = 0;       // 重复计数器

    // 初始化定时器
    timer_init(TIMER1, &initpara);

    // 使能自动重载预装载
    timer_auto_reload_shadow_enable(TIMER1);

    // 使能溢出中断
    timer_interrupt_enable(TIMER1, TIMER_INT_UP);

    // 配置中断优先级并使能中断
    nvic_irq_enable(TIMER1_IRQn, 1, 1);

    // 启动定时器
    timer_enable(TIMER1);
}


使用特权

评论回复
6
guanjiaer| | 2025-5-8 18:36 | 只看该作者
需根据系统时钟和APB分频计算实际定时器时钟频率

使用特权

评论回复
7
heimaojingzhang| | 2025-5-8 20:59 | 只看该作者
可以结合定时器输出比较功能生成PWM信号

使用特权

评论回复
8
keaibukelian| | 2025-5-9 08:44 | 只看该作者
该功能可以记录外部事件发生的时间间隔

使用特权

评论回复
9
paotangsan| | 2025-5-9 11:08 | 只看该作者
使用公式[size=0.875](prescaler + 1) * (period + 1) / CK_TIMERx计算定时时间

使用特权

评论回复
10
renzheshengui| | 2025-5-9 13:31 | 只看该作者
GD32F470的定时器可以实现精确的时间控制和任务调度

使用特权

评论回复
11
wowu| | 2025-5-9 16:06 | 只看该作者
这是一个基础的定时器吗?和高级定时器的区别是什么呢

使用特权

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

本版积分规则

35

主题

140

帖子

1

粉丝