GD32F350定时器有TIMER0~TIMER5,绝对够用,我是用的是TIMER0,向上计数模式
在这种模式,计数器的计数方向是向上计数。计数器从0开始向上连续计数到自动加载值(定 义在TIMERx_CAR寄存器中),一旦计数器计数到自动加载值,会重新从0开始向上计数。如果 设置了重复计数器,在(TIMERx_CREP+1)次上溢后产生更新事件,否则在每次上溢时都会产 生更新事件。在向上计数模式中,TIMERx_CTL0寄存器中的计数方向控制位DIR应该被设置成 0。
当通过TIMERx_SWEVG寄存器的UPG位置1来设置更新事件时,计数值会被清0,并产生更新 事件。
如果TIMERx_CTL0寄存器的UPDIS置1,则禁止更新事件。
当发生更新事件时,所有的寄存器(重复计数器,自动重载寄存器,预分频寄存器)都将被更新。
下面这些图给出了一些例子,当TIMERx_CAR=0x63时,计数器在不同预分频因子下的行为。
- void nvic_config(void)
- {
- nvic_priority_group_set(NVIC_PRIGROUP_PRE2_SUB2);
- nvic_irq_enable(TIMER0_BRK_UP_TRG_COM_IRQn, 0, 1);
- }
- /*!
- \brief configure the TIMER peripheral
- \param[in] none
- \param[out] none
- \retval none
- */
- void timer_config(void)
- {
- /* -----------------------------------------------------------------------
- TIMER0 configuration:
- generate 3 complementary PWM signal.
- TIMER0CLK is fixed to systemcoreclock, the TIMER0 prescaler is equal to 84(GD32F330)
- or 107(GD32F350) so the TIMER0 counter clock used is 1MHz.
- insert a dead time equal to 1us
- configure the break feature, active at high level, and using the automatic
- output enable feature.
- use the locking parameters level0.
- ----------------------------------------------------------------------- */
- timer_parameter_struct timer_initpara;
- rcu_periph_clock_enable(RCU_TIMER0);
- timer_deinit(TIMER0);
- timer_initpara.prescaler = 4000/50-1;
- timer_initpara.alignedmode = TIMER_COUNTER_EDGE;
- timer_initpara.counterdirection = TIMER_COUNTER_UP;
- timer_initpara.period = 270/5;
- timer_initpara.clockdivision = TIMER_CKDIV_DIV1;
- // timer_initpara.repetitioncounter = 0;
- timer_init(TIMER0,&timer_initpara);
- /* TIMER0 channel control update interrupt enable */
- timer_interrupt_enable(TIMER0,TIMER_INT_UP);
- /* TIMER0 counter enable */
- timer_enable(TIMER0);
- }
采用内部时钟源108MHz,定时4ms,定时中断如下
- extern uint16_t Timer_Count;
- extern bool Timer_flag;
- void TIMER0_BRK_UP_TRG_COM_IRQHandler(void)
- {
- timer_interrupt_flag_clear(TIMER0, TIMER_INT_FLAG_UP);
- Timer_Count++;
- if(Timer_Count==1)
- {
- Timer_Count = 0;
- Timer_flag = 1;
- // printf("Timer0\n");
- }
- }
使用内部时钟源,时间久了,时间会便宜一点,下次我自己焊接外部晶振8MHz,获取高精度的定时器,敬请期待