[研电赛技术支持] GD32F470 TimerBase

[复制链接]
 楼主| 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 | 显示全部楼层
定时器的基础配置包括预分频器和自动重装载寄存器,用于确定定时器的计数频率和周期。
观海 发表于 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);
}


guanjiaer 发表于 2025-5-8 18:36 | 显示全部楼层
需根据系统时钟和APB分频计算实际定时器时钟频率
heimaojingzhang 发表于 2025-5-8 20:59 | 显示全部楼层
可以结合定时器输出比较功能生成PWM信号
keaibukelian 发表于 2025-5-9 08:44 | 显示全部楼层
该功能可以记录外部事件发生的时间间隔
paotangsan 发表于 2025-5-9 11:08 | 显示全部楼层
使用公式[size=0.875](prescaler + 1) * (period + 1) / CK_TIMERx计算定时时间
renzheshengui 发表于 2025-5-9 13:31 | 显示全部楼层
GD32F470的定时器可以实现精确的时间控制和任务调度
wowu 发表于 2025-5-9 16:06 | 显示全部楼层
这是一个基础的定时器吗?和高级定时器的区别是什么呢
您需要登录后才可以回帖 登录 | 注册

本版积分规则

50

主题

225

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部

50

主题

225

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部