> 文档中心 > 【GD32F427开发板试用】-03-定时器1 的不算坑的坑和时钟设置

【GD32F427开发板试用】-03-定时器1 的不算坑的坑和时钟设置


本篇文章来自极术社区与兆易创新组织的GD32F427开发板评测活动,更多开发板试用活动请关注极术社区网站。作者:申小林

先说一下我使用定时器1 的时候吧,最开始我以为定时器1是挂在APB1上的,随意按照惯性思维,定时器的时钟应该和APB1相等数据手册上说的APB1最大频率为50MHz,所以我单纯的以为定时器1 的输入时钟就是50MHz,我按照50MHz配置之后,设置灯闪的频率为1Hz,但是实际结果却是这个灯光太耀眼,闪得眼睛都快瞎了。于是就开始找问题,看到例程里面有一个配置选项,感觉很奇怪,以为就是简单的时钟选择,但是细读注释才发现一个是倍频选择,2倍或者四倍的选择。好吧,
踩坑证据1:数据手册和用户手册描述不一致

踩坑证据2:实际上不存在1倍频的选项,只能2倍频或者4倍频

【GD32F427开发板试用】-03-定时器1 的不算坑的坑和时钟设置

【GD32F427开发板试用】-03-定时器1 的不算坑的坑和时钟设置

好吧,这个不算坑的坑,我已经帮你们踩了,后面就靠你们自己了
下面上自己写的代码,定时器闪个灯
`#include “DRV_TIM1.h”

void Time1_Init(void)
{

timer_parameter_struct timer_initpara;  //--声明结构体rcu_periph_clock_enable(RCU_TIMER1);    //--使能定时器时钟

// rcu_timer_clock_prescaler_config(RCU_TIMER_PSC_MUL2); //–选择时钟源-- 倍频选择–

timer_struct_para_init(&timer_initpara);timer_deinit(TIMER1);   /* TIMER1 configuration */timer_initpara.prescaler  = 119;//--APB 1 最大时钟是60M,但是时钟输入有倍频设置,上面倍频选择的是2倍频,所以实际时钟为 120MHz,所以这里设置为120分频-即为1M时钟--向上计数1000,即表示为1mstimer_initpara.alignedmode= TIMER_COUNTER_EDGE;timer_initpara.counterdirection  = TIMER_COUNTER_UP;timer_initpara.period     = 1000;timer_initpara.clockdivision     = TIMER_CKDIV_DIV1;timer_initpara.repetitioncounter = 0;timer_init(TIMER1,&timer_initpara);/* auto-reload preload enable */timer_auto_reload_shadow_enable(TIMER1);/* TIMER1 enable */timer_enable(TIMER1);nvic_irq_enable(TIMER1_IRQn, 0, 1);  //--设置中断优先级timer_interrupt_enable(TIMER1,TIMER_INT_UP);   //--设置向上计数中断使能--

}
unsigned int DataCount=0;
//–中断响应函数----
void TIMER1_IRQHandler(void)
{

if(RESET!=timer_interrupt_flag_get(TIMER1,TIMER_INT_FLAG_UP)){    timer_interrupt_flag_clear( TIMER1 ,TIMER_INT_FLAG_UP);    DataCount++;    if(DataCount==500)    {gpio_bit_set(GPIOC, GPIO_PIN_6);    }    if(DataCount==1000)    { DataCount=0; gpio_bit_reset(GPIOC, GPIO_PIN_6);    }    }

}

/======================= end of the files ================================================/

`
主函数就不加上来了,初始化一下就好了。今天的分享就到这里。

2020WEB前端记录