GD32F103- 定时器中断实验

一、通用定时器介绍

1.1、GD32F10x中定时器一共分为五种类型

1.2、下面我们来介绍通用定时器L0

1.2.1、通用定时器L0(定时器1/2/3/4)每个定时器都有四个通道,每个通道都支持输入捕获,输出比较,产生PWM信号控制电机和电源管理。通用定时器L0计数器是16位无符号计数器。

定时器和定时器之间是相互独立,但是他们可以被同步在一起形成一个更大的定时器,这些定时器的计数器一致地增加。

1.2.2、主要特征

总通道数:4个;

计数器宽度:16位;

时钟源可选:内部时钟,内部触发,外部输入,外部触发;

多种计数模式:向上计数,向下计数和中央对齐计数;

正交编码器接口:被用来追踪运动和分辨选择方向和位置;

霍尔传感器接口:用来做三相电机控制;

可编程的预分频器:16位,运行时可以被改变;

每个通道可配置:输入捕获模式,输出比较模式,可编程的PWM模式,单脉冲模式;

自动重装载功能;

中断输出和DMA请求:更新事件,触发事件,比较/捕获事件;

多个定时器的菊型连接使得一个定时器可以同时启动多个定时器;

定时器的同步运行被选择的定时器在同一个时钟周期开始计数;

定时器主-从管理。

1.2.3、结构框图

图中1:4个输入通道,用于接收外部信号

图中2:4个输出通道,定时器输出引脚

CK_TIMER:计数器的时钟输入,也就是从(APB1过来的时钟)

TIMERx_ETI:外部触发输入信号源,

TIMERx_CH0~3:计数器模块的输出信号经过输出屏蔽和极性控制,比较模式/PWM等多种模式下输出信号的产生模块处理后得到的额定通道输出信号。

二、寄存器介绍

2.1、参考GD32F10x用户手册

下载地址:https://blog.csdn.net/weixin_44501991/article/details/143715172?spm=1001.2014.3001.5502

三、函数汇总

四、程序编写

程序实现的功能是,每隔一段时间使LED翻转

4.1、TIMER2_Init初始化编写

//psc是预分频系数,arr是计数
//定时器周期=系统主频/预分频系数/周期值
//          =72MHz/psc/arr
void TIMER2_Init(uint16_t psc,uint16_t arr)
{
    timer_parameter_struct timer_init_struct;
    rcu_periph_clock_enable(RCU_TIMER2);//使能TIMER2定时器

   

    timer_deinit(TIMER2);      //复位外设TIMERx

    timer_init_struct.prescaler      = psc;//设置分频系数
    timer_init_struct.period         = arr;//自动重装载值
    timer_init_struct.alignedmode    = TIMER_COUNTER_EDGE;//对齐方式
    timer_init_struct.clockdivision  = TIMER_CKDIV_DIV1;//时钟分频因子
    timer_init_struct.counterdirection = TIMER_COUNTER_UP;//向上计数
    timer_init(TIMER2,&timer_init_struct);

   

    timer_counter_value_config(TIMER2,0);//配置外设TIMERx的计数值
    timer_enable(TIMER2);//使能定时器

   

    nvic_priority_group_set(NVIC_PRIGROUP_PRE2_SUB2);//设置优先级组,
    nvic_irq_enable(TIMER2_IRQn,2,0);//使能优先级中断,并配置抢占和响应优先级
    timer_interrupt_enable(TIMER2,TIMER_INT_UP);//使能更新中断
}

4.2、定时器中断服务函数编写

bit_status temp=SET;
void TIMER2_IRQHandler(void)
{
    if(RESET != timer_interrupt_flag_get(TIMER2,TIMER_INT_FLAG_UP))//判断是否获取TIMER2外设中断标志
    {
        if(SET == temp)
        {
            temp=RESET;
        }
        else
        {
            temp=SET;
        }
        gpio_bit_write(GPIOA,GPIO_PIN_4,temp);
        timer_interrupt_flag_clear(TIMER2,TIMER_INT_FLAG_UP);//清除TIMER2外设中断标志
    }
}

4.3、主函数编写

int main(void)
{
    SystemClock_Config();//系统时钟配置
    systick_config();//systick配置

    LED_Init();
    TIMER2_Init(7200-1,10000-1);
    while(1)
    {
        
    }

    return 0;
}

### 配置GD32定时器中断 #### 中断配置概述 在GD32微控制器中,定时器中断的配置涉及多个步骤,包括使能时钟、初始化定时器参数以及设置相应的中断服务程序。通过合理配置这些组件可以实现精确的时间控制和事件响应[^1]。 #### 初始化定时器并启用中断 为了启动一个具有特定时间间隔触发功能的定时器,在完成基本设定之后还需要开启更新中断(Update Interrupt)。这通常是在完成了计数模式的选择、预分频系数(PSC)与自动重装载值(ARR)定义等工作后的一步操作。当定时器达到其上限值时会触发一次溢出事件从而激活该类型的IRQ请求[^4]。 #### 清除标志位防止误触 值得注意的是,在某些情况下可能会遇到定时器一被初始化就立刻跳转到对应的ISR (Interrupt Service Routine),这是因为未清除之前可能存在的状态标记所引起的异常行为;因此建议每次重新加载或改变工作方式前都调用`timer_interrupt_flag_clear()`函数来清理相关联的状态指示符以确保正常运作[^3]。 #### 示例代码展示如何创建每毫秒发生一次的定时器中断: ```c #include "gd32f30x.h" void timer_init(void){ rcu_periph_clock_enable(RCU_TIMER13); /* 使能TIMER13外围设备时钟 */ timer_deinit(TIMER13); // 设置定时器为向上计数模式, 自动重载, 不允许缓冲寄存器写入 timer_parameter_struct timer_initpara; timer_initpara.prescaler = 89; // APB1=60Mhz/90=666KHz timer_initpara.alignedmode = TIMER_COUNTER_EDGE; timer_initpara.counterdirection = TIMER_COUNTER_UP; timer_initpara.period = 665; // ARR=(期望延时us*PCLK1)/(Prescaler+1)-1 timer_initpara.clockdivision = TIMER_CKDIV_DIV1; timer_initpara.repetitioncounter = 0; timer_init(TIMER13,&timer_initpara); nvic_irq_enable(TIMER13_IRQn, 0, 0); // 开启NVIC中的TIM13中断通道 timer_interrupt_flag_clear(TIMER13,TIMER_INT_FLAG_UPDATE); // 清楚任何现存的更新中断标志 timer_interrupt_enable(TIMER13,TIMER_INT_UPDATE); // 启用更新中断源 } // 定义中断处理函数 void TIMER13_IRQHandler(void){ if(timer_interrupt_flag_get(TIMER13,TIMER_INT_FLAG_UPDATE)!= RESET){ // 如果确实是由于更新而产生的中断,则执行下面的操作 // 插入您的应用程序逻辑此处... timer_interrupt_flag_clear(TIMER13,TIMER_INT_FLAG_UPDATE);// 处理完毕后再次清零此标志位 } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值