GD32F30X单片机开发 — 定时器中断
配置
开启定时器2(通用定时器),1s产生一次中断
1. 初始化
- 使能TIMER2时钟
- TIMER2去初始化
- 初始化TIMER相关结构体默认值参数(非必要)
- 设置:周期值,预分频系数,计数模式,对齐模式,采样分频
- 使能TIMER2
- 中断设置TIMER2_IRQn
- 使能更新中断
定时周期 = 系统主频 / 预分频系数 / 周期值 / 采样分频
例如:72MHz (72000000) / 7200 / 10000 / 1 = 1Hz = 1s
2. 定时器中断服务函数
- 判断中断标志是否置位
- 清除中断标志位
代码
void TIM_Init(void)
{
rcu_periph_clock_enable(RCU_TIMER2); /* 使能定时器2时钟 */
timer_deinit(TIMER2); /* 定时器2去初始化配置 */
timer_parameter_struct timer_initpara;
timer_struct_para_init(&timer_initpara); /* 初始化TIMER相关结构体默认值参数 */
timer_initpara.period = 10000; /* 自动重装载寄存器周期的值(计数值) */
/*
定时周期 = 系统主频 / 预分频系数 / 周期值 / 采样分频
例如:72MHz (72000000) / 7200 / 10000 / 1 = 1Hz = 1s
*/
timer_initpara.alignedmode = TIMER_COUNTER_EDGE; /* 对齐模式 */
timer_initpara.prescaler = (7200 - 1); /* 时钟预分频数 */
timer_initpara.clockdivision = TIMER_CKDIV_DIV1; /* 采样分频 */
timer_initpara.counterdirection = TIMER_COUNTER_UP; /* 向上计数模式 */
timer_init(TIMER2,&timer_initpara);
timer_enable(TIMER2); /* 使能定时器2 */
nvic_irq_enable(TIMER2_IRQn, 1, 3); /* TIMER中断设置,抢占优先级0,子优先级3 */
timer_interrupt_enable(TIMER2,TIMER_INT_UP); /* 使能更新中断 */
}
/* 定时器2中断服务函数 */
void TIMER2_IRQHandler(void)
{
static INT16U cnt = 0;
if(timer_interrupt_flag_get(TIMER2, TIMER_INT_FLAG_UP)!=RESET)
{
timer_interrupt_flag_clear(TIMER2, TIMER_INT_FLAG_UP);
DEBUG("cnt value = %u\n", cnt++);
}
}