GD32fxx+TIM定时器(2)
定时器基本使用
单片机中的定时器可以用于测量时间、脉冲计数、PWM输出、延迟函数、周期性任务等。它可以帮助我们 实现各种不同的功能,如等待外部设备响应、数据传输完成等。下面就是定时器的一些具体实现。
环境:gd32f107vct6+TIMER1
延时
初始化定时器,解释在上文已介绍
timer_parameter_struct initpara;
rcu_periph_clock_enable(RCU_TIMER1);
timer_deinit(TIMER1);
initpara.alignedmode = TIMER_COUNTER_EDGE;
initpara.clockdivision = TIMER_CKDIV_DIV1;
initpara.counterdirection = TIMER_COUNTER_UP;
initpara.period = 65535;
initpara.prescaler = 107;
initpara.repetitioncounter = 0;
timer_init(TIMER1,&initpara);
timer_counter_value_config(TIMER1, 0);
timer_enable(TIMER1);
延时函数
void DelayUSeconds(unsigned int nbrOfUs) //延时微秒
{
timer_counter_value_config(TIMER1,0);
while(timer_counter_read(TIMER1) < nbrOfUs);
}
void DelayMicroSeconds(unsigned int nbrOfms) //延时毫秒
{
for(int i=0;i<nbrOfms;i++)
{
DelayUSeconds(1000);
}
}
定时中断
初始化
timer_parameter_struct initpara;
rcu_periph_clock_enable(RCU_TIMER1);
timer_deinit(TIMER1);
initpara.alignedmode = TIMER_COUNTER_EDGE;
initpara.clockdivision = TIMER_CKDIV_DIV1;
initpara.counterdirection = TIMER_COUNTER_UP;
initpara.period = 999;//配置1ms进入一次中断
initpara.prescaler = 107;
initpara.repetitioncounter = 0;
timer_init(TIMER1,&initpara);
timer_counter_value_config(TIMER1, 0);
nvic_irq_enable(TIMER1_IRQn,1,1);//中断优先级分组
timer_interrupt_enable(TIMER1,TIMER_INT_UP);//开启中断
timer_enable(TIMER1);
中断入口函数
中断要快进快出。里面不要有延时,浮点数计算等比较耗时间的程序。
void TIMER1_IRQHandler(void)
{
if(SET == timer_interrupt_flag_get(TIMER2,TIMER_INT_FLAG_UP))
{
timer_interrupt_flag_clear(TIMER2,TIMER_INT_FLAG_UP);
***********************;
***********************;//自己想做的事
}
}
总结
其它用法会在以后整理出来,如果有错误的地方,欢迎指正,一起学习。