| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135 |
- #include "counter.h"
- #include "gd32e23x.h"
- static uint32_t ic1value = 0, ic2value = 0;
- static uint32_t dutycycle = 0;
- static uint32_t frequency = 0;
- static uint32_t store_frequency = 0;
- static uint8_t data_valid = 0;
- static uint8_t has_data = 0;
- uint32_t counter_get_dutycycle()
- {
- return dutycycle;
- }
- uint32_t counter_get_frequency()
- {
- if(has_data == 1)
- {
- has_data = 0;
- return frequency;
- }else{
- frequency = 0;
- dutycycle = 0;
- return 0;
- }
- }
- void counter_set_store_frequency()
- {
- store_frequency = counter_get_frequency();
- }
- uint32_t counter_get_store_frequency()
- {
- return store_frequency;
- }
- void counter_timer_configuration(void)
- {
- /* TIMER2 configuration: PWM input mode ------------------------
- the external signal is connected to TIMER2 CH0 pin(PA6)
- the rising edge is used as active edge
- the TIMER2 CH0CV is used to compute the frequency value
- the TIMER2 CH1CV is used to compute the duty cycle value
- ------------------------------------------------------------ */
- timer_ic_parameter_struct timer_icinitpara;
- timer_parameter_struct timer_initpara;
- /* enable the TIMER clock */
- rcu_periph_clock_enable(RCU_TIMER2);
- /* deinit a TIMER */
- timer_deinit(TIMER2);
- /* initialize TIMER init parameter struct */
- timer_struct_para_init(&timer_initpara);
- /* TIMER2 configuration */
- timer_initpara.prescaler = 71;
- timer_initpara.alignedmode = TIMER_COUNTER_EDGE;
- timer_initpara.counterdirection = TIMER_COUNTER_UP;
- timer_initpara.period = 65535;
- timer_initpara.clockdivision = TIMER_CKDIV_DIV1;
- timer_init(TIMER2, &timer_initpara);
- /* TIMER2 configuration */
- /* initialize TIMER channel input parameter struct */
- timer_channel_input_struct_para_init(&timer_icinitpara);
- /* TIMER2 CH0 PWM 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_pwm_capture_config(TIMER2, TIMER_CH_0, &timer_icinitpara);
- /* slave mode selection: TIMER2 */
- timer_input_trigger_source_select(TIMER2, TIMER_SMCFG_TRGSEL_CI0FE0);
- /* select TIMER slave mode: restart mode */
- timer_slave_mode_select(TIMER2, TIMER_SLAVE_MODE_RESTART);
- /* select the master slave mode */
- timer_master_slave_mode_config(TIMER2, TIMER_MASTER_SLAVE_MODE_ENABLE);
- /* auto-reload preload enable */
- timer_auto_reload_shadow_enable(TIMER2);
- /* clear channel 0 interrupt bit */
- timer_interrupt_flag_clear(TIMER2, TIMER_INT_FLAG_CH0);
- /* channel 0 interrupt enable */
- timer_interrupt_enable(TIMER2, TIMER_INT_CH0);
- /* TIMER2 counter enable */
- timer_enable(TIMER2);
- }
- void counter_init()
- {
- /*configure PA6(TIMER2 CH0) as alternate function*/
- gpio_mode_set(GPIOA, GPIO_MODE_AF, GPIO_PUPD_NONE, GPIO_PIN_6);
- gpio_output_options_set(GPIOA, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ,GPIO_PIN_6);
- gpio_af_set(GPIOA, GPIO_AF_1, GPIO_PIN_6);
- nvic_irq_enable(TIMER2_IRQn, 0);
- counter_timer_configuration();
- }
- void counter_timer_handler()
- {
- if(SET == timer_interrupt_flag_get(TIMER2, TIMER_INT_FLAG_CH0)){
- /* clear channel 0 interrupt bit */
- timer_interrupt_flag_clear(TIMER2, TIMER_INT_FLAG_CH0);
- /* read channel 0 capture value */
- ic1value = timer_channel_capture_value_register_read(TIMER2, TIMER_CH_0) + 1;
- if(0 != ic1value){
- /* read channel 1 capture value */
- ic2value = timer_channel_capture_value_register_read(TIMER2, TIMER_CH_1) + 1;
- /* calculate the duty cycle value */
- dutycycle = (ic2value * 10000.0) / ic1value;
- /* calculate the frequency value */
- frequency = 100000000U / ic1value;
- /* output calculation value */
- if(0 != data_valid)
- {
- has_data = 1;
- }else{
- /* discard the first data */
- /* the first number is inaccurate */
- data_valid = 1;
- }
- }else{
- /* clear calculation value */
- dutycycle = 0;
- frequency = 0;
- }
- }
- }
|