/*! \file main.c \brief TIMER2 input capture demo */ /* Copyright (C) 2017 GigaDevice 2017-06-06, V1.0.0, firmware for GD32F3x0 */ #include "gd32f3x0.h" #include #include "gd32f3x0_eval.h" void gpio_configuration(void); void timer_configuration(void); void nvic_configuration(void); int fputc(int ch, FILE *f); /* retarget the C library printf function to the USART */ int fputc(int ch, FILE *f) { usart_data_transmit(EVAL_COM1, (uint8_t) ch); while (RESET == usart_flag_get(EVAL_COM1,USART_FLAG_TC)); return ch; } /*! \brief configure the GPIO ports \param[in] none \param[out] none \retval none */ void gpio_configuration(void) { rcu_periph_clock_enable(RCU_GPIOB); /*configure PB4 (TIMER2 CH0) as alternate function*/ gpio_mode_set(GPIOB, GPIO_MODE_AF, GPIO_PUPD_NONE, GPIO_PIN_4); gpio_output_options_set(GPIOB, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ,GPIO_PIN_4); gpio_af_set(GPIOB, GPIO_AF_1, GPIO_PIN_4); } /*! \brief configure the nested vectored interrupt controller \param[in] none \param[out] none \retval none */ void nvic_configuration(void) { nvic_priority_group_set(NVIC_PRIGROUP_PRE1_SUB3); nvic_irq_enable(TIMER2_IRQn, 1, 1); } /*! \brief configure the TIMER peripheral \param[in] none \param[out] none \retval none */ void timer_configuration(void) { /* TIMER2 configuration: input capture mode ------------------- the external signal is connected to TIMER2 CH0 pin (PB4) the rising edge is used as active edge the TIMER2 CH0CV is used to compute the frequency value ------------------------------------------------------------ */ timer_ic_parameter_struct timer_icinitpara; timer_parameter_struct timer_initpara; rcu_periph_clock_enable(RCU_TIMER2); timer_deinit(TIMER2); /* TIMER2 configuration */ #ifdef GD32F330 timer_initpara.prescaler = 41999; #endif /* GD32F330 */ #ifdef GD32F350 timer_initpara.prescaler = 53999; #endif /* GD32F350 */ timer_initpara.alignedmode = TIMER_COUNTER_EDGE; timer_initpara.counterdirection = TIMER_COUNTER_UP; timer_initpara.period = 65535; timer_initpara.clockdivision = TIMER_CKDIV_DIV1; timer_initpara.repetitioncounter = 0; timer_init(TIMER2,&timer_initpara); /* TIMER2 configuration */ /* TIMER2 CH0 input capture configuration */ timer_icinitpara.icpolarity = TIMER_IC_POLARITY_RISING; timer_icinitpara.icselection = TIMER_IC_SELECTION_DIRECTTI; timer_icinitpara.icprescaler = TIMER_IC_PSC_DIV1; timer_icinitpara.icfilter = 0x0; timer_input_capture_config(TIMER2,TIMER_CH_0,&timer_icinitpara); /* auto-reload preload enable */ timer_auto_reload_shadow_enable(TIMER2); /* clear channel 0 interrupt bit */ timer_interrupt_flag_clear(TIMER2,TIMER_INT_CH0); /* channel 0 interrupt enable */ timer_interrupt_enable(TIMER2,TIMER_INT_CH0); /* TIMER2 counter enable */ timer_enable(TIMER2); } /*! \brief main function \param[in] none \param[out] none \retval none */ int main(void) { gpio_configuration(); gd_eval_com_init(EVAL_COM1); nvic_configuration(); timer_configuration(); while (1); }