GD32F103定时器使用内部时钟作为时钟源

#include "Timer0.h"
#include "LED.h"

void Timer_Interrupt_Initializtion(uint32_t timer_periph,uint16_t arr,uint16_t psc);

//函数功能:通用定时器0中断初始化
//这里时钟选择为APB1的2倍,而APB1为36M
//arr:自动重装值。
//psc:时钟预分频数
//Timer_Interrupt_Initializtion(TIMER0,50000,1080);//当arr=50000,psc=1080时,则为500ms,误差为10us;
void Timer_Interrupt_Initializtion(uint32_t timer_periph,uint16_t arr,uint16_t psc)
{
    timer_parameter_struct TimerParameterStruct;

    switch(timer_periph)
    {
        case TIMER0:
        rcu_periph_clock_enable(RCU_TIMER0);      //使能TIMER0的APB2外设时钟
          nvic_irq_enable(TIMER0_UP_IRQn, 2U, 0U);  //设置TIMER0_UP_IRQn的中断优先级,抢占优先级为2,子优先级为0
        break;
    case TIMER1:
            rcu_periph_clock_enable(RCU_TIMER1);
          nvic_irq_enable(TIMER1_IRQn, 2U, 0U);  //设置TIMER1_IRQn的中断优先级,抢占优先级为2,子优先级为0
          break;
    case TIMER2:
            rcu_periph_clock_enable(RCU_TIMER2);
          nvic_irq_enable(TIMER2_IRQn, 2U, 0U);  //设置TIMER2_IRQn的中断优先级,抢占优先级为2,子优先级为0
          break;
    case TIMER3:
            rcu_periph_clock_enable(RCU_TIMER3);
          nvic_irq_enable(TIMER3_IRQn, 2U, 0U);  //设置TIMER3_IRQn的中断优先级,抢占优先级为2,子优先级为0
          break;
    case TIMER4:
            rcu_periph_clock_enable(RCU_TIMER4);
          nvic_irq_enable(TIMER4_IRQn, 2U, 0U);  //设置TIMER4_IRQn的中断优先级,抢占优先级为2,子优先级为0
          break;
    case TIMER5:
            rcu_periph_clock_enable(RCU_TIMER5);
          nvic_irq_enable(TIMER5_IRQn, 2U, 0U);  //设置TIMER5_IRQn的中断优先级,抢占优先级为2,子优先级为0
          break;
    case TIMER6:
            rcu_periph_clock_enable(RCU_TIMER6);
          nvic_irq_enable(TIMER6_IRQn, 2U, 0U);  //设置TIMER6_IRQn的中断优先级,抢占优先级为2,子优先级为0
          break;
    default:
        break;
    }
    timer_deinit(timer_periph);                 //复位TIMERx

TIMERx配置开始
    TimerParameterStruct.period            = arr-1; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值
    TimerParameterStruct.prescaler         = psc-1; //设置用来作为TIMx时钟频率除数的预分频值(APB2时钟分频值)
    TimerParameterStruct.clockdivision     = TIMER_CKDIV_DIV1;   //设置时钟分母值为1
    //计算公式:arr*psc/108000000/1,当arr=250,psc=108时,则为0.25ms,误差为1us;
    TimerParameterStruct.counterdirection  = TIMER_COUNTER_UP;   //设置计数方向为"向上计数"
    TimerParameterStruct.alignedmode       = TIMER_COUNTER_EDGE; //设置为无中央对齐计数模式(边沿对齐模式)
    TimerParameterStruct.repetitioncounter = 0;                  //设置"重复计数次数"为0
    timer_init(timer_periph,&TimerParameterStruct);//根据TimerParameterStruct所指向的参数初始化TIMERx的时间基数单位
TIMERx配置结束

    timer_counter_value_config(timer_periph,0);//设置TIMERx的计数器初始值为0
    //timer_counter_read(timer_periph);//读取TIMERx的计数器值

  timer_auto_reload_shadow_enable(timer_periph);//使能TIMERx自动重装载

    timer_flag_clear(timer_periph,TIMER_FLAG_UP);               //清除"TIMERx更新标志位"
    timer_interrupt_flag_clear(timer_periph,TIMER_INT_FLAG_UP); //清除"TIMERx更新中断标志位"
    timer_interrupt_enable(timer_periph,TIMER_INT_UP);          //使能"TIMERx更新"产生中断

  timer_internal_clock_config(timer_periph);//设置"内部时钟"作为定时器时钟
    //timer_slave_mode_select(timer_periph,TIMER_SLAVE_MODE_DISABLE);
    //设置"关闭从模式",如果TIMER计数器使能,则预分频器直接由内部时钟驱动

    timer_enable(timer_periph);//TIMERx计数器使能,开始工作
}


//函数功能:TIMER0更新中断服务程序
void TIMER0_UP_IRQHandler(void)
{
    if( timer_interrupt_flag_get(TIMER0,TIMER_INT_FLAG_UP) )// 读取更新中断标志位
    {
        LED2_Toggle();
        timer_flag_clear(TIMER0,TIMER_FLAG_UP);               //清除"TIMER0更新标志位"
        timer_interrupt_flag_clear(TIMER0,TIMER_INT_FLAG_UP); //清除"更新中断标志位"
    }
}

 

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值