本篇文章来自极术社区与兆易创新组织的GD32F427开发板评测活动,更多开发板试用活动请关注极术社区网站。作者:申小林
先说一下我使用定时器1 的时候吧,最开始我以为定时器1是挂在APB1上的,随意按照惯性思维,定时器的时钟应该和APB1相等数据手册上说的APB1最大频率为50MHz,所以我单纯的以为定时器1 的输入时钟就是50MHz,我按照50MHz配置之后,设置灯闪的频率为1Hz,但是实际结果却是这个灯光太耀眼,闪得眼睛都快瞎了。于是就开始找问题,看到例程里面有一个配置选项,感觉很奇怪,以为就是简单的时钟选择,但是细读注释才发现一个是倍频选择,2倍或者四倍的选择。好吧,
踩坑证据1:数据手册和用户手册描述不一致
踩坑证据2:实际上不存在1倍频的选项,只能2倍频或者4倍频
好吧,这个不算坑的坑,我已经帮你们踩了,后面就靠你们自己了
下面上自己写的代码,定时器闪个灯
`#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,即表示为1ms
timer_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 ================================================/
`
主函数就不加上来了,初始化一下就好了。今天的分享就到这里。