以timer1为例,实现简单的定时频率为10KHZ和间隔100us触发中断。
从芯片规格书得知,timer1在APB1总线上,外设时钟为最大60MHZ限制,而芯片的系统时钟是120MHZ,说明这里AHB-->APB1使用了2分频,根据规格书描述,分频不为1,timer1的时钟频率为60MHZ*2=120MHZ.这里明确时钟源频率就好办了,按以下步骤配置即可:
1、使能timer1时钟
rcu_periph_clock_enable(RCU_TIMER1);
2、配置定时器参数,这里通过一个结构体来配置
timer_parameter_struct timer_initpara;
timer_initpara.clockdivision = TIMER_CKDIV_DIV1;
timer_initpara.prescaler = 119;//time1-APB1(60MHZ)--->time1clk(60MHZ*2) 1MHZ
timer_initpara.period = 99;//99-10khz---100US,999-1KHZ---1MS
timer_initpara.alignedmode = TIMER_COUNTER_EDGE;//向上/向下计数,通过counterdirection指定。
timer_initpara.counterdirection = TIMER_COUNTER_UP;//当alignedmode = TIMER_COUNTER_EDGE时,才设置有效果。
timer_initpara.repetitioncounter = 0;//表示在0+1周期更新计数寄存器的值。
timer_init(TIMER1,&timer_initpara);
3、使能中断,这里分timer1 的全局中断和子中断
nvic_irq_enable(TIMER1_IRQn,3,3);
timer_interrupt_enable(TIMER1,TIMER_INT_UP);
4、使能定时器,这里其实就是开始计数的意思
timer_enable(TIMER1);
5、编写中断函数逻辑
extern uint32_t tick_1msCnt;
void TIMER1_IRQHandler(void)
{
timer_interrupt_flag_clear(TIMER1,TIMER_INT_FLAG_UP);
tick_1msCnt++;
}
以下提供全部代码,并测试,验证30S的时间是否准确。
#include "gd32f30x.h"
#include "gd32f30x_eval.h"
#include "systick.h"
#define GD32F30X_CL
uint32_t tick_1msCnt;
/*
*设置timer1 100us中断一次
*/
void timer1_config()
{
timer_parameter_struct timer_initpara;
timer_initpara.clockdivision = TIMER_CKDIV_DIV1;
timer_initpara.prescaler = 119;//time1-APB1(60MHZ)--->time1clk(60MHZ*2) 1MHZ
timer_initpara.period = 99;//99-10khz---100US,999-1KHZ---1MS
timer_initpara.alignedmode = TIMER_COUNTER_EDGE;//向上/向下计数,通过counterdirection指定。
timer_initpara.counterdirection = TIMER_COUNTER_UP;//当alignedmode = TIMER_COUNTER_EDGE时,才设置有效果。
timer_initpara.repetitioncounter = 0;//表示在0+1周期更新计数寄存器的值。
timer_init(TIMER1,&timer_initpara);
nvic_irq_enable(TIMER1_IRQn,3,3);
timer_interrupt_enable(TIMER1,TIMER_INT_UP);
timer_enable(TIMER1);
}
void timer_config(void)
{
rcu_periph_clock_enable(RCU_TIMER1);
timer1_config();//100us一次中断
}
int main(void)
{
systick_config();
timer_config();
while (1)
{
if(tick_1msCnt >=300000)
{
tick_1msCnt = 0;
}
}
}