GD32的timer资源还是挺丰富的,后续用到的只涉及到定时器的基本功能。就挑选一个通用定时器timer1来试试。
使用timer1来做一个1s触发中断的功能。
先看timer1的时钟:
CK_APB1最大是54Mhz 那么 apb1 prescaler 采用2分频, timer1,2,5,13 为 apb1 prescaler / 2 那么应该可以理解为CK_TIMERx为108Mhz。
再进一步配置定时器完成1s中断:
- void timer1_init()
- {
- timer_parameter_struct timer_parameter =
- {
- .prescaler = 2160 - 1,
- .alignedmode = TIMER_COUNTER_EDGE,
- .counterdirection = TIMER_COUNTER_UP,
- .period = 50000,
- .clockdivision = TIMER_CKDIV_DIV1,
- };
- timer_init(TIMER1, &timer_parameter);
-
- timer_interrupt_enable(TIMER1, TIMER_INT_UP);
- nvic_irq_enable(TIMER1_IRQn, 0, 2);
-
- timer_enable(TIMER1);
- }
中断服务函数:
- void TIMER1_IRQHandler()
- {
- uart1_write((uint8_t *)"liklon gd32f350\n\r", 17);
- timer_interrupt_flag_clear(TIMER1, TIMER_INT_FLAG_UP);
- }
在中断服务函数里一定要清中断标志。
1s相差3ms左右。